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

前言

在Android 7.0(Nougat)推出了新的應(yīng)用簽名方案APK Signature Scheme v2,它是一個(gè)對(duì)全文件進(jìn)行簽名的方案,能提供更快的應(yīng)用安裝時(shí)間、對(duì)未授權(quán)APK文件的更改提供更多保護(hù),在默認(rèn)情況下,Android Gradle 2.2.0插件會(huì)使用APK Signature Scheme v2和傳統(tǒng)簽名方案來簽署你的應(yīng)用(可通過v2SigningEnabled false關(guān)閉)。APK Signature Scheme v2導(dǎo)致之前快速生成渠道包的方式(如:美團(tuán)Android自動(dòng)化之旅—生成渠道包)已經(jīng)行不通了,至于為什么行不通了在這篇文章中(Android 新一代多渠道打包神器)能找到答案,在此便不再贅述。目前針對(duì)APK Signature Scheme v2快速生成渠道包的市面上的解決方案有(兩者的實(shí)現(xiàn)原理都一樣,本文主要介紹前者):

Gradle插件使用方式

1. 配置build.gradle
在位于項(xiàng)目的根目錄 build.gradle 文件中添加Walle Gradle插件的依賴, 如下:

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

并在當(dāng)前App的 build.gradle 文件中apply這個(gè)插件,并添加上用于讀取渠道號(hào)的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")
}

配置項(xiàng)具體解釋:

  • apkOutputFolder:指定渠道包的輸出路徑, 默認(rèn)值為new File("${project.buildDir}/outputs/apk")
  • apkFileNameFormat:定制渠道包的APK的文件名稱, 默認(rèn)值為'${appName}-${buildType}-${channel}.apk'
    可使用以下變量:
     projectName - 項(xiàng)目名字
     appName - App模塊名字
     packageName - applicationId (App包名packageName)
     buildType - buildType (release/debug等)
     channel - channel名稱 (對(duì)應(yīng)渠道打包中的渠道名字)
     versionName - versionName (顯示用的版本號(hào))
     versionCode - versionCode (內(nèi)部版本號(hào))
     buildTime - buildTime (編譯構(gòu)建日期時(shí)間)
     fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
     flavorName - 編譯構(gòu)建 productFlavors 名
  • channelFile:包含渠道配置信息的文件路徑,文件支持使用#號(hào)添加注釋,具體內(nèi)容格式示例:
Baidu
Tencent
Huawei
Pp
Vivo

3. 獲取渠道信息
在需要渠道等信息時(shí)可以通過下面代碼進(jìn)行獲取

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

4. 生成渠道包
生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合,渠道包的生成目錄默認(rèn)存放在build/outputs/apk/,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄
用法示例:

  • 生成渠道包 ./gradlew clean assembleReleaseChannels
  • 支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels
  • 臨時(shí)生成某渠道包 ./gradlew clean assembleReleaseChannels -PchannelList=baidu

說明:使用以上命令處的 clean 有的時(shí)候會(huì)導(dǎo)致R文件報(bào)錯(cuò),可見issues, 解決方案:

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

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

1.將應(yīng)用上傳360加固,加固完后下載到本地備用
2.使用Android SDK中的zipalign對(duì)齊優(yōu)化

  • 打開CMD,進(jìn)入Android SDK -> build-tools -> 25.+目錄
例如:cd /Users/pugongying/work/android/android_dev/android/sdk/Build-Tools/25.0.3
  • 執(zhí)行命令 ./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,進(jìn)入Android SDK -> build-tools -> 25.+目錄
例如:cd /Users/pugongying/work/android/android_dev/android/sdk/Build-Tools/25.0.3
  • 執(zhí)行命令 ./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下載鏈接
執(zhí)行命令:java -jar [jar路徑] [apk路徑]

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

執(zhí)行命令返回:

{"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下載地址
單個(gè)寫入: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與當(dāng)前apk同級(jí)目錄

6.顯示渠道信息
執(zhí)行命令:java -jar [jar路徑] show [apk路徑]

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

結(jié)果:{channel=Xiaomijingpin}

對(duì)tinker影響

有的應(yīng)用集成了tinker,經(jīng)過測(cè)試,對(duì)tinker補(bǔ)丁包無影響,tinker可正常使用

參考資料

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,319評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評(píng)論 19 139
  • 在壓力下,大腦是如何工作的? 大腦會(huì)釋放皮質(zhì)醇,影響思維,大腦一堆系統(tǒng)關(guān)閉。 可不可以建立一個(gè)系統(tǒng)來預(yù)防糟糕的事發(fā)...
    小尾巴巨人閱讀 243評(píng)論 0 1
  • 我原以為我可以像風(fēng),來過離開留下痕跡卻不會(huì)留下自己,沒有多余的感情,這樣就不會(huì)傷害自己。 我原以為我可以像孤...
    良城閱讀 163評(píng)論 0 0
  • 成功的項(xiàng)目都有什么樣的特征? --讀《漫畫中國(guó)式項(xiàng)目管理》有感 看完《漫畫中國(guó)式項(xiàng)目管理》這本通俗易懂的項(xiàng)目管理專...
    禮小禮er閱讀 1,984評(píng)論 2 7

友情鏈接更多精彩內(nèi)容