Android進階之Walle多渠道打包&Tinker熱修復

Android入墳之路發表於2019-03-26

Walle

介紹

Walle(瓦力):Android Signature V2 Scheme簽名下的新一代渠道包打包神器。 瓦力通過在Apk中的APK Signature Block區塊新增自定義的渠道資訊來生成渠道包,從而提高了渠道包生成效率,可以作為單機工具來使用,也可以部署在HTTP伺服器上來實時處理渠道包Apk的升級網路請求。 ——來自 Walle

使用

使用Walle生成多渠道的速度是很快的,原來的專案打一個包就需要兩分鐘多,每次釋出打7個包需要十幾分鍾。用了Walle後,7個包只要兩分鐘左右就完事了。那叫一個快...

新增依賴&配置渠道

在專案的build.gradle檔案中新增依賴

buildscript {
    dependencies {
        classpath 'com.meituan.android.walle:plugin:1.1.3'
    }
}
複製程式碼

在當前appbuild.gradle 檔案中新增依賴,以及配置外掛

apply plugin: 'walle'

...

dependencies {
    ...
    compile 'com.meituan.android.walle:library:1.1.3'
}

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")
}
複製程式碼

對應的屬性:

  • apkOutputFolder:指定渠道包的輸出路徑, 預設值為new File("${project.buildDir}/outputs/apk")。這裡指定為build/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:包含渠道配置資訊的檔案路徑
  • channelFile:包含渠道配置資訊的檔案路徑。 在app目錄下建立channel檔案,用於配置渠道資訊(檔案型別:Text)
Android進階之Walle多渠道打包&Tinker熱修復

渠道配置
下面是我的配置表

Qh360 #360
Yyb #應用寶
Wdj #豌豆莢
Lenovo #聯想
Xiaomi #小米
Huawei #華為
Meizhu #魅族

獲取渠道資訊

通過以下程式碼,可以取渠道資訊

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

生成渠道包

到這裡,基本的配置都已完成。接下來可以直接打包了。 在Terminal中輸入對應的指令,即可完成打包。看到BUILD SUCCESSFUL後說明已經完成打包了。

Android進階之Walle多渠道打包&Tinker熱修復
打包
  • 所有渠道

./gradlew clean assembleReleaseChannels

渠道包的生成目錄預設存放在 build/outputs/apk/,也可以通過Walle閉包中的apkOutputFolder引數來指定輸出目錄

  • 指定渠道
    生成單個渠道包(huawei渠道):

./gradlew clean assembleReleaseChannels -PchannelList=huawei

生成多個渠道包(huawei、xiaomi渠道):

./gradlew clean assembleReleaseChannels -PchannelList=huawei,xiaomi

結果

執行./gradlew clean assembleReleaseChannels後,可以在build/outputs/channels看到對應的渠道包。

Android進階之Walle多渠道打包&Tinker熱修復
walle的配置以及對應的結果

本文主要講了Walle的多渠道打包,更多強大的功能出門左拐

續Tinker

終於說到Tinker了。剛打完用來發布的渠道包,可是如果要打補丁包的話,好像還少了點什麼。用來打補丁包的材料... 一個apk?還有對應的一個txt檔案? 翻了下build目錄,除了build/outputs/channels中有我們需要釋出的渠道包,看了看bakApk...這是什麼..不就是我們想要的補丁包材料!

Android進階之Walle多渠道打包&Tinker熱修復
tinker需要用到的包

有了基包後,就可以打補丁包了。接下來

Android進階之Walle多渠道打包&Tinker熱修復

我要開始裝...額...打補丁包了

打補丁包

  • 配置基包
Android進階之Walle多渠道打包&Tinker熱修復

配置基包路徑

  • 生成補丁包
Android進階之Walle多渠道打包&Tinker熱修復

打補丁包

  • 得到結果
Android進階之Walle多渠道打包&Tinker熱修復

結果

得到補丁包後,直接去釋出就可以了。

看到這裡,你可能有個疑問。我們剛生成了那麼多渠道包,可是補丁包只有一個,這...

這個補丁包對所有的渠道包都有效! 這個補丁包對所有的渠道包都有效! 這個補丁包對所有的渠道包都有效! 是的,只要這一個補丁包就可以了,補丁釋出後所有渠道都會更新的。

你以為呢?每個渠道對應一個補丁包? 哈哈...那得多麻煩

這時候又出現另一個問題了,如果只想為指定的渠道發補丁怎麼辦?這個嘛,我現在也不是很清楚... 印象中,釋出的時候應該是可以過濾渠道的,回頭我再去看看Tinker的文件。

原始碼地址

Github(需要新增簽名)

喜歡的話請幫忙轉發一下能讓更多有需要的人看到吧,有些技術上的問題大家可以多探討一下。




相關文章