可以使用下面三种技术来满足要求:
使用 gradle 在编译时动态设置 Android resValue
修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值
在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 体内写上类似:
resValue "string", "AppName", "app1"
相当于在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\""
gradle sync 一下后,BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。
如何使用在java中使用,详见这篇文章
使用 gradle 在编译时动态设置 Android Manifest
下面介绍如何设置标签中的变量,如何使用标签中的变量,请参考这里
使用manifestPlaceholders改变< meta-data>(推荐)
而在新版本的gradle中,processManifest这个方法被移除掉了,而提供了一个新的功能manifestPlaceholders,我们可以在AndroidManifest中定义一个变量,在build.gradle中动态的替换掉,十分方便,语法也十分简单。对比上面的功能,我们需要动态替换友盟的appkey,需要在AndroidManifest中定义一个变量
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,是不是感觉好多了。^ ^
如果你想要替换多个变量,假如你需要两个变量要替换,需要按照下面形式进行
android:name="UMENG_APPKEY"
android:value="${umeng_app_key}"/>
android:name="UMENG_SECRET"
android:value="${umeng_app_secret}"/>
buildTypes {
debug {
manifestPlaceholders = [umeng_app_key: "你替代的内容",umeng_app_secret:"你要替换的内容"]
}
...
}