Gradle实战:不同编译类型的包同设备共存
查看原文:http://blog.csdn.net/u010818425/article/details/52335844
Gradle实战系列文章:
《Gradle基本知识点与常用配置》
《Gradle实战:Android多渠道打包方案汇总》
《Gradle实战:发布aar包到maven仓库》
《Gradle实战:执行sql操作hive数据库》
一、需求背景
在测试阶段,有时需要在同一个设备上同时安装debug、beta、release等不同编译类型的包,或者同时安装当前版本与某个历史版本的包,以方便比较查看;但是,在同一个设备上,一个包名只能安装一个应用,本文将围绕该问题介绍完整的解决方案。
二、实践
1. 基本概念
在上一篇文章《 Gradle实际应用(一):批量打包》中我们已经介绍过
package、applicationId、PlaceHolder的概念,本文主要通过这三个参数来实现多包共存。
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 studio gradle 多版本多apk打包(打包系列教程之五)
查看原文:http://blog.csdn.net/u010818425/article/details/52335844
Gradle实战:不同编译类型的包同设备共存的更多相关文章
- Gradle实战:发布aar包到maven仓库
查看原文:http://blog.csdn.net/u010818425/article/details/52441711 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- Gradle 使用本地的Jar包(gradle oracle ojdbc14 )
Gradle 使用本地的Jar包(gradle oracle ojdbc14 ) 因为Oracle的驱动包在Maven上是没办法直接下载到的,所以在使用Gradle的使用,会导致无法加载Oracle, ...
- (android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图
(android 地图实战开发)2 创建MapActivity,根据设备当前位置,显示地图 http://www.cnblogs.com/macroxu-1982/archive/2011/09/13 ...
- gradle导出依赖的jar包
gradle导出依赖的jar包 http://blog.csdn.net/yuhentian/article/details/50426896
- Gradle | Gradle项目无法导入依赖包
Gradle | Gradle项目无法导入依赖包 背景 今天使用idea导入一个Gradle项目,使用 gradle build构建成功,但是项目还是无法正常导入依赖包,显示错误如下: 解决方案 后来 ...
- Http实战之Wireshark抓包分析
Http实战之Wireshark抓包分析 Http相关的文章网上一搜一大把,所以笔者这一系列的文章不会只陈述一些概念,更多的是通过实战(抓包+代码实现)的方式来跟大家讨论Http协议中的各种细节,帮助 ...
- 如何解决使用Gradle时出现的jar包冲突
前言 在我之前使用Gradle的博文中已经提到,Gradle对依赖的管理是比较智能的,如果有两个包依赖于相同的包,而版本不同的时候,Gradle会进行自动的选择,从而避免jar包的冲突. 也就是说,在 ...
- Android 逆向实战篇(加密数据包破解)
1. 实战背景由于工作需要,要爬取某款App的数据,App的具体名称此处不便透露,避免他们发现并修改加密逻辑我就得重新破解了. 爬取这款App时发现,抓包抓到的数据是加密过的,如图1所示(原数据较长, ...
随机推荐
- Heritrix 3.1.0 源码解析(三十七)
今天有兴趣重新看了一下heritrix3.1.0系统里面的线程池源码,heritrix系统没有采用java的cocurrency包里面的并发框架,而是采用了线程组ThreadGroup类来实现线程池的 ...
- hdoj 5399 Tpp simple
WA了一下午.... 1WA:T了,因为阶乘没打表所以时间超了.. 2WA,3WA:runtime error,检查的value数组开小了,应该是MAXN.. 4WA.5WA.6WA:改了改对cnt的 ...
- Oracle中TO_DATE格式
转自:http://www.cnblogs.com/ajian/archive/2009/03/25/1421063.html TO_DATE格式(以时间:2007-11-02 13:45:25为 ...
- Flex应用程序如何启动
Flex应用程序启动 编写一个简单的Flex应用程序并不复杂,就算你从来没接触过Flex程序设计,照着帮助的实例步骤,不需花多长时间也能做出一个漂亮简捷的小程序出来.不过,随着对Flex程序编写的深入 ...
- MFC中关于子对话框中编辑框不能编辑的问题
最近在用MFC写程序.发现子对话框中的编辑框不能编辑.具体问题是这样的: 我有一个对话框YhglDlg,创建了这个对话框的子对话框ZjyhxxDlg,子对话框的Style属性为Child,Border ...
- TMS3705A PCF7991AT 线路图
- li下用了浮动IE6的问题
li下用了浮动IE6的问题 直接看HTML <ul> <li><a href="#" target="_blank">沃尔沃 ...
- 将Excel另存为CSV格式文件
直接将Excel另存为CSV,速度很快: $CurrentPath = $MyInvocation.MyCommand.Path.substring(0,$MyInvocation.MyCommand ...
- vector和iterator及collection
Collection是所有集合的最上层接口,它里面定义了所有集合对象都可以进行的操作:它有两个子接口,分别是List和Set.List会记录放在其中元素的放入顺序,形象地说,可以认为是一个传送带,它上 ...
- C++学习笔记之函数指针
与数据项类似,函数也有地址.函数的地址是存储其机器语言代码的内存开始的地方. 一.函数指针的基础知识 假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都 ...