使用 gradle 在編譯時動態設定 Android resValue BuildConfig Manifes中 m
你也可以檢視我的其他同類文章,也會讓你有一定的收貨
關於使用Gradle來控制版本和生成不同版本的程式碼,我總結了三篇文章,網上關於這些知識,都比較零散,我在學習這些的之前,根本不知道還有這樣的方法。所以說不知道並不可怕,可怕的是不知道自己不知道。相信這三篇文章,會給你不少靈感
前言
在專案中,我們有時會需要根據不同的專案環境,使用不同的專案變數,
舉例:
- 在測試環境中需要app訪問的伺服器地址是測試伺服器
- 正式釋出下的app需要訪問正式伺服器。
可以使用下面三種技術來滿足要求:
使用 gradle 在編譯時動態設定 Android resValue
修改 res value 的方式,比如修改 strings.xml 檔案中的 AppName 的值
在你的 gradle 檔案 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:
resValue "string", "AppName", "app1"
- 1
相當於在res/strings.xml 下增加一個名為 AppName,值為app1 的資源。在java中的使用resValue和strings.xml的方法是一樣的,context.getResources().getString(R.string.strKey);
使用 gradle 在編譯時動態設定 Android BuildConfig
在你的 gradle 檔案 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
- 1
gradle sync 一下後,BuildConfig.ENDPOINT 就會被賦值為 http://example.com 就可以供 Java 程式碼呼叫了。
如何使用在java中使用,詳見這篇文章
使用 gradle 在編譯時動態設定 Android Manifest
下面介紹如何設定標籤中的變數,如何使用標籤中的變數,請參考這裡
方法一:(不推薦)
在之前版本的gradle中,大部分的思路都是在AndroidManifest中定義一個變數,然後在編譯的時候,找出那個AndroidManifest中的變數,將它替換掉。
如友盟的多渠道打包,在原來的 AndroidManifest.xml 檔案中新增:
<meta-data android:value="UMENG_CHANNEL_VALUE" android:name="UMENG_CHANNEL"/>
- 1
- 2
- 3
- 4
然後使用在build.gradle中找出UMENG_CHANNEL_VALUE這個值,並且替換掉
android.applicationVariants.all{ variant -> println "${variant.productFlavors[0].name}" variant.processManifest.doLast{ copy{ from("${buildDir}/manifests"){ include "${variant.dirName}/AndroidManifest.xml" } into("${buildDir}/manifests/$variant.name") filter{ String line ->line.replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}") } variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml") } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
方法二:使用manifestPlaceholders改變< meta-data>(推薦)
而在新版本的gradle中,processManifest這個方法被移除掉了,而提供了一個新的功能manifestPlaceholders,我們可以在AndroidManifest中定義一個變數,在build.gradle中動態的替換掉,十分方便,語法也十分簡單。對比上面的功能,我們需要動態替換友盟的appkey,需要在AndroidManifest中定義一個變數
<meta-data android:name="UMENG_APPKEY" android:value="${umeng_app_key}"/>
- 1
- 2
- 3
- 4
接著,我們在build.gradle檔案中根據不同的環境,生成不同appkey的apk。
buildTypes { debug { manifestPlaceholders = [umeng_app_key: "你替代的內容"] } release { manifestPlaceholders = [umeng_app_key: "你替代的內容"] } develop { manifestPlaceholders = [umeng_app_key: "你替代的內容"] } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
注意:這裡的“你替代的內容”,不能為特殊關鍵詞,比如:TRUE,否則在Java程式碼中獲取不到meta-data中的值,
錯誤示例:
manifestPlaceholders = [oem: "TRUE"]
- 1
執行gralde clean build,你就可以生成不同的appkey的apk,是不是感覺好多了。^ ^
如果你想要替換多個變數,假如你需要兩個變數要替換,需要按照下面形式進行
<meta-data android:name="UMENG_APPKEY" android:value="${umeng_app_key}"/><meta-data android:name="UMENG_SECRET" android:value="${umeng_app_secret}"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
buildTypes { debug { manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"] } ... }
- 1
- 2
- 3
- 4
- 5
- 6
關注我的公眾號,輕鬆瞭解和學習更多技術