多渠道打包
多渠道打包方式 2 種:productFlavors、多渠道打包插件(騰訊:Bugly、美團:walle、…)
productFlavors
一、app 目錄下創建渠道文件:channel.txt
注意:渠道名不要為純數字,會導致獲取不到渠道名,例如下面的 360
xiaomi huawei baidu yyb 360獲取渠道名方法:
public fun getChannel() {val pm: PackageManager = packageManagerval appInfo: ApplicationInfo =pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)val channel: String = appInfo.metaData.getString("CHANNEL_VALUE").toString()Toast.makeText(this, "當前渠道:$channel", Toast.LENGTH_LONG).show()}二、app 的 build.gradle 文件中的 application 節點下配置:
flavorDimensions "default"file('channel.txt').readLines().each {channel ->productFlavors.create(channel, {dimension "default"// 編譯后會替換 AndroidMnifest 中的值,將 ${channel1} 替換成配置的渠道名manifestPlaceholders = [channel1: channel]})}三、AndroidMnifest 中:
<meta-dataandroid:name="CHANNEL_VALUE"android:value="${channel1}" />四、生成 Build Variants(變種),默認情況下有 debug、release 兩個變種。
雙擊命令同時構建 debug 或 release 多渠道 apk:
五、差異化
創建各渠道要編譯的代碼目錄(也叫資源集):
build.gradle 的 application 節點下配置各渠道的資源集路徑:
sourceSets {xiaomi {java.srcDirs = ['src/_xiaomi/java']res.srcDirs = ['src/_xiaomi/res']}huawei {java.srcDirs = ['src/_huawei/java']res.srcDirs = ['src/_huawei/res']}baidu {java.srcDirs = ['src/_baidu/java']res.srcDirs = ['src/_baidu/res']}yyb {java.srcDirs = ['src/_yyb/java']res.srcDirs = ['src/_yyb/res']}}例如選中 huaweiDebug,編譯時則會使用 huawei 渠道配置下的資源集目錄:
如果某些渠道下有相同的文件,也可以單獨抽離一個公共使用的資源集,例如這里的 _base 文件夾:
假如這里 huawei、baidu、yyb 渠道中有相同的文件抽離到了 _base 里面,就應該配置如下:
這里應該還可以配合 excludes ,includes 使用,暫未驗證。
sourceSets {xiaomi {java.srcDirs = ['src/_xiaomi/java']res.srcDirs = ['src/_xiaomi/res']}huawei {java.srcDirs = ['src/_base/java','src/_huawei/java']res.srcDirs = ['src/_base/res','src/_huawei/res']}baidu {java.srcDirs = ['src/_base/java', 'src/_baidu/java']res.srcDirs = ['src/_base/res', 'src/_baidu/res']}yyb {java.srcDirs = ['src/_base/java', 'src/_yyb/java']res.srcDirs = ['src/_base/res', 'src/_yyb/res']}}差異化配置不同渠道下的第三方依賴,前綴與渠道名相同,例如:
huaweiImplementation 'androidx.constraintlayout:constraintlayout:2.0.4'注意坑:
main 公共目錄下和渠道目錄下不能有相同的 java 類文件,但是可以有相同的 res 資源文件。
渠道目錄下 java 類無法使用 main 公共目錄下 layout 資源。
渠道目錄下會覆蓋 main 目錄下的資源:layout 布局資源;drawable、mipmap 的圖片資源;…
渠道目錄下會合并到 main 目錄下的資源:values 資源;…
未使用到的:
目前暫未使用到的 sourceSets 配置,可參考博客鏈接。
多維度打包博客鏈接。
總結
- 上一篇: 《计算机科学与探索》期刊 从投稿到以为录
- 下一篇: 中关村被骗记(维权全过程)