這里要用到 productFlavors ,productFlavors 可以用來(lái)自定義應(yīng)用構(gòu)建版本
1.區(qū)分渠道尔艇,使用對(duì)應(yīng)的包名
在 build.gradle文件中 android 目錄下添加 以下代碼即可
productFlavors {
//默認(rèn),不設(shè)置 applicationId ,繼承 defaultConfig 中的配置
flavors_default {
}
//開(kāi)發(fā)版本, applicationId 替換為 com.xxx.dev
flavors_dev {
applicationId "com.xxx.dev"
}
//發(fā)布版本, applicationId 替換為 com.xxx.release
flavors_release {
applicationId "com.xxx.release"
}
}
2.區(qū)分渠道报腔,使用對(duì)應(yīng) App名稱(chēng)蜈彼,應(yīng)用圖標(biāo),常量 ,圖片資源等
- 替換 AndroidManifest.xml 中的屬性
該方案通過(guò)在 AndroidManifest.xml 文件中 application 標(biāo)簽下指定 <mate-data> 設(shè)置占位符來(lái)實(shí)現(xiàn)動(dòng)態(tài)替換屬性值总滩。
在 build.gradle文件中
注:此方式可以能會(huì)引起異常如下
Error:Execution failed for task ':app:processDebugManifest'.
>Manifest merger failed with multiple errors, see logs
此問(wèn)題產(chǎn)生原因大概有三個(gè):
1.清單文件有錯(cuò),這種錯(cuò)不會(huì)在編譯時(shí)指出來(lái),當(dāng)然as中還是可以看到的
2.引入的三方包存在相同的label icon 等名字
解決:清單文件用tools
然后添加 replace字段
如 tools:replace="icon,label" 即可
- 替換 資源文件 drawable,String,assets目錄下的文件等
在 main 的同級(jí)目錄下創(chuàng)建以渠道名命名的文件夾纲堵,然后創(chuàng)建資源文件(路徑要與 main 中的一致),然后打包的時(shí)候 gradle 就會(huì)自己替換或者合并資源闰渔。
例如席函, App 的默認(rèn) icon 路徑為 main\res\mipmap-hdpi\ic_launcher.png ,那么 flavors_dev的路徑就為 flavors_dev\res\mipmap-hdpi\ic_launcher.png 冈涧,打包 flavors_dev 渠道的時(shí)候會(huì)自動(dòng)替換圖片茂附。同理assets中文件如下:
- 區(qū)分渠道正蛙,動(dòng)態(tài)修改指定的常量
使用 BuildConfig 的變量
當(dāng)我們定義如下字段之后,編譯后自動(dòng)生成文件营曼,在 app/build/source/BuildConfig/dev/com.xxx.dev/BuildConfig 目錄乒验,
打開(kāi)這個(gè)文件,我們就能看到我們所定義的字段了蒂阱。
1.設(shè)置字段 使用 buildConfigField
設(shè)置好后編譯一下锻全,咦,什么鬼录煤,怎么出錯(cuò)了鳄厌?
明明設(shè)置的字符串怎么會(huì)這樣,好了這是我們需要注意的地方妈踊,設(shè)置值需要這樣寫(xiě)
它的意思是 "default" 這個(gè)整體是屬于一個(gè)字符串,然后在編譯一下
恩了嚎,ok
2.使用字段
3.使用Gradle命令打包
常用命令 看這里
-
gradlew assembleDebug
打包所有渠道的 debug 版本
-
gradlew assembleRelease
打包所有渠道的 release 版本
-
gradlew assembleflavors_devRelease
單獨(dú)打包 flavors_dev 的 release 版本
-
gradlew assembleflavors_devDebug
單獨(dú)打包 flavors_dev 的 Debug 版本