利用 Android Studio 和 Gradle 打包多版本APK( applicationIdSuffix)

2023-11-09

在项目开发过程中,经常会有需要打包不同版本的 APK 的需求。 比如 debug版,release版,dev版等等。 有时候不同的版本中使用到的不同的服务端api域名也不相同。 比如 debug_api.com,release_api.com,dev_api.com等等。

不同的版本对应了不同的 api 域名,还可能对应不同的 icon 等。

如果每次都在打包前修改我们都手动来修改,这样实在是不够方便。

但如果我们使用了 Android Studio 和 Gradle,这个麻烦就可以轻松省去。

具体方式如下: 在 Android Studio 中打开 build.gradle(Module中)的 android 节点下添加如下代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
buildTypes {
 
     //这里的名字自定义,不要求大小写
     release{
     
         // 这里是在 applicationId 中添加了一个后缀。所以『.』要加上
         applicationIdSuffix  ".release"
         
         // 这里的作用是选择是否混淆代码
         minifyEnabled  false
         proguardFiles getDefaultProguardFile( 'proguard-android.txt' ),  'proguard-rules.pro'
     }
 
     dev{
         applicationIdSuffix  ".dev"
         minifyEnabled  false
         proguardFiles getDefaultProguardFile( 'proguard-android.txt' ),  'proguard-rules.pro'
 
     }
}
 
// 这里是为了不同过的版本设置一些特殊的参数,并不直接和 buildType 关联。
//例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面设置的自定义参数。这需要自己按照需求制定。
productFlavors{
 
//自定义名字不过不能和上面buildType中相同,不然Gradle编译会不通过。在这里使用了『flavors_』前缀以便区分。
     flavors_release{
     
     // manifestPlaceholders中写到的『str』,『package_name』不支持用大写,否则Gradle编译会不通过。
     // 这里所设置的变量可以直接使用在『AndroidManifest.xml』中,使用方式为:${package_name}
     // android:label="${package_name}"
         manifestPlaceholders = [str: "releaseStr" ,package_name: "com.sunhz.mvptest.release" ]
 
         // 这里的参数是为了在 java 代码中使用,具体的使用方式为:context.getResources().getString(R.string.strKey);
         resValue( "string" "strKey" , "releaseStrValue" )
     }
 
     flavors_dev{
         manifestPlaceholders = [str: "devStr" ,package_name: "com.sunhz.mvptest.dev" ]
 
         resValue( "string" "strKey" , "devStrValue" )
     }
}

上面设置完成后,我们要在哪里使用它?

使用方式如下: 在 Android Studio 的工具栏中,找到『Build』项,找到『Generate Signed APK…』,如下图。

利用 Android Studio 和 Gradle 打包多版本APK

选择 Module -> 创建 APK key,或者输入 APK key密码 -> 关键来了!如下图。

利用 Android Studio 和 Gradle 打包多版本APK

在『BuildType』处,选择我们在 build.gradle 中设置的两个 BuildType,分别是releas,dev,debug。其中『debug』为 Android Studio 自带的。

在『Flavors』处,选择我们在 build.gradle 中设置的两个Flavors,以方便直接使用定义在 build.gradle 中自定义的参数。

所以! 上面我有提到说,buildType 和 Flavors 并没有直接的联系。 他们可以根据用户需求互相配合使用。如上图,BuildType 选择了 release,但 Flavors 选择的却是 flavors_dev。

到此基本的使用就全部说完了。

这里有一个问题,打出来的不同版本的包,全部都能够在同一部手机上安装,且能够将两个包全都发布到 Google 的市场上去这是为什么呢?

这里就要提到在 BuildType 中我们所设置的『applicationIdSuffix』属性了,按照这个属性的字面翻译为:『applicationId 的后缀』,那这里又来了一个问题,『applicationId』是什么? 其实这个『applicationId』属性,实际上在项目创建完成后就存在于 build.gradle 中。在 android 节点下的 defaultConfig 节点中。而且默认的 applicationId 和 AndroidManifest.xml 中的 package 属性相同。

如下图:

利用 Android Studio 和 Gradle 打包多版本APK

利用 Android Studio 和 Gradle 打包多版本APK

我们能够看到,这两个属性的默认值是相同的。

applicationId 和 packageName 它们是什么关系?

默认创建项目后,两者相同。如果需要根据不同的需求构建不同版本的APK,这时我们通过设置『applicationIdSuffix』可以做到。

这里有一个值得注意的现象。

举个例子,我们在打包时使用了 dev 类型,将打包出来的 APK 软件安装到手机中。

使用如下代码,获取我们手机上所有程序的packageName。

?
1
2
3
4
5
6
PackageManager packageManager = mContext.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
List<String> packageNameList =  new ArrayList<String>();
for (PackageInfo packageInfo : packageInfoList) {
     packageNameList.add(packageInfo.packageName);
}

我们打印出来的包名信息中,会出现 com.spencer_dev.test.dev 。并没有出现 com.spencer_dev.test 。

但是! 如果通过反编译工具,将 APK 包进行反编译直接查看源代码,在 java 代码所在的 src 目录中的包名,还和我们设置的一样,为 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 类中的 APPLICATION_ID 已经变成了 com.spencer_dev.test.dev 。

applicationId 和 packageName 它们各自代表什么?

按照上面的结果来说, package 代表了 java 代码中的包名。 applicationId 代表了应用中的唯一标识。和应用签名一起用来区别和其他应用不同。我想这也就是为什么 Google 市场能够允许相同应用不同 applicationId 的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用 Android Studio 和 Gradle 打包多版本APK( applicationIdSuffix) 的相关文章

