上一篇文章講到Tinker熱修復框架的接入教程:Android熱更新:微信Tinker框架的接入與測試
這一篇主要是帶給大家竭缝,在使用Tinker熱修復的時候反番,進行多渠道打包的一種解決方案岳悟。
相信大家看到標題就知道漆际,這里要講的就是美團帶來的 新一代開源Android渠道包生成工具Walle
-
至于為什么選擇Walle,我給大家看一張截圖蛉签,如下:
下面進入正題幔摸,以下截圖和代碼是基于上一篇文章的demo摸柄,看這里
一、接入Walle(文末有 Demo 的 Github 鏈接)
步驟一:項目的 build.gradle 文件
在 build.gradle 文件中添加Walle Gradle插件的依賴既忆,classpath 'com.meituan.android.walle:plugin:1.1.2'
如下圖:
步驟二:app的build.gradle 文件
1.在當前App的 build.gradle 文件中apply這個插件驱负,并添加上用于讀取渠道號的AAR;
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.2'//walle
}
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.txt")
}
配置項具體解釋:
- 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 (內(nèi)部版本號)
buildTime - buildTime (編譯構(gòu)建日期時間)
fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
flavorName - 編譯構(gòu)建 productFlavors 名
-
channelFile:包含渠道配置信息的文件路徑统诺。 具體內(nèi)容格式詳見下圖萄凤,支持使用#號添加注釋扣典。
Demo這里需要打21個渠道包:
build.gradle 文件添加的內(nèi)容,如下圖:
步驟三:獲取渠道信息
在需要渠道等信息時可以通過這行代碼進行獲取:
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
如下圖所示:
至此爆哑,Walle的接入工作基本完成绘雁,關(guān)于Walle的更多用法橡疼,可以移步到 這里參考
二、生成渠道包
生成渠道包的方式是和assemble${variantName}Channels
指令結(jié)合庐舟,渠道包的生成目錄默認存放在 build/outputs/apk/
欣除,也可以通過walle
閉包中的apkOutputFolder
參數(shù)來指定輸出目錄,下面截圖帶你回顧一下demo指定的輸出目錄:
生成渠道包
直接在Android Studio 下面的Terminal 窗口敲入如下命令挪略,回車:
./gradlew clean assembleReleaseChannels
這里有一點需要注意耻涛,就是Terminal的當前目錄是否是你的項目的根目錄,如下圖所示:
這里瘟檩,在執(zhí)行上面的命令之前,outputs文件夾的界面是如下的:
執(zhí)行成功后澈蟆,Terminal窗口會顯示如下信息墨辛,簽名耗時539毫秒,下面的19.181秒是包含了編譯打包的總時間:
最后我們可以在outputs文件夾里找到我們需要的21個渠道包趴俘,這里的渠道包就可以發(fā)布到各個應用平臺上去睹簇,如下所示:
三、使用Tinker熱修復各個渠道包
其實這里的操作跟上一篇文章Android熱更新:微信Tinker框架的接入與測試介紹的第二步寥闪,測試Tinker的操作基本一樣太惠,相信讀者通過我上一篇文章的介紹,可以輕而易舉地打出補丁包疲憋。不過凿渊,為了方便,我還是帶大家走一遍吧:
步驟一:修改基礎包配置
通過上面步驟生成各個渠道包的同時缚柳,在build文件夾下埃脏,Tinker同樣會給我們打出基礎包,相信細心的讀者在上一張截圖里就會發(fā)現(xiàn)秋忙,bakApk文件夾里即是基礎包相關(guān)的文件彩掐,同樣,我們需要將這文件夾里的三個文件的名稱填寫到 app 的 build.gradle 類的 ext 這里,sync一下灰追,(這里生成的基礎安裝包和 R文件以及release版本的mapping文件一定要自己保存好堵幽,因為每次打補丁包都需要用到這些文件作為基礎文件,別弄丟了)弹澎,如下圖:
步驟二:修復bug
修改項目的bug朴下,demo這里只是增加一個textview控件作為熱修復測試,如下圖:
步驟三:打補丁包
1.點開 Android Studio的Gradle 界面裁奇,如下桐猬,雙擊 tinkerPatchRelease ,如下:
2.緊接著刽肠,Tinker 在build 文件夾下的 outputs 文件夾里面會生成我們需要的補丁文件溃肪,patch_signed_7zip.apk 就是我們所要的補丁包免胃,如下:
當然,如果你想了解更多關(guān)于輸出文件的情況惫撰,可以點開Tinker Wiki 的 輸出文件詳解羔沙。
步驟四:將補丁包拷貝到手機sdcard中測試
將步驟三生成的 tinkerPatch 文件夾下面的 patch_signed_7zip.apk 文件,拷貝出來厨钻,改成你的 MainActivity中加載的文件名字扼雏,demo這里叫TinkerPatch,將其拷貝到手機的sdcard中的myTinkerDemo 文件夾下夯膀,沒有這個文件夾你就自己手動新建一個诗充,下圖帶你回顧一下 MainActivity 的設置:
注意此處,測試和發(fā)布版本的不同:發(fā)布版本的補丁文件一般是通過網(wǎng)絡下載下來诱建,存放到sdcard中蝴蜓,再加載。
步驟五:加載補丁
點擊主頁的加載補丁按鈕俺猿,沒加載之前如下界面茎匠,里面顯示了當前app的渠道信息:
點擊加載補丁之后,鎖屏或者殺死進程押袍,再次進入demo诵冒,補丁已經(jīng)加載出來,在渠道信息下面增加了一個文本谊惭,標識新bug已修復汽馋。如下:
小結(jié),我們只需要打一個補丁包出來圈盔,就可以熱修復所有應用渠道上面的bug惭蟋。
后續(xù)
感謝美團點評技術(shù)團隊
Walle Github
關(guān)于微信Tinker框架的接入
參考這篇文章 Android熱更新:微信Tinker框架的接入與測試
關(guān)于release版本的混淆
可以參考這篇文章 5分鐘搞定android混淆
關(guān)于release版本的加固
先加固沒簽名的包,然后用buildtool中的apksigner簽名(有同學反饋24不可以药磺,25.0.0就可以了)告组,然后用walle注入渠道“┡澹可以參考這里 支持Android7.0 Signature V2 Scheme 多渠道打包木缝,并解決類似360加固后獲取不到渠道信息 - 渠道統(tǒng)計失敗的問題
Demo 源碼下載
TinkerWithWalleDemo 的 Github 下載地址