在Android项目中,默认debug版与release版的包名相同,从而导致debug版与release版两者不能共存,为了方便开发时的调试,通过gradle我们可以实现让两者在一台手机上共存

配置app目录下的build.gradle文件:

android {......buildTypes {......debug {//为debug版本的包名添加.debug后缀applicationIdSuffix ".debug"......}}
}

在debug节点里添加这个配置后,debug版本的apk包名会自动加.debug后缀,比如原本包名为com.example.application的应用,debug包名为com.example.application.debug

权限重复的问题

如果项目中使用了第三方库,而且在AndroidManifest.xml中声明了权限,例如个推

<permission
    android:name="getui.permission.GetuiService.package_name"android:protectionLevel="normal"/>

android5.0以上安装应用时会报duplicate permission exception,所以要保证debug和release安装包的permisson name不同,因此我们可以使用applicationId字段,使用方式如下:

<permissionandroid:name="getui.permission.GetuiService.${applicationId}"android:protectionLevel="normal"/>

provider authorities

<provider
    android:name="com.igexin.download.DownloadProvider"android:authorities="downloads.package_name"android:exported="true"android:process=":pushservice"/>

同样也可以使用applicationId字段来替换

    android:authorities="downloads.${applicationId}"

使用manifestPlaceholders属性来替换

但是不是所有的属性都能用applicationId来替换,比如融云这样的第三方库 
可以看到如下data节点内的host=”package_name”就不能使用applicationId字段来替换

<activity
            android:name=".activity.navigation.ConversationListActivity"android:screenOrientation="portrait"android:windowSoftInputMode="stateHidden|adjustResize"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data
                    android:host="package_name"android:pathPrefix="/conversationlist"android:scheme="rong"/></intent-filter></activity>

因此我们可以使用manifestPlaceholders属性,manifestPlaceholders顾名思义manifest占位符,上面说的${applicationId}就是gradle自带的manifest占位符,当然我们也可以自定义manifest占位符 
分别在release和debug节点下添加manifestPlaceholders属性如下所示:

android {......buildTypes {......release {.......manifestPlaceholders = [APP_NAME      : "@string/app_name",APPLICATION_ID: "@string/application_id"]}debug {//为debug版本的包名添加.debug后缀applicationIdSuffix ".debug"manifestPlaceholders = [APP_NAME      : "@string/app_name_debug",APPLICATION_ID: "@string/application_id_debug"]......}}
}

在项目的values/strings.xml文件里添加如下:

<string name="app_name">MyApplication</string><string name="app_name_debug">MyApplicationDebug</string><string name="application_id">com.example.myapplication</string><string name="application_id_debug">com.example.myapplication.debug</string>

然后将data节点内的host=”package_name”替换为 host=”${APPLICATION_ID}”

<activity
            android:name=".activity.navigation.ConversationListActivity"android:screenOrientation="portrait"android:windowSoftInputMode="stateHidden|adjustResize"><intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><data
                    android:host="${APPLICATION_ID}"android:pathPrefix="/conversationlist"android:scheme="rong"/></intent-filter></activity>

这样就能在打包release版本时包名使用release的包名,debug版本使用debug包名

app_name也同理,可以将android:label里的内容替换成manifestPlaceholders变量,如下所示:

android:label="${APP_NAME}"

这样gradle编译时就会自动替换app_name

动态打包so包

apk的大小永远是开发者头疼的问题,而so包就是apk安装包体积过大的主要原因之一,因此很多开发者都会将一些用不到的so包去除,从而减少apk体积,比如x86的so包,但是如果你需要使用Android官方提供的模拟器来测试你的应用的话,那x86的so包是必不可少的,因此这里给出一个解决方案:

就是release版本打包时不包含x86的so包,减小正式版apk的体积,debug版本则包含x86的so包,方便在官方模拟器上测试

android {......buildTypes {......release {.......//设置release版本只包含armeabi和armeabi-v7a的so包ndk {abiFilters "armeabi", "armeabi-v7a"}}debug {......//设置debug版本包含x86的so文件ndk {abiFilters "armeabi", "armeabi-v7a", "x86"}}}
}
版权声明:不为无益之事,何以遣有涯之生。 https://blog.csdn.net/lj402159806/article/details/54955431

Android通过gradle实现debug和release包名不同相关推荐

  1. Android签名详解(debug和release)

    Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被 ...

  2. Android 多渠道打包实操(更改包名、图标、主题资源 、替换常量、第三方SDK Appkey配置)

    最近在做一个通用版的会员系统,给予不同的公司使用,先前是通过切换版本分支来管理的,后面发现实在是繁琐和痛苦管理,仅仅是需要更改不同的常量.主题资源.包名.图标等等,主体代码逻辑功能基本不变. 先前了解 ...

  3. Android开发之安全彻底的修改包名

    昨天,因为项目需要对包名进行修改,经过一番折腾,项目正常使用,为此,对修改包名涉及的东西进行总结. 1.修改,AndroidManifest.xml文件 搜索并找到"package" ...

  4. Android 在Android手机上获取其他应用的包名及版本号

    获取Android手机上其他应用的包名及版本号方法有很多,可以通过AAPT从APK包中直接获取,也可以通过代码在手机上获取.显然,对于产品或者用户来说要获取这些信息,在手机上获取更为简便. 下面我们来 ...

  5. Android手机不root查看/data/data/包名目录下的文件

    1.查看当前设备 adb devices 2.进入shell命令模式 adb shell 3.查看目录下文件,进入指定包名 没有权限,这时需要对apk进行反编译后在Manifest.xml中加上 an ...

  6. android 获取monkey日志_monkey操作,获取包名,参数,日志,百分比

    monkey的基本语法都是: adb  shell  monkey  -p  包名  执行的数字 monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中,他向系统发送伪随机的用 ...

  7. Android的APP多版本,Android多版本共存-基于gradle实现debug版和release版app共存

    在开发中,测试环境与正式环境是分开的,常常需要修改配置打不同环境下的apk,而且如何在android平台下让debug和release的app共存?本着提高效率避免重复工作的目的与大家分享一个方案. ...

  8. Android 使用 Gradle 打包 - 签名配置

    序言 最近正好在项目里用到了 Gradle 打包的配置,顺便总结一下. 一般的 apk 打包类型分为 debug 和 release:debug 开启日志,不进行混淆,用于测试:release 关闭日 ...

  9. Android中清单文件引入配置参数,Android 使用gradle打包的各种配置

    原标题:Android 使用gradle打包的各种配置 在AS中利用gradle打包,可以高效并且自由地配置各种参数,发布不同的版本.关于配置gradle文件的一些做法,总结为如下. 一.替换Andr ...

最新文章

  1. codeforces271D
  2. Javaweb-----HTTP协议
  3. hadoop2.6.0安装详细步骤
  4. 数据结构算法入门--一文了解什么是复杂度
  5. iOS音频播放 (二):AudioSession 转
  6. asp.net checkboxlist绑定数据读取出来
  7. Atitit 团队工具链体系打造---开发方面提升效率的软件与技术体系 attilax总结.docx
  8. 【在大学的快乐生活】ROS,RC车,jetson nano,导航与飙车(1)配件准备
  9. [C语言学习]C语言程序设计基础(一)
  10. mysql 三种循环语句_MySQL循环语句
  11. 银行柜员网申计算机水平要求高吗,银行笔试通过率:看你网申如何?
  12. 最全互联网Linux工作规划!
  13. python图形显示不出来_Matplotlib无法显示图像的问题
  14. STM32F103--BKP
  15. java 获取主机名时报java.net.UnknownHostException
  16. WR703n安装openwrt做打印服务器
  17. 画手cv什么意思_b站cv和op是什么意思
  18. PSINS中19维组合导航模块sinsgps详解(滤波部分)
  19. 华为鸿蒙无人驾驶,特斯拉最大的对手竟是华为?Hicar+鸿蒙OS无人驾驶技术不再独大!...
  20. Qt中Enter键实现跳转按键功能

热门文章

  1. 【Go】Go 语言切片(Slice)
  2. 关于alert(12)与alert(1||2)输出问题解析
  3. Spinner的setOnItemSelectedListener(
  4. keilC51编译常见错误和警告说明
  5. uniapp做高德地图
  6. 面向NDN的网络攻击检测技术分析
  7. python 提示按任意键退出_详解Python实现按任意键继续/退出的功能 python请按任意键继续 什么意思...
  8. 手机WAP网站 相关
  9. 数据备份:备份文件/文件夹怎么操作?
  10. 利用同义词简化SQL Server 2005开发