前言
在上一篇文章http://www.lxweimin.com/p/9db9bd3bcba4中,一步步集成了微信的熱修復Tinker問題,但是我公司的項目,渠道就有十幾個,這樣難道需要打十幾個補丁嗎,很明顯這不現實,有沒有可能實現用一個補丁包,可以修復所有的渠道呢?
答案是有的,官方建議使用項目packer-ng-plugin或者可使用V2 Scheme的walle
下面我們用下美團的walle打包。
源碼下載
https://github.com/baojie0327/HotFixTinker
什么是walle
Walle(瓦力):Android Signature V2 Scheme簽名下的新一代渠道包打包神器
瓦力通過在Apk中的APK Signature Block區塊添加自定義的渠道信息來生成渠道包,從而提高了渠道包生成效率,可以作為單機工具來使用,也可以部署在HTTP服務器上來實時處理渠道包Apk的升級網絡請求。
集成walle
walle提供了2種使用方式:
- Gradle插件方式,方便快速集成
- 命令行方式,最大化滿足各種自定義需求
下面我們用Gradle插件方式在項目里引入walle
1 在項目的build.gradle 文件中添加Walle Gradle插件的依賴
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath "com.tencent.tinker:tinker-patch-gradle-plugin:${TINKER_VERSION}"
//walle 依賴
classpath 'com.meituan.android.walle:plugin:1.1.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2 在app的 build.gradle 文件中apply這個插件,并添加上用于讀取渠道號的AAR
// 配置開始walle===========================
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.5'
}
// 配置結束walle===========================
3 在app的 build.gradle 文件中配置插件
// 配置開始walle===========================
walle {
apkOutputFolder = new File("${project.buildDir}/outputs/channels")
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}-${flavorName}.apk'
//configFile與channelFile兩者必須存在一個,否則無法生成渠道包。兩者都存在時優先執行configFile
channelFile = new File("${project.getProjectDir()}/channel")
//configFile = new File("${project.getProjectDir()}/config.json")
}
配置項具體解釋:
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:包含渠道配置信息的文件路徑
4 在app目錄下新建名為channel的文件,存放所有渠道
如何獲取渠道信息
在需要渠道等信息時可以通過下面代碼進行獲取
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
如何生成渠道包
生成渠道包的方式是和assemble${variantName}Channels指令結合,渠道包的生成目錄默認存放在 build/outputs/apk/,也可以通過walle閉包中的apkOutputFolder參數來指定輸出目錄
用法示例:
生成渠道包 ./gradlew clean assembleReleaseChannels
支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels
-
生成渠道包,運行命令gradlew clean assembleReleaseChannels
-
生成渠道包成功
可以看到,在channels目錄下,生成了各個渠道包,同事在bakApk目錄下,生成了用于打修復補丁的文件,要保存好。
更多API和命令可參考