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

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

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

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


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

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

步驟一:項目的 build.gradle 文件

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

項目build.gradle

步驟二: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 (內部版本號)
     buildTime - buildTime (編譯構建日期時間)
     fileSHA1 - fileSHA1 (最終APK文件的SHA1哈希值)
     flavorName - 編譯構建 productFlavors 名
  • channelFile:包含渠道配置信息的文件路徑。 具體內容格式詳見下圖,支持使用#號添加注釋。
    Demo這里需要打21個渠道包:


    channel.txt

build.gradle 文件添加的內容,如下圖:


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

在需要渠道等信息時可以通過這行代碼進行獲?。?br> String channel = WalleChannelReader.getChannel(this.getApplicationContext());

如下圖所示:


獲取渠道信息

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

二、生成渠道包

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

指定輸出文件目錄

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

Terminal

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


outputs

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


Terminal

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


outputs

三、使用Tinker熱修復各個渠道包

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

步驟一:修改基礎包配置

通過上面步驟生成各個渠道包的同時,在build文件夾下,Tinker同樣會給我們打出基礎包,相信細心的讀者在上一張截圖里就會發現,bakApk文件夾里即是基礎包相關的文件,同樣,我們需要將這文件夾里的三個文件的名稱填寫到 app 的 build.gradle 類的 ext 這里,sync一下,(這里生成的基礎安裝包和 R文件以及release版本的mapping文件一定要自己保存好,因為每次打補丁包都需要用到這些文件作為基礎文件,別弄丟了),如下圖:

build.gradle
步驟二:修復bug

修改項目的bug,demo這里只是增加一個textview控件作為熱修復測試,如下圖:


修復bug測試
步驟三:打補丁包

1.點開 Android Studio的Gradle 界面,如下,雙擊 tinkerPatchRelease ,如下:


Gradle Tinker

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


patch_signed_7zip.apk

當然,如果你想了解更多關于輸出文件的情況,可以點開Tinker Wiki 的 輸出文件詳解。

步驟四:將補丁包拷貝到手機sdcard中測試

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

注意此處,測試和發布版本的不同:發布版本的補丁文件一般是通過網絡下載下來,存放到sdcard中,再加載。

MainActivity
步驟五:加載補丁

點擊主頁的加載補丁按鈕,沒加載之前如下界面,里面顯示了當前app的渠道信息:


發現新bug

點擊加載補丁之后,鎖屏或者殺死進程,再次進入demo,補丁已經加載出來,在渠道信息下面增加了一個文本,標識新bug已修復。如下:


新bug已修復

小結,我們只需要打一個補丁包出來,就可以熱修復所有應用渠道上面的bug。

后續

感謝美團點評技術團隊
Walle Github

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

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,661評論 25 708
  • Tinker介紹 Tinker是微信團隊開源的Android熱修復工具,支持dex, library和resour...
    HolenZhou閱讀 4,197評論 4 15
  • Android熱修復框架的對比(最終選擇微信Tinker) 總結對比摘自Tinker官方Wiki AndFix作為...
    滌生_Woo閱讀 16,283評論 40 85
  • 黑色,如同緩慢流動的濁液,逐漸覆蓋住我的全身。 溫暖,是我渾身唯一的感受,黑暗卻帶來如此的安心感。 這是哪里,這是...
    喵魚兒閱讀 186評論 0 0
  • 這兩日,我看了本《阿凡提笑話合集》,幾百個笑話時而讓我微微一笑,時而讓我沉思不語,時而讓我捧腹大笑,時而讓我...
    周言欣文閱讀 377評論 0 0