随机推荐

  • C#软件开发实例.私人订制自己的屏幕截图工具(五)针对拖拽时闪烁卡顿现象的优化

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • Centos7加入AD域并通过域账号登录

    环境 windows server 2012系统安装AD域服务 安装完毕创建用户 安装过程百度搜索 创建用户 打开服务器管理器 AD DS 右击服务器选择 AD用户和计算机 创建组织单位 选择你安装的域名服务 空白处右击 新建 组织单位 选
  • 【大数据实验1】note1:安装CentOS 7.7(桥接模式)

    note1 安装CentOS 7 7 桥接模式 1 安装VMware Workstation Pro 2 安装CentOS7 7 3 安装VMwareTools 4 注意点 为了实验做准备 冲鸭 实验具体操作步骤 cloudstack安装部
  • python自动化笔记(十)——openpyxl模块,操作excel管理测试数据

    这里利用第三方库openpyxl来操作excel管理测试数据 注意 此模块只支持xlsx读写操作 旧版的xls不支持 安装第三方库 pip install openpyxl 平常操作excel的流程 3个对象 工作簿 Workbook 表单
  • Gym - 102263 B - Road to Arabella

    原题内容 Ayoub and Kilani felt board while they are going to ArabellaCPC in Amman Irbid road so Kilani invented a new game t
  • 基于STM8的TIM定时器操作---STM8-第三章

    1 综述 STM8S提供三种类型的 TIM 定时器 高级控制型 TIM1 通用型 TIM2 TIM3 TIM5 和基本型定时器 TIM4 TIM6 它们虽有不同功能但都基于共同的架构 此共同的架构使得采用各个定时器设计应用变得非常容易与方便
  • 三目运算符

    三目运算符 又称条件运算符 是计算机语言 c c java等 的重要组成部分 它是唯一有3个操作数的运算符 所以有时又称为三元运算符 一般来说 三目运算符的结合性是右结合的 定义 对于条件表达式b x y 先计算条件b 然后进行判断 如果b
  • yolov5训练报错: a view of a leaf Variable that requires grad is being used in an in-place operation

    梯度信息丢失错误 报错详情 报错原因 解决方法 报错详情 RuntimeError a view of a leaf Variable that requires grad is being used in an in place oper
  • python简单爬虫实例,爬取CSDN文章

    查看要爬的网页的源代码 准备爬取所有文章和链接 代码 import requests from bs4 import BeautifulSoup url https blog csdn net LI AINY headers User Ag
  • 基于Spark的分布式数据处理和机器学习技术【上进小菜猪大数据】

    上进小菜猪 沈工大软件工程专业 爱好敲代码 持续输出干货 大数据已经成为当今社会中一个重要的资源和挑战 随着数据规模的不断增长 如何高效地处理和分析这些数据成为了一个关键问题 本文将介绍基于Apache Spark的分布式数据处理和机器学习
  • 【机器学习】通俗易懂决策树(原理篇)

    决策树 引言 决策树是什么 怎样利用决策树来帮助我们分类 怎样构建自己的决策树 决策树是一种类似流程图的结构 其中每个内部节点代表一个属性的 测试 例如硬币翻转出现正面朝上或反面朝上 每个分支代表测试的结果 每个叶节点代表一个类标签 在计算
  • flutter_tools/gradle/app_plugin_loader.gradle‘ as it does not exist

    背景 flutter 1 17 hotfix5 因为使用flutter crate 来创建新项目的 在之前的windows电脑能够正常运行 但是在mac电脑上死活运行不上去 查了很久 github上也查看了相关issuer 发现解决问题的方
  • MPP数据库简介及架构分析

    目录 什么是MPP 特性 并行处理 超大规模 数据仓库真正适合什么 典型的分析工作量 数据集中化 线性可伸缩性 MPP架构技术特性 数据库架构分析 Shared Everything Shared Disk Share Memory Sha
  • elastic weight consolidation

    GitHub kuc2477 pytorch ewc Unofficial PyTorch implementation of DeepMind s PNAS 2017 paper Overcoming Catastrophic Forge
  • Springboot简单实现用户登录操作

    从0开始开发SpringBoot vue前后端分离项目 文章目录 从0开始开发SpringBoot vue前后端分离项目 一 创建Springboot项目 二 引入依赖 三 插件推荐 1 Mybatis Log Free 2 Free My
  • c# 代码实现通过域名获取IPV4地址

    c 代码实现通过域名获取IPV4地址 IPHostEntry iPHostEntry Dns GetHostByName www baidu com IPAddress ip iPHostEntry AddressList 0 label1
  • 每日一题(两数相加)

    每日一题 两数相加 2 两数相加 力扣 LeetCode 思路 思路 由于链表从头开始向后存储的是低权值位的数据 所以只需要两个指针p1和p2 分别从链表的头节点开始遍历 同时创建一个新的指针newhead 用于构造新链表 将创建的新节点进
  • 交换两数(不使用中间变量)

    引出问题 说到交换两数的值 对大家来说应该是一个非常简单的任务 但是 我们最常用的方法就是创建一个临时变量 再通过这个临时变量来改变两值 如下 int temp a a b b temp 但是 难道交换两个变量就只有这一种做法吗 方法1 其
  • IntelliJ IDEA写JSP文件出现“cannot resolve method”解决办法

    最近在使用IDEA写JSP文件的时候 有些内置对象出现了cannot resolve method的警告提示 代码运行没有问题 在编写的时候也不会提示 最后请教了万能的搜索引擎 解决了此问题 解决办法 该错误的导致的原因是因为没有在项目中添
  • 利用 Android Studio 和 Gradle 打包多版本APK( applicationIdSuffix)

    在项目开发过程中 经常会有需要打包不同版本的 APK 的需求 比如 debug版 release版 dev版等等 有时候不同的版本中使用到的不同的服务端api域名也不相同 比如 debug api com release api com d