使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中<meta-data>變量的值
轉載請標明出處:http://blog.csdn.net/xx326664162/article/details/49247815 文章出自:薛瑄的博客
你也能夠查看我的其它同類文章。也會讓你有一定的收貨
關於使用Gradle來控制版本號和生成不同版本號的代碼。我總結了三篇文章,網上關於這些知識,都比較零散。我在學習這些的之前。根本不知道還有這種方法。所以說不知道並不可怕,可怕的是不知道自己不知道。相信這三篇文章,會給你不少靈感
Gradle構建控制Log開關——BuildConfig\自己定義
使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中 < meta-data>變量的值
Gradle編譯生成不同的版本號。動態設定應用標題 / 應用圖標 / 替換常量
前言
在項目中,我們有時會須要依據不同的項目環境,使用不同的項目變量,
舉例:
- 在測試環境中須要app訪問的server地址是測試server
- 正式公布下的app須要訪問正式server。
能夠使用以下三種技術來滿足要求:
使用 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}"/>
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的內容",umeng_app_secret:"你要替換的內容"]
}
...
}
怎樣在Android獲取Manifest中< meta-data>元素的值
參考
http://hong1024.com/2015/02/10/%E4%BD%BF%E7%94%A8manifestPlaceholders%E6%9B%BF%E6%8D%A2%E5%8F%98%E9%87%8F/
http://write.blog.csdn.net/mdeditor#!postId=49247815
使用 gradle 在編譯時動態設置 Android resValue / BuildConfig / Manifes中<meta-data>變量的值