(續(xù))Android熱更新:Tinker熱修復(fù)與Walle多渠道打包

上一篇文章講到Tinker熱修復(fù)框架的接入教程:Android熱更新:微信Tinker框架的接入與測試
這一篇主要是帶給大家,在使用Tinker熱修復(fù)的時(shí)候,進(jìn)行多渠道打包的一種解決方案。

相信大家看到標(biāo)題就知道,這里要講的就是美團(tuán)帶來的 新一代開源Android渠道包生成工具Walle

  • 至于為什么選擇Walle,我給大家看一張截圖,如下:


    Walle的選擇
  • 下面進(jìn)入正題,以下截圖和代碼是基于上一篇文章的demo,看這里

一、接入Walle(文末有 Demo 的 Github 鏈接)

步驟一:項(xiàng)目的 build.gradle 文件

在 build.gradle 文件中添加Walle Gradle插件的依賴,classpath 'com.meituan.android.walle:plugin:1.1.2' 如下圖:

項(xiàng)目build.gradle

步驟二:app的build.gradle 文件

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

配置項(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名稱 (對應(yīng)渠道打包中的渠道名字)
     versionName - versionName (顯示用的版本號)
     versionCode - versionCode (內(nèi)部版本號)
     buildTime - buildTime (編譯構(gòu)建日期時(shí)間)
     fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
     flavorName - 編譯構(gòu)建 productFlavors 名
  • channelFile:包含渠道配置信息的文件路徑。 具體內(nèi)容格式詳見下圖,支持使用#號添加注釋。
    Demo這里需要打21個(gè)渠道包:


    channel.txt

build.gradle 文件添加的內(nèi)容,如下圖:


App的build.gradle
步驟三:獲取渠道信息

在需要渠道等信息時(shí)可以通過這行代碼進(jìn)行獲取:
String channel = WalleChannelReader.getChannel(this.getApplicationContext());

如下圖所示:


獲取渠道信息

至此,Walle的接入工作基本完成,關(guān)于Walle的更多用法,可以移步到 這里參考

二、生成渠道包

生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合,渠道包的生成目錄默認(rèn)存放在 build/outputs/apk/,也可以通過walle閉包中的apkOutputFolder參數(shù)來指定輸出目錄,下面截圖帶你回顧一下demo指定的輸出目錄:

指定輸出文件目錄

生成渠道包
直接在Android Studio 下面的Terminal 窗口敲入如下命令,回車:
./gradlew clean assembleReleaseChannels
這里有一點(diǎn)需要注意,就是Terminal的當(dāng)前目錄是否是你的項(xiàng)目的根目錄,如下圖所示:

Terminal

這里,在執(zhí)行上面的命令之前,outputs文件夾的界面是如下的:


outputs

執(zhí)行成功后,Terminal窗口會顯示如下信息,簽名耗時(shí)539毫秒,下面的19.181秒是包含了編譯打包的總時(shí)間:


Terminal

最后我們可以在outputs文件夾里找到我們需要的21個(gè)渠道包,這里的渠道包就可以發(fā)布到各個(gè)應(yīng)用平臺上去,如下所示:


outputs

三、使用Tinker熱修復(fù)各個(gè)渠道包

其實(shí)這里的操作跟上一篇文章Android熱更新:微信Tinker框架的接入與測試介紹的第二步,測試Tinker的操作基本一樣,相信讀者通過我上一篇文章的介紹,可以輕而易舉地打出補(bǔ)丁包。不過,為了方便,我還是帶大家走一遍吧:

步驟一:修改基礎(chǔ)包配置

通過上面步驟生成各個(gè)渠道包的同時(shí),在build文件夾下,Tinker同樣會給我們打出基礎(chǔ)包,相信細(xì)心的讀者在上一張截圖里就會發(fā)現(xiàn),bakApk文件夾里即是基礎(chǔ)包相關(guān)的文件,同樣,我們需要將這文件夾里的三個(gè)文件的名稱填寫到 app 的 build.gradle 類的 ext 這里,sync一下,(這里生成的基礎(chǔ)安裝包和 R文件以及release版本的mapping文件一定要自己保存好,因?yàn)槊看未蜓a(bǔ)丁包都需要用到這些文件作為基礎(chǔ)文件,別弄丟了),如下圖:

build.gradle
步驟二:修復(fù)bug

修改項(xiàng)目的bug,demo這里只是增加一個(gè)textview控件作為熱修復(fù)測試,如下圖:


修復(fù)bug測試
步驟三:打補(bǔ)丁包

1.點(diǎn)開 Android Studio的Gradle 界面,如下,雙擊 tinkerPatchRelease ,如下:


Gradle Tinker

2.緊接著,Tinker 在build 文件夾下的 outputs 文件夾里面會生成我們需要的補(bǔ)丁文件,patch_signed_7zip.apk 就是我們所要的補(bǔ)丁包,如下:


patch_signed_7zip.apk

當(dāng)然,如果你想了解更多關(guān)于輸出文件的情況,可以點(diǎn)開Tinker Wiki 的 輸出文件詳解

步驟四:將補(bǔ)丁包拷貝到手機(jī)sdcard中測試

將步驟三生成的 tinkerPatch 文件夾下面的 patch_signed_7zip.apk 文件,拷貝出來,改成你的 MainActivity中加載的文件名字,demo這里叫TinkerPatch,將其拷貝到手機(jī)的sdcard中的myTinkerDemo 文件夾下,沒有這個(gè)文件夾你就自己手動新建一個(gè),下圖帶你回顧一下 MainActivity 的設(shè)置:

注意此處,測試和發(fā)布版本的不同:發(fā)布版本的補(bǔ)丁文件一般是通過網(wǎng)絡(luò)下載下來,存放到sdcard中,再加載。

MainActivity
步驟五:加載補(bǔ)丁

點(diǎn)擊主頁的加載補(bǔ)丁按鈕,沒加載之前如下界面,里面顯示了當(dāng)前app的渠道信息:


發(fā)現(xiàn)新bug

點(diǎn)擊加載補(bǔ)丁之后,鎖屏或者殺死進(jìn)程,再次進(jìn)入demo,補(bǔ)丁已經(jīng)加載出來,在渠道信息下面增加了一個(gè)文本,標(biāo)識新bug已修復(fù)。如下:


新bug已修復(fù)

小結(jié),我們只需要打一個(gè)補(bǔ)丁包出來,就可以熱修復(fù)所有應(yīng)用渠道上面的bug。

后續(xù)

感謝美團(tuán)點(diǎn)評技術(shù)團(tuán)隊(duì)
Walle Github

關(guān)于微信Tinker框架的接入
參考這篇文章 Android熱更新:微信Tinker框架的接入與測試

關(guān)于release版本的混淆
可以參考這篇文章 5分鐘搞定android混淆

關(guān)于release版本的加固
先加固沒簽名的包,然后用buildtool中的apksigner簽名(有同學(xué)反饋24不可以,25.0.0就可以了),然后用walle注入渠道。可以參考這里 支持Android7.0 Signature V2 Scheme 多渠道打包,并解決類似360加固后獲取不到渠道信息 - 渠道統(tǒng)計(jì)失敗的問題

Demo 源碼下載
TinkerWithWalleDemo 的 Github 下載地址

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

推薦閱讀更多精彩內(nèi)容