Bugly多渠道熱更新解決方案

作者:巫文傑

n

n

Gradle使用productFlavors打渠道包的痛

n

有很多同學可能會採用配置productFlavors來打渠道包,主要是它是原生支持,方便開發者輸出不同定製版本的apk,舉個例子:

n

android {n ...nn defaultConfig {n minSdkVersion 8n versionCode 10n }nn productFlavors {n flavor1 {n packageName "com.example.flavor1"n versionCode 20n }nn flavor2 {n packageName "com.example.flavor2"n minSdkVersion 14n }n }n }n

n

這樣就可以輸出兩個定製的apk,不同包名,版本號也不同。 但是,如果用它來打渠道包是一個非常低效的做法,因為它每一次都會走編譯流程,你想一下如果每打一個渠道包就要走一下編譯流程,100個渠道包那得多慢。

n

那如果你能忍受這麼低效打渠道包的方式,那回到本文焦點,我先問個問題:「如果你要針對多渠道進行打補丁,你應該怎麼做?」

n

你可能會回答,那就針對不同的渠道包進行打補丁。沒錯,這個確實行得通,Bugly也是支持以這種方式進行打補丁,tinker-support插件會為不同渠道包插入不同的TINKER_ID, 唯一標識當前版本的渠道包,我們可以看下gradle打多渠道補丁的配置:

n

上面的示例只是配置了兩個渠道,如果你配置超過5個的話,那麼就意味著你要一個補丁,一個補丁上傳到Bugly補丁管理後台,況且我們也只允許同時下發5個版本的補丁。這裡提一下為什麼要上傳所有渠道的補丁,因為通過productFlavors配置,會修改buildConfig類中的FLAVOR欄位,這會導致生成的不同渠道包的dex是不一樣的,所以只能針對具體渠道進行打補丁。這就非常的尷尬了,那怎麼辦呢?有沒有版本通過一個補丁就能夠修復所有渠道,答案是:有的,但前提是你要保證所有渠道包代碼是一致的。

n

通過多渠道打包框架快速打多渠道包

n

這裡推薦使用walle來打多渠道包,新一代多渠道打包神器。

n

通過walle或者類似的打包工具就不會改變dex的結構,只是修改APK Signature Block來添加自定義的渠道信息來生成渠道包。

n

配置示例:

n

// 多渠道使用walle示例(註:多渠道使用)n apply from: multiple-channel.gradlen

n

創建multiple-channel.gradle,內容如下:

n

apply plugin: wallenn walle {n // 指定渠道包的輸出路徑n apkOutputFolder = new File("${project.buildDir}/outputs/channels");n // 定製渠道包的APK的文件名稱n apkFileNameFormat = ${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk;n // 渠道配置文件n channelFile = new File("${project.getProjectDir()}/channel")n }n

n

創建channel配置:

n

命令行打多渠道包:

n

./gradlew clean assembleReleaseChannelsn

n

輸出結果如下:

n

ok,到此已經實現快速打多渠道包了。

n

如何獲取渠道信息?

n

如果你想獲取渠道信息進行一些統計的分析,可以按照以下方式(具體參考walle):

n

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

n

在代碼中獲取渠道信息:

n

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

n

如果你已經集成了Bugly的異常上報,你就可以通過以下方式來塞入渠道信息:

n

String channel = WalleChannelReader.getChannel(getApplication());n Bugly.setAppChannel(getApplication(), channel);n // 這裡實現SDK初始化,appId替換成你的在Bugly平台申請的appIdn Bugly.init(getApplication(), "YOUR_APP_ID", true);n

n

這樣我們就可以按渠道維度來統計你們app的Crash數據了。

n

一個補丁修復所有渠道

n

重頭戲,總是留在最後。 在打渠道包的過程,因為會走編譯流程,熱更新插件也會在bakApk生成對應的基線版本,這個跟普通打包就沒有差別了:

n

只需要上傳補丁包到補丁管理後台,然後下發即可。

n

筆者隨便挑了三個渠道分別安裝到不同設備,均成功打上補丁:

n

ok,基本上我們的需求就已經實現啦,媽媽再也不用擔心我加班加點上傳補丁包了。

n

總結

n

Bugly目前同時支持兩種方式進行渠道包的熱更新:

n

  • productFlavors方式打多渠道包
  • n

  • 快速打渠道包工具(Gradle)
  • n

筆者是推薦使用第二種方式,不僅能夠快速打包,也能夠輕鬆實現一個補丁修復所有渠道。

n

如果大家對以上有什麼疑問的話,可以在下面留言,我們共同探討下。

n

更多精彩內容歡迎關注騰訊 Bugly的微信公眾賬號:

騰訊 Bugly是一款專為移動開發者打造的質量監控工具,幫助開發者快速,便捷的定位線上應用崩潰的情況以及解決方案。智能合併功能幫助開發同學把每天上報的數千條 Crash 根據根因合併分類,每日日報會列出影響用戶數最多的崩潰,精準定位功能幫助開發同學定位到出問題的代碼行,實時上報可以在發布後快速的了解應用的質量情況,適配最新的 iOS, Android 官方操作系統,鵝廠的工程師都在使用,快來加入我們吧!


推薦閱讀:

如何利用CVE-2017-8715:PowerShell模塊清單文件繞過安全補丁

TAG:Android开发 | 补丁 | Gradle |