【Android】使用productFlavors构建多个变体
项目需求
在一个设备上安装两个一样的程序app
需求解决
我们知道每一个app都有一个包名的,如果一个app在Android设备上安装之后,再安装这个app的话会进行覆盖安装,因为他们两个的包名是一样的,默认是一个app。
但是我们现在需要将这一个app多次安装在一个Android设备上,那需要怎么实现这个需求呢?
实现这个需求的话,需要修改包名,我们可以使用productFlavors进行变体的构建和打包,这样的话,我们就可以将同一个app打包成不同包名的apk文件,这样就可以在一个Android设备上进行多次安装了。
Product Flavors允许开发者创建不同的应用版本,每个版本可以有不同的应用ID、版本名称、资源等。常见的用法包括:
- 免费版与付费版
- 不同功能集
- 地区版本
每个变体都可以有不同的配置,包括代码、资源和依赖项。
例如在这个项目里面
我们可以构建两个资源文件目录

在和【res】同级别的目录下创建【res-flavors】文件夹,在这个文件下面创建两个文件夹【compass】和【wireless】两个资源文件夹,在里面放我们需要区别的文字、图片等资源,但是要注意,资源对应的名字是要相同的,资源可以不同。
接下来我们去【build.gradle】文件里面去构建我们的变体。
android {compileSdkVersion 24buildToolsVersion "24.0.1"defaultConfig {applicationId "com.example" //原包名minSdkVersion 19targetSdkVersion 24versionCode 1versionName "v" + releaseTime()}compileOptions {encoding 'GBK'}lintOptions {abortOnError false}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}applicationVariants.all { variant ->variant.outputs.all { output ->def flavorName = variant.flavorNameif (flavorName == "compass") {outputFileName = "xx校正仪.apk" // 为 compass flavor 设置文件名} else if (flavorName == "wireless") {outputFileName = "xxxxxxxx校验仪.apk" // 为 wireless flavor 设置文件名} else {outputFileName = "xx校正.apk"}}}flavorDimensions "default"productFlavors {compass {applicationId "com.ble.compass"versionName "version compass 1.0"}wireless {applicationId "com.ble.wireless"versionName "version wireless 1.0"}}sourceSets {compass.res.srcDirs = ['src/main/res-flavors/compass']wireless.res.srcDirs = ['src/main/res-flavors/wireless']}}static def releaseTime() {return new Date().format("yyyMMdd_HHmm", TimeZone.getTimeZone("GMT+08:00"));
}
在这里面
sourceSets {compass.res.srcDirs = ['src/main/res-flavors/compass']wireless.res.srcDirs = ['src/main/res-flavors/wireless']}
是资源文件目录,指向的位置就是我们之前创建的文件地址。
productFlavors {compass {applicationId "com.ble.compass"versionName "version compass 1.0"}wireless {applicationId "com.ble.wireless"versionName "version wireless 1.0"}}
这两个就是我们创建的两个变体,里面设置了相应的变体的包名和版本名字。
applicationVariants.all { variant ->variant.outputs.all { output ->def flavorName = variant.flavorNameif (flavorName == "compass") {outputFileName = "xx校正仪.apk" // 为 compass flavor 设置文件名} else if (flavorName == "wireless") {outputFileName = "xxxxxxxx校验仪.apk" // 为 wireless flavor 设置文件名} else {outputFileName = "xx校正.apk"}}}
这一部分就是在输出我们构建好的apk文件的名字,这样我们在进行构建apk文件之后,就会根据相应的变体显示相应的名字。

通过这样设置之后,【build】构建一下,然后我们在进行apk文件打包的时候就可以选择相应的版本了。

相关文章:
【Android】使用productFlavors构建多个变体
项目需求 在一个设备上安装两个一样的程序app 需求解决 我们知道每一个app都有一个包名的,如果一个app在Android设备上安装之后,再安装这个app的话会进行覆盖安装,因为他们两个的包名是一样的,默认是一个app。 但是我们现在需…...
ubuntu 22.04 防火墙 ufw
Ubuntu(22.04)云主机SSH安全加固 https://blog.csdn.net/qq_44846097/article/details/141098092 ubuntu22.04防火墙策略 https://blog.csdn.net/sunyuhua_keyboard/article/details/139493464 Ubuntu 22.04 防火墙设置和开放端口命令 https://blog.c…...
MySQL压缩版安装详细图解
1.下载 mysql压缩包版本和msi版的安装方法不一样,下面的是压缩包版本的安装详细图解: 总地址下载地址:MySQL :: Download MySQL Community Server MySQL :: Download MySQL Community Server (Archived Versions) 压缩版下载MySQL :: Dow…...
elementui中的新增弹窗在新增数据成功后再新增 发现数据无法清除解决方法
elementui中的新增弹窗在新增数据成功后再新增 发现数据无法清除解决方法 试过网上其他方法,发现表单清空数据还是有问题,索性用下面方法解决: // 给弹框里面添加 v-ifvisible测试无问题,暂时先这样解决,如果有其他方法&#x…...
软件开发项目管理:实现目标的实用指南
由于软件项目多数是复杂且难以预测的,对软件开发生命周期的深入了解、合适的框架以及强大的工作管理平台是必不可少的。项目管理系统在软件开发中通常以监督为首要任务,但优秀的项目计划、管理框架和软件工具可以使整个团队受益。 软件开发项目管理的主要…...
Jenkins面试整理-如何在 Jenkins 中进行并行构建?
在 Jenkins 中,并行构建 是通过并行执行多个任务来提高构建效率的常见方法。并行构建特别适用于需要执行多个独立步骤的工作流,如并行测试、构建不同平台上的软件或并行执行多个阶段。Jenkins 提供了两种方式来配置并行构建:Declarative Pipeline 和 Scripted Pipeline。下面…...
DPDK(F-Stack) 实现UDP通信
因刚开始学习DPDK,在学习过程中了解到需使用用户态协议栈,在网上找到F-Stack的相关介绍,但是缺乏DPDK的相关知识,导致使用F-Stack 时UDP数据无法收到 一文了解dpdk rte_ring无锁队列F-Stack实现UDP服务端、客户端,并进…...
基于ExtendSim的库存与订购实验
说明: 库存和订购实验室是一个单部件模拟模型,旨在测试从组件需求站点到组件分发站点的订购策略,以及 在组件分销现场的生产区域内。最佳解决方案允许为需求站点提供高服务级别,同时最大限度地降低总库存水平。 该模型演示了分层模…...
操作系统个人八股文总结
1.进程和线程的区别 进程和线程的定义 进程: 进程是一个运行中的程序实例,是资源分配的基本单位。每个进程都有自己的地址空间、数据、堆栈以及其他辅助数据。线程: 线程是进程中的一个执行单元,是CPU调度的基本单位。一个进程可…...
scala set训练
Set实训内容: 1.创建一个可变Set,用于存储图书馆中的书籍信息(假设书籍信息用字符串表示),初始化为包含几本你喜欢的书籍 2.添加两本新的书籍到图书馆集合中,使用操作符 3.删除一本图书馆集合中的书籍&…...
【d63】【Java】【力扣】141.训练计划III
思路 使用递归实现 出口 ,遇到null 每一层要做:把下层放进去,把本层放下去 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { …...
【Linux】- 权限(2)
接上一篇文章,继续介绍linux权限的相关知识。https://blog.csdn.net/hffh123/article/details/143432940?spm1001.2014.3001.5501j 目录 一、chown:修改文件的拥有者 二、chgrp:修改文件所属组 三、关于other的介绍 四、文件类型 1、分类…...
如何设置内网IP的端口映射到公网
在现代网络环境中,端口映射(Port Mapping)是一项非常实用的技术,它允许用户将内网设备的服务端口映射到公网,使外网用户可以访问内网中的服务。这项技术在远程办公、设备远程控制、游戏服务器、家庭监控等场景中得到了…...
Matplotlib | 条形图中的每个条形(patch)设置标签数据的方法
方法一 不使用子图对象如何给形图中的每个条形设置数据 plt.figure(figsize(8, 4)) sns.countplot(xWorkout_Frequency (days/week), datadf)plt.title(会员每周锻炼频率分布) plt.xlabel(锻炼频率 (每周次数)) plt.ylabel(人数)# 获取当前活动的轴对象 ax plt.gca()# 循环遍…...
机器学习3_支持向量机_线性不可分——MOOC
线性不可分的情况 如果训练样本是线性不可分的,那么上一节问题的是无解的,即不存在 和 满足上面所有N个限制条件。 对于线性不可分的情况,需要适当放松限制条件,使得问题有解。 放松限制条件的基本思路: 对每个训…...
bash: git: command not found
在windows上重新安装Git之后,遇到cmd可以使用git命令,但是git bash中使用的git命令的时候,会提示: $ git bash: git: command not found 解决办法 找到用户目录下的.bash_profile和.bashrc文件,编辑打开,找…...
大模型LLama3!!!Ollama下载、部署和应用(保姆级详细教程)
首先呢,大家在网站先下载ollama软件 这就和anaconda和python是一样的 废话不多说 直接上链接:Download Ollama on Windows 三个系统都支持 注意: 这里的Models,就是在上面,大家点开之后,里面有很多模型…...
ReactPress系列—NestJS 服务端开发流程简介
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,感谢Star。 NestJS 服务端开发流程简介 NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。它使用 TypeScript(但也支持纯 Java…...
Maven 下载配置 详解 我的学习笔记
Maven 下载配置 详解 我的学习笔记 一、Maven 简介二、maven安装配置三、maven基本使用四、idea配置mavenidea配置maven环境maven坐标idea创建maven项目配置Maven-Helper插件 五、依赖管理 一、Maven 简介 Apache Maven 是一个项目管理和构建工具,它基于项目对象模型…...
【学术精选】SCI期刊《Electronics》特刊“New Challenges in Remote Sensing Image Processing“
英文名称:New Challenges in Remote Sensing Image Processing 中文名称:"遥感图像处理的新挑战"特刊 期刊介绍 “New Challenges in Remote Sensing Image Processing”特刊隶属于《Electronics》期刊,聚焦遥感图像处理领域快速…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
