轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/8a850ddee403
前言
上一篇文章 熱修復(fù)框架Tinker最完整講解(01)——集成之路 已經(jīng)介紹我們的項(xiàng)目渠道包有20個(gè)羡榴,并且我們多渠道打包是采用productFlavors實(shí)現(xiàn)的卵皂。但是這種多渠道打包會(huì)造成20個(gè)渠道包的熱更新就需要20個(gè)補(bǔ)丁址晕,這樣肯定是不合理的撇贺。那怎樣才能實(shí)現(xiàn)20個(gè)渠道包只需要一個(gè)補(bǔ)丁包呢杯道?Tinker官方也說了,推薦我們多渠道打包使用Walle伶氢,這樣就能實(shí)現(xiàn)多個(gè)渠道包只使用一個(gè)補(bǔ)丁包了翔忽!
什么是Walle?
Walle(瓦力):Android Signature V2 Scheme簽名下的新一代渠道包打包神器铃彰。
瓦力通過在Apk中的APK Signature Block區(qū)塊添加自定義的渠道信息來生成渠道包绍豁,從而提高了渠道包生成效率,可以作為單機(jī)工具來使用牙捉,也可以部署在HTTP服務(wù)器上來實(shí)時(shí)處理渠道包Apk的升級(jí)網(wǎng)絡(luò)請(qǐng)求竹揍。
——介紹來自Walle
集成
為了方便大家的使用,Walle提供了2種使用方式:(這里主要講常用的第一種方式)
- Gradle插件方式邪铲,方便快速集成
- 命令行方式芬位,最大化滿足各種自定義需求
配置build.gradle
1,在項(xiàng)目的build.gradle 文件中添加Walle Gradle插件的依賴带到, 如下
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.4'
}
}
2昧碉,在app的 build.gradle 文件中apply這個(gè)插件,并添加上用于讀取渠道號(hào)的AAR,如下:
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.4'
}
3被饿,在app的 build.gradle 文件中配置插件四康,如下:
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:包含渠道配置信息的文件路徑:
在app目錄下新建名為channel的文件狭握,如圖
在該文件里寫上需要打包的渠道號(hào)(渠道號(hào)支持使用#號(hào)添加注釋闪金。具體內(nèi)容格式詳見下圖,這里只測(cè)試2個(gè)渠道)
相關(guān)API和命令
獲取渠道信息
在需要渠道等信息時(shí)可以通過下面代碼進(jìn)行獲取
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
生成渠道包
生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合论颅,渠道包的生成目錄默認(rèn)存放在 build/outputs/apk/哎垦,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄
生成渠道包 ./gradlew clean assembleReleaseChannels
更多API和命令可參考 更多用法
使用
在Android Studio的Terminal中輸入命令gradlew clean assembleReleaseChannels進(jìn)行多渠道打包,當(dāng)運(yùn)行完成會(huì)出現(xiàn)BUILD SUCCESSFUL, 如圖:
并且會(huì)在channels文件夾中生成所有渠道的apk,如圖:
一一對(duì)應(yīng)關(guān)系為:
Tinker與Walle在真實(shí)項(xiàng)目中的使用流程
上一篇文章 熱修復(fù)框架Tinker最完整講解(01)——集成之路 主要修復(fù)的是單個(gè)渠道包恃疯,這里結(jié)合Walle修復(fù)多個(gè)渠道包漏设。
發(fā)布版本流程
1,我們?cè)诎l(fā)布版本的時(shí)候都需要改版本號(hào)澡谭,因?yàn)槲疫@里使用版本名稱作為tinkerId愿题,所以發(fā)布版本修改版本名稱的時(shí)候损俭,tinkerId也要跟著修改蛙奖。(tinkerId主要作用是當(dāng)前打出的補(bǔ)丁包是基于哪個(gè)版本的apk, tinkerId的選取見我下一篇文章 熱修復(fù)框架Tinker最完整講解(03)——使用Tinker常見問題。
2, 檢查app build中是否開啟了熱修復(fù)功能, 即tinkerEnabled需要設(shè)置為true船响。如圖:
3顶籽,打包前先建一個(gè)當(dāng)前版本的分支R省!T茏(熱更新修復(fù)bug就在該分支上修改)
4,在AS的Terminal中輸入命令gradlew clean assembleReleaseChannels進(jìn)行多渠道打包
命令行運(yùn)行完成會(huì)在channels文件夾中生成所有渠道的apk日裙, 如圖:
5吹艇,同時(shí)會(huì)在bakApk文件中生成三個(gè)文件,如圖: (這三個(gè)文件需要保存在本地昂拂,svn或者git服務(wù)器受神,每次發(fā)布補(bǔ)丁包的時(shí)候需要用到!)
發(fā)補(bǔ)丁包流程
1格侯,在新建的分支上修改bug
2鼻听,將發(fā)布版本第5步中的三個(gè)文件路徑復(fù)制到app build中對(duì)應(yīng)的位置,如圖:
3联四,修改bug
4撑碴,運(yùn)行補(bǔ)丁命令獲取補(bǔ)丁包。單擊AS右側(cè)頂部gradle朝墩,雙擊tinkerPatchRelease醉拓,如圖:
5,運(yùn)行完成會(huì)在build->outputs->tinkerPatch->release文件夾中生成一個(gè)名為patch_signed_7zip.apk的補(bǔ)丁包,如圖:
6亿卤,將該補(bǔ)丁包重修修改名字后發(fā)給后臺(tái)(注意:這里的一個(gè)補(bǔ)丁包就適用于各個(gè)渠道包C蹈洹),關(guān)于補(bǔ)丁包的存放與后臺(tái)設(shè)計(jì)請(qǐng)看下一篇文章熱修復(fù)框架Tinker最完整講解(03)——使用Tinker常見問題怠噪。
7恐似,bug修改完成后將該分支合并到trunk主干上即可。這樣能保證分支上修改了bug傍念,trunk主干上也跟著更新了矫夷。
Tinker系列文章講的已經(jīng)非常詳細(xì)了,有不足的地方希望指出憋槐。遇到不懂的問題都可以直接在博客下評(píng)論問我双藕,只要我遇到過并且能回答出來的都會(huì)樂意回答。
Demo下載地址:https://github.com/wildma/WildmaTinker
如果對(duì)你有幫助請(qǐng)點(diǎn)贊阳仔,star支持下哈~