android重新编译res,使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中lt;meta-datagt;变量的值...
你也能夠查看我的其它同類文章。也會讓你有一定的收貨
關(guān)于使用Gradle來控制版本號和生成不同版本號的代碼。我總結(jié)了三篇文章,網(wǎng)上關(guān)于這些知識,都比較零散。我在學(xué)習(xí)這些的之前。根本不知道還有這種方法。所以說不知道并不可怕,可怕的是不知道自己不知道。相信這三篇文章,會給你不少靈感
前言
在項目中,我們有時會須要依據(jù)不同的項目環(huán)境,使用不同的項目變量,
舉例:
在測試環(huán)境中須要app訪問的server地址是測試server
正式公布下的app須要訪問正式server。
能夠使用以下三種技術(shù)來滿足要求:
使用 gradle 在編譯時動態(tài)設(shè)置 Android resValue
改動 res value 的方式。比方改動 strings.xml 文件里的 AppName 的值
在你的 gradle 文件 buildTypes 或者 productFlavors 以下,如 release 體內(nèi)寫上相似:
resValue "string", "AppName", "app1"
意為把名為 AppName 的 string value 值改為 app1
使用 gradle 在編譯時動態(tài)設(shè)置 Android BuildConfig
在你的 gradle 文件 buildTypes 或者 productFlavors 以下,如 release 體內(nèi)寫上相似:
buildConfigField "String", "ENDPOINT", "\"http://example.com\""
gradle sync 一下后,BuildConfig.ENDPOINT 就會被賦值為 http://example.com 就能夠供 Java 代碼調(diào)用了。
以下介紹怎樣設(shè)置標(biāo)簽中的變量,怎樣使用標(biāo)簽中的變量,請參考這里
使用 gradle 在編譯時動態(tài)設(shè)置 Android Manifest
方法一:(不推薦)
在之前版本號的gradle中,大部分的思路都是在AndroidManifest中定義一個變量。然后在編譯的時候,找出那個AndroidManifest中的變量,將它替換掉。
如友盟的多渠道打包,在原來的 AndroidManifest.xml 文件里加入:
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中動態(tài)的替換掉,十分方便。語法也十分簡單。
對照上面的功能,我們須要動態(tài)替換友盟的appkey,須要在AndroidManifest中定義一個變量
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
接著,我們在build.gradle文件里依據(jù)不同的環(huán)境。生成不同appkey的apk。
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的內(nèi)容"]
}
release {
manifestPlaceholders = [umeng_app_key: "你替代的內(nèi)容"]
}
develop {
manifestPlaceholders = [umeng_app_key: "你替代的內(nèi)容"]
}
}
注意:這里的“你替代的內(nèi)容”。不能為特殊關(guān)鍵詞,比方:TRUE,否則在Java代碼中獲取不到meta-data中的值。
錯誤演示樣例:
manifestPlaceholders = [oem: "TRUE"]
執(zhí)行g(shù)ralde clean build。你就能夠生成不同的appkey的apk,是不是感覺好多了。^ ^
假設(shè)你想要替換多個變量,假如你須要兩個變量要替換,須要依照以下形式進(jìn)行
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
android:name="UMENG_SECRET"
android:value="${umeng_app_secret}"/>
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的內(nèi)容",umeng_app_secret:"你要替換的內(nèi)容"]
}
...
}
總結(jié)
以上是生活随笔為你收集整理的android重新编译res,使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中lt;meta-datagt;变量的值...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java random用法_JAVA面试
- 下一篇: 如何把手变成手控_手把手教您如何在生产环