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
輸出結果如下:
nok,到此已經實現快速打多渠道包了。
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筆者隨便挑了三個渠道分別安裝到不同設備,均成功打上補丁:
nok,基本上我們的需求就已經實現啦,媽媽再也不用擔心我加班加點上傳補丁包了。
n總結
n
Bugly目前同時支持兩種方式進行渠道包的熱更新:
n- productFlavors方式打多渠道包
- 快速打渠道包工具(Gradle)
n
n
筆者是推薦使用第二種方式,不僅能夠快速打包,也能夠輕鬆實現一個補丁修復所有渠道。
n如果大家對以上有什麼疑問的話,可以在下面留言,我們共同探討下。
n更多精彩內容歡迎關注騰訊 Bugly的微信公眾賬號:
騰訊 Bugly是一款專為移動開發者打造的質量監控工具,幫助開發者快速,便捷的定位線上應用崩潰的情況以及解決方案。智能合併功能幫助開發同學把每天上報的數千條 Crash 根據根因合併分類,每日日報會列出影響用戶數最多的崩潰,精準定位功能幫助開發同學定位到出問題的代碼行,實時上報可以在發布後快速的了解應用的質量情況,適配最新的 iOS, Android 官方操作系統,鵝廠的工程師都在使用,快來加入我們吧!
推薦閱讀: