【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的整体又不是一…...
告别‘缺少DLL’:用EnigmaVB给Qt5.14程序封包的保姆级避坑指南
告别“缺少DLL”困境:EnigmaVBQt5.14封包全流程实战手册 当你用Qt Creator完成开发,满怀期待地将程序打包发给用户,却收到“缺少xxx.dll”的报错反馈时,这种挫败感开发者都深有体会。本文将以Qt5.14为例,结合EnigmaVB封…...
秀米能做的它都行,AI 写作让内容生产更简单
「选题想破头,初稿磨半天,排版更费神。」这或许是当下许多小编、运营乃至企业内容负责人的日常写照。内容需求暴涨,但高质量产出一直是道门槛。传统的编辑器,如秀米等,已极大简化了图文排版与可视化编辑的流程…...
从新手到专家:OpenCore配置工具OCAT的实战应用指南
从新手到专家:OpenCore配置工具OCAT的实战应用指南 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 如果你正在为黑苹果系…...
Redis监听Key过期事件报错?教你两种绕过CONFIG命令的实用方案
Redis监听Key过期事件的两种安全实践方案 Redis的Key过期事件监听是许多业务场景中的核心需求,比如订单超时处理、会话管理、缓存刷新等。但在云服务环境中,开发者常会遇到ERR unknown command CONFIG的报错,这通常是因为云服务提供商出于安全…...
环境感知驱动的EFI构建:让OpenCore配置效率提升300%
环境感知驱动的EFI构建:让OpenCore配置效率提升300% 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpenCore配置(OpenCore是一…...
OpenClaw多模态扩展:为nanobot添加图像识别能力
OpenClaw多模态扩展:为nanobot添加图像识别能力 1. 为什么需要图像识别能力 去年夏天,我接手了一个自动化内容审核的小项目。最初只是用OpenClaw处理文本内容,但很快发现一个致命缺陷——当需要审核带图片的帖子时,我的机器人就…...
HunyuanVideo-Foley 社区贡献指南:如何提交Prompt案例与优化建议
HunyuanVideo-Foley 社区贡献指南:如何提交Prompt案例与优化建议 1. 为什么你的贡献很重要 开源项目的生命力来自社区的共同参与。HunyuanVideo-Foley作为一款专注于音效生成的AI模型,其效果提升离不开用户的实际使用反馈和创意贡献。你的每一次Prompt…...
专访越擎科技创始人: 外骨骼的设计与仿真该如何入门
具身智能机器人领域的技术创新如火如荼,从轮式机器人,人形机器人,四足机器狗等不一而足。而从分类来看,外骨骼机器人作为增强人的能力的典型应用,不仅在医疗领域发挥重要作用,在工业应用等场景中也大大的增…...
Hunyuan-MT-7B应用案例:国际展会AI同传助手系统后端架构设计
Hunyuan-MT-7B应用案例:国际展会AI同传助手系统后端架构设计 1. 项目背景与需求分析 国际展会现场的同声传译一直是技术难题。传统人工翻译成本高昂,且难以覆盖所有语言组合。随着多语言大模型的发展,AI同传系统成为可行的解决方案。 Huny…...
开发者专属OpenClaw配置:nanobot镜像对接VSCode插件开发
开发者专属OpenClaw配置:nanobot镜像对接VSCode插件开发 1. 为什么选择nanobot镜像进行VSCode插件开发 去年我在开发一个智能代码补全插件时,发现市面上大多数AI辅助工具都存在响应延迟高、隐私性差的问题。直到接触到OpenClaw生态下的nanobot镜像&…...
