【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的整体又不是一…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...