新多渠道包生成工具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 新一代多渠道打包神器

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容