亲,在开发的时候你是否遇到过,测试MM一会跟你要一个测试包或者正式包的情况,如果只是换换接口地址还好说,但是有些三方的东西注册码也有正式环境跟测试环境之分,每次发包还要记住修改过来,这样很容易就忘记修改而带来不必要的麻烦。每当这时候就感觉很蛋疼啊,有没有法子来改变这一现状呢,经过几番探索终于发掘出了一劳永逸的方法----通过Gradle来进行配置。
首先解决手动替换接口地址问题
这个是根据代码中自动设置 debug 跟 release 包 log 打印不打印进行的延伸,具体操作如下:
在 Android studio 的 module 的 gradle 配置文件中,在 buildTypes 节点下可以配置自定义参数,这里我们在debug版本中定义LOG_DEBUG为true,在 release 版本中定义 LOG_DEBUG 为 false。这样在编译的时候就会在 gradle 的编译类BuildConfig中生成成员变量: LOG_DEBUG
若是正式环境则 LOG_DEBUG 的值为 false
若是测试环境则 LOG_DEBUG 的值为 true
如下图所示:
设置联网接口的时候就如下设置:
public static final String url = BuildConfig.LOG_DEBUG?"http://192.168.01": "http://www.baidu.com";
到时候打包就自动对应相应的网址接口。
其次解决三方在Manifest文件的配置问题
这里使用了 gradle 在编译时动态设置 Android Manifest的功能,通过manifestPlaceholders,我们可以在AndroidManifest中定义一个变量,在build.gradle中动态的替换掉,十分方便,语法也十分简单。我们这里以用的融云为例:
<meta-data
android:name="RONG_CLOUD_APP_KEY"
android:value="${rong_cloud_app_key}"
/>
接着,我们在build.gradle文件中根据不同的环境,设置生成不同appkey的apk:
buildTypes {
debug {
manifestPlaceholders = [rong_cloud_app_key: "你替代的内容"]
}
release {
manifestPlaceholders = [rong_cloud_app_key: "你替代的内容"] }
}
注意:这里的“你替代的内容”,不能为特殊关键词,比如:TRUE,否则在Java代码中获取不到meta-data中的值
错误实例:
manifestPlaceholders = [oem: "TRUE"]
如果你想要替换多个变量,假如你需要两个变量要替换,需要按照下面形式进行:
<meta-data
android:name="RONG_CLOUD_APP_KEY"
android:value="${rong_cloud_app_key}"
/>
<meta-data
android:name="RONG_CLOUD_APP_SECRET"
android:value="${rong_cloud_app_secret}"
/>
buildTypes {
debug {
manifestPlaceholders = [rong_cloud_app_key: "你替代的内容",
rong_cloud_app_secret: "你替代的内容"]
}
...
最后进行打包操作
点击 studio 最右侧的 Gradle 按钮,找到主项目下的 build 文件夹,如下图所示:
红框里面是定义的打包渠道号,双击一个就会打包,打好的包会放在下图位置上:
直接一次到位,测试包跟正式包都有了,测试MM相要什么包就直接给就行了,不用在代码里进行繁琐的调试了。哈哈
又可以愉快的玩耍了,呵呵