新多渠道包生成工具Walle详解

前言

在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2,它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未授权APK文件的更改提供更多保护,在默认情况下,Android Gradle 2.2.0插件会使用APK Signature Scheme v2和传统签名方案来签署你的应用(可通过v2SigningEnabled false关闭)。APK Signature Scheme v2导致之前快速生成渠道包的方式(如:美团Android自动化之旅—生成渠道包)已经行不通了,至于为什么行不通了在这篇文章中(Android 新一代多渠道打包神器)能找到答案,在此便不再赘述。目前针对APK Signature Scheme v2快速生成渠道包的市面上的解决方案有(两者的实现原理都一样,本文主要介绍前者):

Gradle插件使用方式

1. 配置build.gradle
在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:

buildscript {
    dependencies {
        classpath 'com.meituan.android.walle:plugin:1.1.2'
    }
}

并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR

apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.2'
}

2. 配置插件

walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

配置项具体解释:

  • apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")
  • apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk'
    可使用以下变量:
     projectName - 项目名字
     appName - App模块名字
     packageName - applicationId (App包名packageName)
     buildType - buildType (release/debug等)
     channel - channel名称 (对应渠道打包中的渠道名字)
     versionName - versionName (显示用的版本号)
     versionCode - versionCode (内部版本号)
     buildTime - buildTime (编译构建日期时间)
     fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
     flavorName - 编译构建 productFlavors 名
  • channelFile:包含渠道配置信息的文件路径,文件支持使用#号添加注释,具体内容格式示例:
Baidu
Tencent
Huawei
Pp
Vivo

3. 获取渠道信息
在需要渠道等信息时可以通过下面代码进行获取

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

4. 生成渠道包
生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录
用法示例:

  • 生成渠道包 ./gradlew clean assembleReleaseChannels
  • 支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels
  • 临时生成某渠道包 ./gradlew clean assembleReleaseChannels -PchannelList=baidu

说明:使用以上命令处的 clean 有的时候会导致R文件报错,可见issues, 解决方案:

  • 使用AS 的buid——> clean
  • 使用 ./gradlew assembleReleaseChannel

360加固渠道信息失效解决方案

1.将应用上传360加固,加固完后下载到本地备用
2.使用Android SDK中的zipalign对齐优化

  • 打开CMD,进入Android SDK -> build-tools -> 25.+目录
例如:cd /Users/pugongying/work/android/android_dev/android/sdk/Build-Tools/25.0.3
  • 执行命令 ./zipalign -v 4 input.apk output.apk
例如:./zipalign -v 4 /Users/pugongying/work/down_apk/app-debug.apk /Users/pugongying/work/down_apk/app-debug-ziplign.apk

3.使用V2签名工具再次签名加固后的Apk

  • 打开CMD,进入Android SDK -> build-tools -> 25.+目录
例如:cd /Users/pugongying/work/android/android_dev/android/sdk/Build-Tools/25.0.3
  • 执行命令 ./apksigner sign --ks [你的签名文件] [apk路径]
例如: ./apksigner sign --ks /Users/pugongying/work/release_wcg.jks /Users/pugongying/work/down_apk/app-debug-ziplign.apk

4.检查是否使用V2签名
需要下载CheckAndroidV2Signature.jar下载链接
执行命令:java -jar [jar路径] [apk路径]

例如:java -jar /Users/pugongying/work/CheckAndroidV2Signature.jar /Users/pugongying/work/down_apk/app-debug-ziplign.apk

执行命令返回:

{"ret":0,"msg":"ok","isV2":true,"isV2OK":true} 是V2 签名的App
{"ret":0,"msg":"ok","isV2":false,"isV2OK":false} 不是 V2 签名的App

5.写入渠道信息
需要下载walle-cli-all.jar下载地址
单个写入:java -jar [jar路径] put -c [渠道名] [apk路径] [生成的apk路径(可选)

例如:java -jar walle-cli-all.jar put -c tentxun /Users/pugongying/work/down_apk/app-debug-ziplign.apk

批量写入:java -jar [jar路径] batch -f [渠道文件] [apk路径] 生成的apk路径(可选)

例如:java -jar walle-cli-all.jar batch -f /Users/pugongying/work/channel.txt /Users/pugongying/work/down_apk/app-debug-ziplign.apk

说明:以上命令未指定生成apk路径,生成的新apk与当前apk同级目录

6.显示渠道信息
执行命令:java -jar [jar路径] show [apk路径]

例如:java -jar walle-cli-all.jar show /Users/pugongying/work/down_apk/app-debug-ziplign.apk

结果:{channel=Xiaomijingpin}

对tinker影响

有的应用集成了tinker,经过测试,对tinker补丁包无影响,tinker可正常使用

参考资料

新一代开源Android渠道包生成工具Walle
360加固后获取不到渠道信息
Android 新一代多渠道打包神器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容