在开发中,测试环境与正式环境是分开的,常常需要修改配置打不同环境下的apk,而且如何在android平台下让debug和release的app共存?本着提高效率避免重复工作的目的与大家分享一个方案。
本文是基于强大的AndroidStudio的构建工具gradle来实现的。
配置应用的build.gradle文件
android{
...
buildTypes{
debug{
//在编译打包时会给包名加上后缀
applicationIdSuffix'.debug'
}
release{
}
}
...
}
之后开启Build Variants界面(在androidstudio左下角的窗口选择器可以选择),
选择不同的选项,run的时候走的就是对应的gradle配置。
权限重复的问题
如果项目中使用了第三方库,而且在AndroidManifest.xml中声明了权限,例如个推
<permission
android:name="getui.permission.GetuiService.package_name"
android:protectionLevel="normal"/>
android5.0以上安装应用时会报duplicate permission exception,所以要保证debug和release安装包的permisson name不同,
可以在gradle文件下debug和release节点下配置一个字段,然后在AndroidManifest.xml中引用来实现打包时动态配置AndroidManifest.xml中的信息,如下:
- 修改AndroidManifest.xml
<permission
android:name="${getui_name}"
android:protectionLevel="normal"/>
-
配置build.gradle
debug{ applicationIdSuffix'.debug' getui_name:"getui.permission.GetuiService.package_name_debug", } release{ getui_name:"getui.permission.GetuiService.package_name", }
AndroidManifest.xml其他动态信息也可以采用这种方式配置,如app_name,可以实现测试包和正式包的名字不同。
代码中使用geadle中的动态字段
例如:可以在gradle文件中debug和release节点下如下配置字段,然后在代码中以BuildConfig.IS_DEBUG形式来引用
release{
...
buildConfigField "boolean", "IS_DEBUG", "false"
...
}
debug{
...
buildConfigField "boolean", "YY_DEBUG", "true"
...
}
PS
AndroidManifest.xml如果配置了provider,也需要采用上面的方式配置provider的
android:authorities属性,只要保证名称不同即可,否则安装会报异常。包名加了后缀后,微信无法调起,所以测试时如果设计微信则要处理一下。