【Android】多渠道打包配置
目录
- 简介
- 打包配置
- 签名配置
- 渠道配置
- 配置打包出来的App名称
- 正式包与测试包配置
- 打包方式
- 开发工具打包
- 命令行打包
- 优缺点
简介
多渠道打包 是指在打包一个 Android 应用时,一次编译生成多个 APK 文件,每个 APK 文件针对一个特定的渠道。不同的渠道可能代表不同的应用商店、推广合作伙伴、地区等。每个渠道可能有不同的配置,例如不同的包名、资源、应用 ID、签名信息等。
打包配置
在打包之前,先聊一下我的需求。
我现在想打三个渠道的包,分别为 xiaomi、huawei、meizu。通过多渠道打包的方式能够实现一次编译打三个包,且通过多渠道打包生成的包生成位置不同、包名不同的 App、AndroidManifest.xml 文件不同的包。
在 Android Studio 里,打包是由 Gradle 脚本去完成,因此,毫无疑问,以下的一些配置都是写在了 build.gradle 文件里。
由于 build.gradle 文件是从上往下执行的,因此,导入其它插件的代码一般写在最上面第一二行的位置。在 build.gradle 文件中,部分配置是有一个先后的执行顺序,就是说,他们的先后执行顺序如果错乱,就会出现各种奇怪的问题。
签名配置
多渠道打包 app 的签名配置在了 signingConfigs 里,分为了三个签名配置,分别是 xiaomiSigningConfigs 、huaweiSigningConfigs 、meizuSigningConfigs 。
android {. . .// 多渠道打包签名配置signingConfigs {// 配置 xiaomi 渠道的签名xiaomiSigningConfigs {storeFile file('../keystore/xiaomi.jks')storePassword '123456'keyAlias 'xiaomi'keyPassword '123456'}// 配置 huawei 渠道的签名huaweiSigningConfigs {storeFile file('../keystore/huawei.jks')storePassword '123456'keyAlias 'huawei'keyPassword '123456'}// 配置 meizu 渠道的签名meizuSigningConfigs {storeFile file('../keystore/meizu.jks')storePassword '123456'keyAlias 'meizu'keyPassword '123456'}}. . .
}
PS:填写
storeFile的jks文件配置时,需确认所在路径是否存在相应的jks文件,否则会在Sync Now或打包的时候出现某些奇奇怪怪的问题。
渠道配置
android {. . .// 配置渠道productFlavors {// xiaomi渠道xiaomi {// 配置与ndk相关的配置ndk {// 配置打包的安装包支持的设备架构abiFilters 'arm64-v8a', 'armeabi-v7a'}// 在包名后面添加包名的内容applicationIdSuffix '.xiaomi'// 替换strings.xml文件里对应名称的值resValue "string", "app_name", "@string/app_name_xiaomi"// 配置渠道打包所需的签名signingConfig signingConfigs.xiaomiSigningConfigs}// huawei渠道huawei {applicationIdSuffix '.huawei'ndk {abiFilters 'arm64-v8a', 'armeabi-v7a'}resValue "string", "app_name", "@string/app_name_huawei"signingConfig signingConfigs.huaweiSigningConfigs}// meizu渠道meizu {applicationIdSuffix '.meizu'ndk {abiFilters 'arm64-v8a', 'armeabi-v7a'}resValue "string", "app_name", "@string/app_name_meizu"signingConfig signingConfigs.meizuSigningConfigs}}. . .
}
PS:在渠道包配置里写了与签名相关的配置后,就不能够在
buildTypes里写,否则会buildTypes的签名被覆盖,且打包时只能使用命令行打包,使用开发工具打包签名会被选择打包签名的那一个签名给覆盖掉。
配置打包出来的App名称
android {. . .// 配置各个渠道包打包出来的app名称def buildTime = buildTime()android.applicationVariants.configureEach { variant ->// 根据渠道名称判断打的渠道包是什么if (variant.name.contains('xiaomi')) {variant.outputs.configureEach { output ->// 修改打出来的包的名称output.outputFileName = "多渠道打包-xiaomi-${buildTime}.apk"}} else if (variant.name.contains('huawei')) {variant.outputs.configureEach { output ->output.outputFileName = "多渠道打包-huawei-${buildTime}.apk"}} else if (variant.name.contains('meizu')) {variant.outputs.configureEach { output ->output.outputFileName = "多渠道打包`-meizu-${buildTime}.apk"}}}. . .
}
正式包与测试包配置
android {. . .// 配置buildTypesbuildTypes {// 配置打release包时的配置release {// 配置打release包时的签名(经过测试,无效果)signingConfig signingConfigs.xiaomiSigningConfigsdebuggable false // 打出来的包是否包含调试信息minifyEnabled false // 启用或禁用代码混淆shrinkResources false // 是否移除未使用的资源zipAlignEnabled true // 控制是否对apk进行优化testCoverageEnabled false // 是否启用代码覆盖率报告versionNameSuffix '-xiaomi' // 附加打包版本名称后缀multiDexEnabled true // 是否启用多dex支持(适用于方法数超过65536的应用)embedMicroApp false // 配置是否将微应用嵌入到主应用中proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}// 配置打debug包时的配置debug {signingConfig signingConfigs.xiaomiSigningConfigsminifyEnabled falseshrinkResources falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}. . .
}
打包方式
开发工具打包
打开 Android Studio,在顶部菜单栏依次选择 Build 👉 Generate Signed App Bundle / Apk



