背景
开发中我们经常会遇到这样的情况,比如:
- 几乎所有的项目都会有测试环境和正式环境,有的甚至的还有开发环境,不同的环境有不同的 API 根地址,测试环境和正式环境每次打包都需要手动去更改 API 根地址;
- 很多第三方SDK比如百度地图并没有区分测试环境和正式环境,那么我们就需要去申请两个不同的 APP KEY 标识(因为 APP KEY 标识是根据包签名来区分的),而且很多 APP KEY 都只能在 manifest 中配置,每次更改环境都需要去手动更改 APP KEY, 一旦第三方包比较多,那叫一个麻烦了啊。。。最重要的是万一你少改了一个或复制错了一个,一旦上线了就成了悲剧。。。悲剧。。。悲剧。。。
- 别问我为什么悲剧,我也不知道。
解决方法
以 API 根地址和百度地图 KEY 来举例说明
1、配置 gradle.properties
BASE_API_DEBUG=\"http://api.android.com\"
BASE_API_PRODUCT=\"http://api.android.test\"
BAIDU_APPKEY_VALUE_DEBUG=xrAslSGF7xjSLI2kFFgQb1Dl
BAIDU_APPKEY_VALUE_PRODUCT=aMfi0c1f3oeefjmMpmEEeGPs
2、配置项目的 build.gradle 文件
buildTypes {
release {
buildConfigField("String", "BASE_API", project.BASE_API_PRODUCT)
manifestPlaceholders = [BAIDU_APPKEY_VALUE: project.BAIDU_APPKEY_VALUE_PRODUCT]
}
debug {
buildConfigField("String", "BASE_API", project.BASE_API_DEBUG)
manifestPlaceholders = [BAIDU_APPKEY_VALUE: project.BAIDU_APPKEY_VALUE_DEBUG]
}
}
buildConfigField(“String”, “BASE_API”, project.BASE_API_PRODUCT)
BASE_API_PRODUCT 和 BASE_API_DEBUG 就是我们在 gradle.properties 中定义的正式环境和测试环境的 API 根地址。这一行代码编译后会在 BuildConfig.java 文件中生成下面的代码。
public static final String BASE_API = “http://api.android.com“; 正式环境
public static final String BASE_API = “http://api.android.test“; 测试环境
这样我们就可以直接调用 BuildConfig.BASE_API 来使用 API 根地址了。
manifestPlaceholders = [BAIDU_APPKEY_VALUE: project.BAIDU_APPKEY_VALUE_PRODUCT]
BAIDU_APPKEY_VALUE_PRODUCT 是我们在 gradle.properties 中定义的百度地图 APP KEY, 当然了,如果你有多个 SDK 的 KEY , 可以这样写:
manifestPlaceholders = [BAIDU_APPKEY_VALUE : project.BAIDU_APPKEY_VALUE_PRODUCT
, GETUI_APPID_VALUE : project.GETUI_APPID_VALUE_PRODUCT
, GETUI_APPKEY_VALUE : project.GETUI_APPKEY_VALUE_PRODUCT
, GETUI_APPSECRET_VALUE: project.GETUI_APPSECRET_VALUE_PRODUCT
, QQ_SHARE_APP_ID_VALUE: project.QQ_SHARE_APP_ID_PRODUCT]
顾名思义, manifestPlaceholders 就是配置在 manifest 中引用的变量的。
配置完之后,我们就可以在 manifest 中使用了。
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="${BAIDU_APPKEY_VALUE}" />
<meta-data
android:name="PUSH_APPID"
android:value="${GETUI_APPID_VALUE}" />
<meta-data
android:name="PUSH_APPKEY"
android:value="${GETUI_APPKEY_VALUE}" />
<meta-data
android:name="PUSH_APPSECRET"
android:value="${GETUI_APPSECRET_VALUE}" />