使用Gradle生成一个App的不同版本,且可以同时安装在一个手机上

本文介绍如何利用Gradle配置实现Android App内测版与正式版的同时安装,涉及修改包名、资源文件、应用名称及ContentProviderAuthority等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

背景

开发一个App一般会生成内测版和正式版,甚至还会有不同渠道的版本,不同版本的配置可能会不一样,比如内测版会需要记录完整的日志。

Android手机对于同样的Application Id的App只能安装一个版本,如果我们需要同时安装内测版和正式版,就必须修改其中一个版本的Application Id。

解决方案

Gradle支持buildTypes和productFlavors两种定制方法,这里只介绍通过buildType的解决方案。通过productFlavors则可有效解决渠道包,arm,x86等分平台以及付费版和广告版的打包问题。

修改debug版的包名

配置如下:

 
 
  1. android {
  2. buildTypes {
  3. release {
  4. ...
  5. }
  6. debug {
  7. applicationIdSuffix '.debug'
  8. ...
  9. }
  10. }
  11. }

修正资源文件里的包名

如果你的项目里使用了自定义的View,且有自定义的属性时,会需要修正一下xml命名空间里的包名。

 
 
  1. android.applicationVariants.all { variant ->
  2. def buildType = variant.buildType
  3. def encoding = java.nio.charset.Charset.defaultCharset().toString()
  4. if (buildType.applicationIdSuffix) {
  5. def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
  6. variant.mergeResources.doLast {
  7. def dir = file("${buildDir}/intermediates/res/${variant.dirName}/layout")
  8. dir.listFiles().each { f->
  9. String content = f.getText(encoding)
  10. content = content.replaceAll("res/"+defaultPackageId, "res/"+variant.packageName)
  11. f.write(content, encoding)
  12. }
  13. }
  14. }
  15. }

定制APK的应用名称

如果同时安装两个版本,那么最好能从应用名称上来区别一下,一般我们在AndroidManifest.xml中使用String resource来命名,如下:

 
 
  1. <application
  2. ...
  3. android:label="@string/app_name" >

build.gradle里增加下面的代码就可以为debug版一个特殊的命名了

 
 
  1. android.applicationVariants.all { variant ->
  2. def buildType = variant.buildType
  3. def encoding = java.nio.charset.Charset.defaultCharset().toString()
  4. if (buildType.applicationIdSuffix) {
  5. def defaultPackageId = variant.packageName.replaceAll(buildType.applicationIdSuffix,'')
  6. variant.mergeResources.doLast {
  7. def f = file("${buildDir}/intermediates/res/${variant.dirName}/values/values.xml")
  8. String content = f.getText(encoding)
  9. content = content.replaceAll('来往','来往Beta')
  10. f.write(content,encoding)
  11. }
  12. }
  13. }

修改ContentProvider Authority

如果你的应用里还提供ContentProvider的话,如下:

 
 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.android.app"
  4. android:versionCode="1"
  5. android:versionName="1">
  6. <application>
  7. <provider
  8. android:name=".provider.Provider1"
  9. android:authorities="com.example.android.app.debug.provider"
  10. android:exported="false" />
  11. </application>
  12. </manifest>

也可以用类似的方法修改。

通过在build.gradle里增加上面的方法后,可以在gradle build后生成debug和release两个包,且可以同时安装到一个手机上。

参考链接

  1. http://toastdroid.com/2014/03/28/customizing-your-build-with-gradle/
  2. http://stackoverflow.com/questions/16777534/using-build-types-in-gradle-to-run-same-app-that-uses-contentprovider-on-one-dev
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值