這裏要用到 productFlavors ,productFlavors 能夠用來自定義應用構建版本android
在 build.gradle文件中 android 目錄下添加 如下代碼便可android-studio
productFlavors { //默認,不設置 applicationId ,繼承 defaultConfig 中的配置 flavors_default { } //開發版本, applicationId 替換爲 com.xxx.dev flavors_dev { applicationId "com.xxx.dev" } //發佈版本, applicationId 替換爲 com.xxx.release flavors_release { applicationId "com.xxx.release" } }
該方案經過在 AndroidManifest.xml 文件中 application 標籤下指定 <mate-data> 設置佔位符來實現動態替換屬性值。app
在 build.gradle文件中 ide
注:此方式能夠能會引發異常以下gradle
Error:Execution failed for task ':app:processDebugManifest'. >Manifest merger failed with multiple errors, see logs
此問題產生緣由大概有三個:ui
1.清單文件有錯,這種錯不會在編譯時指出來,固然as中仍是能夠看到的debug
2.引入的三方包存在相同的label icon 等名字code
解決:清單文件用toolsorm
而後添加 replace字段
如 tools:replace="icon,label" 便可 xml
在 main 的同級目錄下建立以渠道名命名的文件夾,而後建立資源文件(路徑要與 main 中的一致),而後打包的時候 gradle 就會本身替換或者合併資源。
例如, App 的默認 icon 路徑爲 main\res\mipmap-hdpi\ic_launcher.png ,那麼 flavors_dev的路徑就爲 flavors_dev\res\mipmap-hdpi\ic_launcher.png ,打包 flavors_dev 渠道的時候會自動替換圖片。同理assets中文件以下:
使用 BuildConfig 的變量
當咱們定義以下字段以後,編譯後自動生成文件,在 app/build/source/BuildConfig/dev/com.xxx.dev/BuildConfig 目錄,
打開這個文件,咱們就能看到咱們所定義的字段了。
1.設置字段 使用 buildConfigField
設置好後編譯一下,咦,什麼鬼,怎麼出錯了?
明明設置的字符串怎麼會這樣,好了這是咱們須要注意的地方,設置值須要這樣寫
它的意思是 "default" 這個總體是屬於一個字符串,而後在編譯一下
恩,ok
2.使用字段
經常使用命令 看這裏
gradlew assembleDebug
打包全部渠道的 debug 版本
gradlew assembleRelease
打包全部渠道的 release 版本
gradlew assembleflavors_devRelease
單獨打包 flavors_dev 的 release 版本
gradlew assembleflavors_devDebug
單獨打包 flavors_dev 的 Debug 版本