Gradle 一套程式碼編譯成不同的包,不同的名字和logo
前幾天專案閒暇之餘看了一下同事做的這個功能,之前沒做過,學習了一下,現總結如下:
主要分為三部曲:
一、在AndroidManifest.xml中定義渠道,程式碼如下,這裡的name值隨意定義:
<meta-data android:name="APP_CHANNEL" android:value="${APP_CHANNEL_VALUE}" />
二、app的Gradle中定義渠道以及其他資訊
1、定義渠道簽名
signingConfigs { App1 { storeFile file("keystore/t.jks") storePassword "***" keyAlias "***" keyPassword "***" } App2 { storeFile file("keystore/t1.jks") storePassword "***" keyAlias "***" keyPassword "***" } App3 { storeFile file("keystore/t2.jks") storePassword "***" keyAlias "***" keyPassword "***" } }
2、定義各渠道applicationId,版本、appName、logo等等資訊,這裡定義不同的applicationId也就可以同一個包生成不同的app,在同一個手機上安裝了,這裡的resValue "string", "mapp_name", "測試App1" ,就是定義app name,在AndroidManifest.xml中對應 android:label="@string/mapp_name" ,這樣就可以更改app name,這裡的resValue常用於設定string.xml中的一些值,比如定義 string
定義intresValue "integer", "number", "1"。manifestPlaceholders 對應AndroidManifest.xml中定義的值,下面程式碼的APP_CHANNEL_VALUE就是meta-data裡面定義的,在這裡動態賦值。這裡的app_icon就是android:icon="${app_icon}" ,
這裡的buildConfigField對應BuildConfig檔案裡的常量,比如如果我們的不同包的api的host不同的話,就可以在這裡為不同包設定不同的host,比如這裡的buildConfigField "String", "HOST", '"http://www.jd.com"'就是為app1設定的host,然後編譯一下就可使用,然後使用的時候就是BuildConfig.HOST + "api/product",然後就是設定每個不同包的簽名 signingConfig signingConfigs.App1就是對應signingConfigs定義的App1。app_icon資原始檔應該在main的同級目錄建立不同的包,命名應該和signingConfigs中定義的一樣,然後再放對應的res資源,如下圖:
productFlavors { app1 { applicationId "com.news.star.news1" versionCode 1 versionName "1.0.0" resValue "string", "mapp_name", "測試App1" manifestPlaceholders = [APP_CHANNEL_VALUE: "app1", app_icon : "@mipmap/logo_desk"] buildConfigField "String", "HOST", '"http://www.jd.com/"' signingConfig signingConfigs.App1 } app2 { applicationId "com.news.star.news2" versionCode 2 versionName "1.0.1" resValue "string", "mapp_name", "測試App2" manifestPlaceholders = [APP_CHANNEL_VALUE: "app2", app_icon : "@mipmap/logo_desk"] buildConfigField "String", "HOST", '"http://www.tm.com/"' signingConfig signingConfigs.App2 } app3 { applicationId "com.news.star.news3" versionCode 3 versionName "1.1.0" resValue "string", "mapp_name", "測試App3" manifestPlaceholders = [APP_CHANNEL_VALUE: "app3", app_icon : "@mipmap/logo_desk"] buildConfigField "String", "HOST", '"http://www.xm.com/"' signingConfig signingConfigs.App3 } }
經過以上的配置基本都已完成,編譯的時候應該會提示如下錯誤:
All flavors must now belong to a named flavor dimension.
需要我們配置flavorDimensions
溫馨提示:
做了不同包以後本地更新下載的程式碼一般情況下需要更改一下了,在7.0的下載許可權定義APP_File_Provider的時候,就需要利用上面說過的BuildConfig的方式去為不同的包配置了,用法是
FileProvider.getUriForFile(mContext, BuildConfig.APP_FILE_PROVIDER, apkfile);
以上純屬自我總結,如有錯誤請大佬指正,多謝。