Gradle使用productFlavors打渠道包的痛
有很多同學可能會采用配置productFlavors來打渠道包穆端,主要是它是原生支持该默,方便開發(fā)者輸出不同定制版本的apk茧痕,舉個例子:
android {
...
defaultConfig {
minSdkVersion 8
versionCode 10
}
productFlavors {
flavor1 {
packageName "com.example.flavor1"
versionCode 20
}
flavor2 {
packageName "com.example.flavor2"
minSdkVersion 14
}
}
}
這樣就可以輸出兩個定制的apk枯跑,不同包名喊递,版本號也不同冰垄。 但是砸狞,如果用它來打渠道包是一個非常低效的做法捻勉,因為它每一次都會走編譯流程,你想一下如果每打一個渠道包就要走一下編譯流程刀森,100個渠道包那得多慢踱启。
那如果你能忍受這么低效打渠道包的方式,那回到本文焦點,我先問個問題:“如果你要針對多渠道進行打補丁埠偿,你應該怎么做透罢?”
你可能會回答,那就針對不同的渠道包進行打補丁冠蒋。沒錯羽圃,這個確實行得通,Bugly也是支持以這種方式進行打補丁抖剿,tinker-support插件會為不同渠道包插入不同的TINKER_ID, 唯一標識當前版本的渠道包朽寞,我們可以看下gradle打多渠道補丁的配置(詳細參考多渠道熱更新):
上面的示例只是配置了兩個渠道,如果你配置超過5個的話牙躺,那么就意味著你要一個補丁愁憔,一個補丁上傳到Bugly補丁管理后臺,況且我們也只允許同時下發(fā)5個版本的補丁孽拷。這里提一下為什么要上傳所有渠道的補丁吨掌,因為通過productFlavors配置,會修改buildConfig類中的FLAVOR字段脓恕,這會導致生成的不同渠道包的dex是不一樣的膜宋,所以只能針對具體渠道進行打補丁。這就非常的尷尬了炼幔,那怎么辦呢秋茫?有沒有版本通過一個補丁就能夠修復所有渠道,答案是:有的乃秀,但前提是你要保證所有渠道包代碼是一致的肛著。
通過多渠道打包框架快速打多渠道包
這里推薦使用walle來打多渠道包,新一代多渠道打包神器跺讯。
通過walle或者類似的打包工具就不會改變dex的結構枢贿,只是修改APK Signature Block來添加自定義的渠道信息來生成渠道包。
配置示例:
// 多渠道使用walle示例(注:多渠道使用)
apply from: 'multiple-channel.gradle'
創(chuàng)建multiple-channel.gradle刀脏,內容如下:
apply plugin: 'walle'
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")
}
創(chuàng)建channel配置:
命令行打多渠道包:
./gradlew clean assembleReleaseChannels
輸出結果如下:
ok局荚,到此已經實現(xiàn)快速打多渠道包了。
如何獲取渠道信息愈污?
如果你想獲取渠道信息進行一些統(tǒng)計的分析耀态,可以按照以下方式(具體參考walle):
dependencies {
compile 'com.meituan.android.walle:library:1.1.3'
}
在代碼中獲取渠道信息:
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
如果你已經集成了Bugly的異常上報,你就可以通過以下方式來塞入渠道信息:
String channel = WalleChannelReader.getChannel(getApplication());
Bugly.setAppChannel(getApplication(), channel);
// 這里實現(xiàn)SDK初始化暂雹,appId替換成你的在Bugly平臺申請的appId
Bugly.init(getApplication(), "YOUR_APP_ID", true);
這樣我們就可以按渠道維度來統(tǒng)計你們app的Crash數(shù)據(jù)了首装。
一個補丁修復所有渠道
重頭戲,總是留在最后擎析。 在打渠道包的過程簿盅,因為會走編譯流程挥下,熱更新插件也會在bakApk生成對應的基線版本揍魂,這個跟普通打包就沒有差別了:
只需要上傳補丁包到補丁管理后臺桨醋,然后下發(fā)即可。
筆者隨便挑了三個渠道分別安裝到不同設備现斋,均成功打上補断沧睢:
ok,基本上我們的需求就已經實現(xiàn)啦庄蹋,媽媽再也不用擔心我加班加點上傳補丁包了瞬内。
總結
Bugly目前同時支持兩種方式進行渠道包的熱更新:
- productFlavors方式打多渠道包
- 快速打渠道包工具(Gradle)
筆者是推薦使用第二種方式,不僅能夠快速打包限书,也能夠輕松實現(xiàn)一個補丁修復所有渠道虫蝶。
如果大家對以上有什么疑問的話,可以在下面留言倦西,我們共同探討下能真。