打包可以选择多个渠道打包,快捷键为 Control + 鼠标左键 ,如下:

点击 Create 再过几分钟就会在 Module 下面生成对应的 app。

PS:使用 Android Studio 开发工具打包,多个app一起打包时,无法生成不同签名的app,最终打出来的app签名都会是同一个。
命令行打包
使用命令行打包前,需要提前配置好 Java 环境,并将其添加到系统的环境变量。
点击打开 Android Studio 的 Terminal ,输入 ./gradlew 确定是否可以正常使用。
./gradlew
若已经完成多渠道的相关配置,继续执行 ./graldew tasks 查看可执行的命令,命令及执行结果如下:
./graldew tasks

上图的执行结果展示了可执行的任务,打所有渠道的正式包使用的是 assembleRelease 命令:
./graldew assembleRelease
执行完成如下图所示:

使用命令行打包不会提示打的包保存在了哪里,可以到该路径下查看 项目所在路径\csdn-demo\multi-channel-package\build\outputs\apk\。
优缺点
优点
- 通过多渠道打包,可以统一管理应用的不同版本,简化发布流程和后续维护。
- 可以分别统计每个渠道的下载量、活跃用户、用户留存等数据,从而进行更精细的运营和推广。
- 可以针对不同市场定制不同版本的应用,满足不同国家和地区的法律法规、文化习惯和用户需求。
- 不同渠道可以使用不同的资源配置(如图标、启动页、应用名称等),满足不同市场或合作伙伴的需求。
- 不同的合作伙伴可能有不同的要求,通过多渠道打包可以更好地满足他们的需求,从而提升合作伙伴的满意度。
缺点
- 需要为不同渠道配置不同的资源和代码,增加了开发和维护的复杂度和工作量。
- 需要管理多个市场和渠道的发布和更新,这可能导致市场碎片化和管理难度增加。
- 不同渠道的资源配置可能会导致资源冗余,增大APK文件的体积,占用更多的存储空间。
- 多渠道打包需要配置多个构建变体,构建和发布流程变得更复杂,需要更细致的管理和协调。
- 不同渠道版本的应用可能存在差异,容易导致一些特定渠道版本出现质量问题,需要更多的测试和质量保证工作。
常见问题
- Caused by: groovy.lang.MissingMethodException: No signature of method: java.lang.Integer.call() is applicable for argument types: (build_dnmb91jd12bvybe4o3deskrm1 r u n c l o s u r e 1 _run_closure1 runclosure1_closure4 c l o s u r e 10 ) v a l u e s : [ b u i l d d n m b 91 j d 12 b v y b e 4 o 3 d e s k r m 1 _closure10) values: [build_dnmb91jd12bvybe4o3deskrm1 closure10)values:[builddnmb91jd12bvybe4o3deskrm1_run_closure1 c l o s u r e 4 _closure4 closure4_closure10@5e0c18f1]
解决办法:buildTypes对象里的参数不能以数字命名。 - Caused by: groovy.lang.MissingPropertyException: Could not get unknown property ‘xiaomiSigningConfigs’ for SigningConfig container of type org.gradle.api.internal.FactoryNamedDomainObjectContainer.
解决办法:
1、检查是否存在xiaomiSigningConfigs的配置。
2、signingConfigs的配置是否写在了buildTypes的下方。(由于Gradle编译顺序是从文件上往下编译的,如果buildTypes在signingConfigs的上方,意味着buildTypes会先被编译,自然会出现这种找不到signingConfigs里面配置的问题)
参考文档
- 配置 build 变体
- Gradle 官网
相关文章:
【Android】多渠道打包配置
目录 简介打包配置签名配置渠道配置配置打包出来的App名称正式包与测试包配置 打包方式开发工具打包命令行打包 优缺点 简介 多渠道打包 是指在打包一个 Android 应用时,一次编译生成多个 APK 文件,每个 APK 文件针对一个特定的渠道。不同的渠道可能代表…...
Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整
在spring中, AutoConfiguration也是一个种Configuration,只是AutoConfiguration是不能使用proxy的。 而且spring对于两者的加载顺序也不是一视同仁,是有顺序的。spring会先加载@SpringBootApplication可达的且标注了@Configuration的类,这个过程会将@AutoConfiguration标注…...
点餐系统需求分析说明书(软件工程分析报告JAVA)
目录 1 引言 4 1.1 编写目的 4 1.2 项目背景 4 1.3 定义 4 1.4 预期的读者 5 1.5 参考资料 5 2 任务概述 5 2.1 目标 5 2.2 运行环境 5 2.3 条件与限制 6 3 数据描述 6 3.1 静态数据 6 3.2 动态数据 6 3.3 数据库介绍 6 3.4 对象模型 6 3.5 数据采集 7 4 动态模型 7 4.1 脚本 …...
Python条形图 | 指标(特征)重要性图的绘制
在数据科学和机器学习的工作流程中,特征选择是一个关键步骤。通过评估每个特征对模型预测能力的影响,我们可以选择最有意义的特征(指标),从而提高模型的性能并减少过拟合。本文将介绍如何使用 Python 的 Seaborn 和 Ma…...
危险物品图像分割系统:一键训练
危险物品图像分割系统源码&数据集分享 [yolov8-seg-GFPN&yolov8-seg-CSwinTransformer等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global…...
城市景色视频素材下载好去处
在制作短视频、Vlog 或商业宣传片时,城市景色视频素材能为作品增添现代感与活力。繁华都市、流光溢彩的夜景、清晨街道等都是展现城市魅力的好素材。那么城市景色视频素材去哪里下载呢? 蛙学网 是专为短视频创作者打造的素材平台,城市景色素材…...
基于SSM美容院管理系统的设计
管理员账户功能包括:系统首页,个人中心,用户管理,套餐类型管理,美容预约管理,生日提醒管理,管理员管理,系统管理 员工账号功能包括:系统首页,个人中心&#…...
Threejs 实现3D 地图(04)3d 地图的柱状图和文字显示
3d 地图的数据展示 代码仓库: King/threejs-3d-map 核心代码: function createText(feature, level, font) {if (feature.properties.name) {const [x_XYZ, y_XYZ] handleProject(feature.properties.center)// 缺点:首次渲染很慢 无法使…...
Oracle 第2章:安装与配置Oracle
安装与配置Oracle数据库是一项复杂但有序的过程。以下是对Oracle数据库安装与配置的概述,包括系统需求与硬件推荐,以及详细的安装步骤。 系统需求与硬件推荐 系统需求 在安装Oracle数据库之前,需要确保目标系统满足Oracle官方规定的最低要…...
动态规划 —— 斐波那契数列模型-解码方法
1. 解码方法 题目链接: 91. 解码方法 - 力扣(LeetCode)https://leetcode.cn/problems/decode-ways/description/ 2. 题目解析 1. 对字母A - Z进行编码1-26 2. 11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 3. 0n不能解码 4. …...
PPT / Powerpoint中利用LaTeX输入公式
PPT / Powerpoint中利用LaTeX输入公式_ppt插入latex公式-CSDN博客文章浏览阅读2.8w次,点赞42次,收藏75次。新版的Word(Office 2016后?)是支持LaTeX公式输入的,但是Powerpoint并不支持。下面介绍如何利用。_…...
C++ 模板专题 - 类型擦除
一:概述 C 中的类型擦除(Type Erasure)是一种技术,允许你在不暴露具体类型信息的情况下,通过统一的接口处理不同的类型。这种技术常用于实现泛型编程,特别是在需要支持多种不同类型的情况下,如容…...
RuoYi-Vue项目 重点代码讲解
1. RuoYi-Vue项目 常规说明: ruoyi-admin:后台接口开发(主要存放控制层相关代码)ruoyi-common:通用工具ruoyi-framework:框架核心ruoyi-generator:代码生成(可以移除)r…...
pandas习题 024:用字典构造 DataFrame
编码题)用 Python 的字典构造一个 DataFrame,它有 a、b 两列,三行数据。其中 a 列值为 1、4、7,b 列值为 2、5、8,索引为 x、y、z。 即: ‘’’ a b x 1 2 y 4 5 z 7 8 ‘’’ import pandas as pddf = pd.DataFrame({a: [1, 4,...
如何在Node.js中执行解压缩文件操作
一、解压文件 1.安装依赖: 安装adm-zip依赖包:npm install adm-zip --save 安装iconv-lite依赖包:npm install iconv-lite --save 解压前的file文件夹结构: update-1.0.2.zip压缩包内容: 2.在depresssFile.js文件&…...
梦熊 CSP-S模拟赛 T3 youyou 的序列 II
原题链接 题目大意 给定一个长度为 n 的非负整数序列 a ,初始时所有数字均被标记为蓝色,youyou 和 yy 轮流对序列 a 进行操作,由 youyou 开始。 • 如果当前是 youyou 的回合,那么他可以至多选择连续的 c 1 个数…...
记录下docker部署gitlab-ce-17.5版本及客户端git拉取方式配置
服务端部署 # 提前拉取镜像 docker pull gitlab/gitlab-ce:17.5.0-ce.0docker run -d \ --name gitlab \ --hostname gitlab.test.cn \ -p 443:443 \ -p 88:80 \ -p 2222:22 \ --restartalways \ -v /data/gitlab/config:/etc/gitlab \ -v /data/gitlab/logs:/var/log/gitlab …...
opencv-platform实现人脸识别
和同事接触了下甲方,对方算是一个资源整合的自由人,手里有项目,然后认识些开发就聊下有什么事情可以做的,对方聊了下做人脸签到,或者说人脸打开。就这方面我做了下简单的了解。做了个java小demo。 我们常用的人脸识别的摄像头屏幕…...
leetcode 有重复字符串的排列组合
1.题目要求: 2.题目代码: class Solution { public://运用回溯vector<string> result;string s;void backtricking(string S,vector<bool>& used){if(s.size() S.size()){result.push_back(s);return;}for(int i 0;i < S.size();i){if(i >…...
【大数据学习 | kafka】kafka的组件架构
broker:每个kafka的机器节点都会运行一个进程,这个进程叫做broker,负责管理自身的topic和partition,以及数据的存储和处理,因为kafka是集群形式的,所以一个集群中会存在多个broker,但是kafka的整体又不是一…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
Excel 怎么让透视表以正常Excel表格形式显示
目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...
RocketMQ 客户端负载均衡机制详解及最佳实践
延伸阅读:🔍「RocketMQ 中文社区」 持续更新源码解析/最佳实践,提供 RocketMQ 专家 AI 答疑服务 前言 本文介绍 RocketMQ 负载均衡机制,主要涉及负载均衡发生的时机、客户端负载均衡对消费的影响(消息堆积/消费毛刺等…...
