Gradle实战:不同编译类型的包同设备共存

查看原文:http://blog.csdn.net/u010818425/article/details/52335844

Gradle实战系列文章:
《Gradle基本知识点与常用配置》
《Gradle实战:Android多渠道打包方案汇总》
《Gradle实战:发布aar包到maven仓库》
《Gradle实战:执行sql操作hive数据库》


一、需求背景

在测试阶段,有时需要在同一个设备上同时安装debug、beta、release等不同编译类型的包,或者同时安装当前版本与某个历史版本的包,以方便比较查看;但是,在同一个设备上,一个包名只能安装一个应用,本文将围绕该问题介绍完整的解决方案。


二、实践

1. 基本概念

在上一篇文章《 Gradle实际应用(一):批量打包》中我们已经介绍过packageapplicationIdPlaceHolder的概念,本文主要通过这三个参数来实现多包共存。

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打包(打包系列教程之五)

查看原文:http://blog.csdn.net/u010818425/article/details/52335844

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值