Gradle实战:不同编译类型的包同设备共存
2016-09-24 16:32
281 查看
查看原文:http://blog.csdn.net/u010818425/article/details/52335844
Gradle实战系列文章:
《Gradle基本知识点与常用配置》
《Gradle实战:Android多渠道打包方案汇总》
《Gradle实战:发布aar包到maven仓库》
《Gradle实战:执行sql操作hive数据库》
一、需求背景
在测试阶段,有时需要在同一个设备上同时安装debug、beta、release等不同编译类型的包,或者同时安装当前版本与某个历史版本的包,以方便比较查看;但是,在同一个设备上,一个包名只能安装一个应用,本文将围绕该问题介绍完整的解决方案。
二、实践
1. 基本概念
2. 修改应用名称
AndroidManifest文件中的
label采用
PlaceHolder的形式,使其可以在
build.gradle文件中动态赋值,因此实现不同的编译类型有不同的应用名称
<application android:name="com.company.appname.myApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="${app_label}" //将label值设置为变量 android:theme="@style/Theme.AppCompat.NoActionBar" tools:replace="android:icon,android:theme,android:label">
增加string值
<string name="app_name">Test</string> <string name="app_name_beta">Test-beta</string> <string name="app_name_debug">Test-debug</string>
同理,我们也可实现对
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,如: <provider android:name="com.igexin.download.DownloadProvider" android:authorities="downloads.com.company.appname.contentprovider" android:process=":pushservice"/> 改为: <provider android:name="com.igexin.download.DownloadProvider" android:authorities="downloads.${DownloadProvider}.contentprovider" android:process=":pushservice"/> 相应地,在build.gradle文件中添加DownloadProvider的赋值: manifestPlaceholders = [app_label: "@string/app_name_debug", DownloadProvider: appId]
5. 第三方应用appkey验证失败问题解决
以百度地图为例,百度地图需要开发者在其开放平台以包名和签名为应用注册一个
appkey,生成的
appkey填写在
AndroidManifest文件中,如下:
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="your_baidu_appkey"/>
此时,我们如果安装debug包,则包名变成了
com.company.appname.debug,那么,
appkey就无法验证通过了,百度地图也将无法展示。试想,我们能否修改百度地图验证时上传的包名呢?然而,经过一番努力,查看了百度地图sdk包,我们无法实现这一点。那么,只能为测试包申请一个
appkey了,然后再通过
PlaceHolder动态地设值。相应的修改如下:
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="${BaiduMap_API_KEY}"/>
在
build.gradle文件中,以
debug为例,修改如下:
manifestPlaceholders = [app_label: "@string/app_name_debug", DownloadProvider: appId, BaiduMap_API_KEY: your_baidu_appkey_debug]
深入学习
Android官方技术文档翻译——ApplicationId 与 PackageName
[Android] 应用的包名:ApplicationId vs PackageName
Android打包的那些事
Android Studio Gradle 多渠道,多appkey签名打包
android studio gradle 多版本多apk打包(打包系列教程之五)
相关文章推荐
- Gradle实战:不同编译类型的包同设备共存
- 编译错误类型“同时存在于”不同的dll中
- 编译错误类型“同时存在于”不同的dll中
- Duilib Demo 编译报错:(error C2371: “IDispatchEx”: 重定义;不同的基类型)
- asp.net 编译错误类型“同时存在于”不同的dll中.
- 【Andrioid】在Gradle中编译一次生成不同的版本,动态设定应用标题,应用图标,替换常量
- 安装Symbian的多个SDK,在多个SDK共存在情况下,要使用不同的SDK环境编译应用程序
- Gradle 编译时选择不同的 google-services.json
- 编译duilib遇到问题:Error C2371 "IDispatchEx重定义;不同的基类型"
- 判断访问网页是否为移动设备 不同类型设备跳转至不同链接地址
- 【Andrioid】在Gradle编译时生成一个不同的版本号,动态设置应用程序标题,应用程序图标,更换常数
- asp.net 编译错误类型“同时存在于”不同的dll中(归结)
- 非const引用参数传入不同类型编译不过的理解(拒绝将临时对象绑定为非const的引用的形参是有道理的)
- JS判断访问设备(userAgent)加载不同页面 JS判断客户端操作系统类型(platform)
- JS判断访问设备(userAgent)加载不同页面 JS判断客户端操作系统类型(platform)来定义不同的字体表现
- 不同数据类型变量在不同CPU或MCU下的内存占用情况还与编译器或编译选项有关
- 编译时类型与运行时类型不同
- Visual Studio 2010 编译Duilib源码报错: error C2371: “IDispatchEx”: 重定义;不同的基类型 解决方法
- Duilib Demo 编译报错:(error C2371: “IDispatchEx”: 重定义;不同的基类型)
- 【Java】 变量和编译时类型和运行时类型不同