前言
在項目中,我們有時會需要根據不同的項目環境,使用不同的項目變量,
舉例:
- 在測試環境中需要app訪問的服務器地址是測試服務器
- 正式發佈下的app需要訪問正式服務器。
可以使用下面三種技術來滿足要求:
使用 gradle 在編譯時動態設置 Android resValue
修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值
在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:
resValue "string", "AppName", "app1"
意爲把名爲 AppName 的 string value 值改爲 app1
使用 gradle 在編譯時動態設置 Android BuildConfig
在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 體內寫上類似:
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
gradle sync 一下後,BuildConfig.ENDPOINT 就會被賦值爲 http://example.com 就可以供 Java 代碼調用了。
下面介紹如何設置標籤中的變量,如何使用標籤中的變量,請參考這裏
使用 gradle 在編譯時動態設置 Android Manifest
方法一:(不推薦)
在之前版本的gradle中,大部分的思路都是在AndroidManifest中定義一個變量,然後在編譯的時候,找出那個AndroidManifest中的變量,將它替換掉。
如友盟的多渠道打包,在原來的 AndroidManifest.xml 文件中添加:
<meta-data android:value="UMENG_CHANNEL_VALUE"
android:name="UMENG_CHANNEL"/>
然後使用在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")
}
}
}
方法二:使用manifestPlaceholders改變< meta-data>(推薦)
而在新版本的gradle中,processManifest這個方法被移除掉了,而提供了一個新的功能manifestPlaceholders,我們可以在AndroidManifest中定義一個變量,在build.gradle中動態的替換掉,十分方便,語法也十分簡單。對比上面的功能,我們需要動態替換友盟的appkey,需要在AndroidManifest中定義一個變量
<meta-data
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
接着,我們在build.gradle文件中根據不同的環境,生成不同appkey的apk。
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的內容"]
}
release {
manifestPlaceholders = [umeng_app_key: "你替代的內容"]
}
develop {
manifestPlaceholders = [umeng_app_key: "你替代的內容"]
}
}
注意:這裏的“你替代的內容”,不能爲特殊關鍵詞,比如:TRUE,否則在Java代碼中獲取不到meta-data中的值,
錯誤示例:
manifestPlaceholders = [oem: "TRUE"]
運行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}"/><pre name="code" class="java">buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"]
}
...
}