查看原文:
Gradle实战系列文章:
一、需求背景
在测试阶段,有时需要在同一个设备上同时安装debug、beta、release等不同编译类型的包,或者同时安装当前版本与某个历史版本的包,以方便比较查看;但是,在同一个设备上,一个包名只能安装一个应用,本文将围绕该问题介绍完整的解决方案。
二、实践
1. 基本概念
在上一篇文章中我们已经介绍过
package
、applicationId
、PlaceHolder
的概念,本文主要通过这三个参数来实现多包共存。
2. 修改应用名称
-
AndroidManifest
文件中的label
采用PlaceHolder
的形式,使其可以在build.gradle
文件中动态赋值,因此实现不同的编译类型有不同的应用名称 -
增加string值
Test Test-beta Test-debug 同理,我们也可实现对
icon
的修改。
3. build.gradle
文件中配置:
-
以
debug
为例//设置全局变量,作为开关
def isCoexist = false; //需要多包共存时设为true/**
如果采用jekins打包时,执行命令:./gradlew assembleDebug -DmultiApp='true'
如果采用AS打包时,修改变量:isCoexist = true
*/
String appId = defaultConfig.applicationId // 读取原始的applicationId
String multiApp = System.properties['multiApp'] // 读取打包命令中设置的系统参数if (isCoexist) {multiApp = "true"
}
debug() {if ("${multiApp}" != "${null}") { //采用该方式是因为某些机器上equals方法失效,暂无解 appId = defaultConfig.applicationId + ".debug" //拼上后缀 applicationIdSuffix ".debug" //拼上后缀(gradle自带方法)}manifestPlaceholders = [app_label: "@string/app_name_debug"] // AndroidManifest文件中的label就会被赋值println "applicationId: " + appId + " (debug)"
}
4. Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]
问题解决
如果应用中未使用
ContentProvider
,则上述配置即可;如果使用了ContentProvider
,比如集成了个推推送,其中有一个DownloadProvider
,因此安装时会报错,,解决如下:
// 在AndroidManifest文件中,修改authorities,如:改为: 相应地,在build.gradle文件中添加DownloadProvider的赋值: manifestPlaceholders = [app_label: "@string/app_name_debug", DownloadProvider: appId]
5. 第三方应用appkey验证失败问题解决
以百度地图为例,百度地图需要开发者在其开放平台以包名和签名为应用注册一个
appkey
,生成的appkey
填写在AndroidManifest
文件中,如下:
此时,我们如果安装debug包,则包名变成了
com.company.appname.debug
,那么,appkey
就无法验证通过了,百度地图也将无法展示。试想,我们能否修改百度地图验证时上传的包名呢?然而,经过一番努力,查看了百度地图sdk包,我们无法实现这一点。那么,只能为测试包申请一个appkey
了,然后再通过PlaceHolder
动态地设值。相应的修改如下:在
build.gradle
文件中,以debug
为例,修改如下:manifestPlaceholders = [app_label: "@string/app_name_debug", DownloadProvider: appId, BaiduMap_API_KEY: your_baidu_appkey_debug]
深入学习
查看原文: