前言
在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可正常使用