当前位置: 首页 > news >正文

Build Variants 构建变体

在Build Variants面板中,当前模块的所有可用变体

变体组合规则:ProductFlavor + BuildType,其中BuildType默认有debug、release。

多维度变体组合

维度定义与组合

通过flavorDimensions实现多维度变体(如版本+地区):

flavorDimensions "version", "area"

productFlavors {

free { dimension "version" }

paid { dimension "version" }

domestic { dimension "area" }

overseas { dimension "area" }

}

生成变体示例:

变体名称组合规则
freeDomesticReleasefree(版本)+ domestic(地区)+ Release(类型)
freeOverseasDebugfree(版本)+ overseas(地区)+ Debug(类型)
paidODomesticDebugpaid(版本)+ domestic(地区)+ Debug(类型)

源集类型

main 源集包含了所有其他构件变体共用的代码和资源,即所有的其他构建变体,src/main是其共同拥有的。

其他源集目录为可选项,如果想要为某个单独的构建变体添加特有的代码或者资源,可以创建对应的目录。

变体专属资源需放置在对应目录(如src/freeRelease/res/),变体目录与main目录平级。

资源优先级

当存在重复的资源时,Gradle 将按以下优先顺序决定使用哪一个文件(左侧源集替换右侧源集的文件和设置):构建变体 > 构建类型[BuildType] > 产品风味[ProductFlavor] > 主源集[main] > 库依赖项。

  • java/ 目录中的所有源代码将一起编译以生成单个输出。注意的是,java文件是不能被覆盖的,如果在main目录中创建了src/main/Utility.java,那么是不能其他源集目录中定义同名文件进行覆盖的,因为Gradle 在构建过程中会查看这两个目录并抛出“重复类”错误。如果想要在不同的 build 类型有不同版本的 Utility.java,只能让每个 build 类型定义各自的文件版本。
  • 所有Manifest都将合并为一个清单。合并的优先级和上面提到的一致。
  • 同样,values/ 目录中的文件也会合并在一起。如果两个文件同名,例如存在两个 strings.xml 文件,按照上述的优先级覆盖。
  • res/ 和 asset/ 目录中的资源会打包在一起。
  • 最后,在构建 APK 时,Gradle 会为库模块依赖项随附的资源和清单指定最低优先级。

源集过滤

sourceSets {

main {

java {

exclude ‘com/cooke/library/Test.java’

exclude ‘com/cooke/library/model/**.java’

}

}

}

上面例子提到,其他的源集目录无法覆盖同名java文件,但是可以通过SourceSet对main目录中的java进行exclude。

注意:include和exclude不能对res生效,如果想要对res进行过滤,需要通过定义res/raw/keep.xml。

重命名apk文件

遍历applicationVariant或libraryVariant列表,干预构建apk和aar的过程。最常见的就是重命名apk的名称:

android.applicationVariants.all {

variant ->

variant.outputs.all {

outputFileName=“{applicationId}_̲{buildType.name}_{versionName}_̲{releaseTime()}.apk”

}

}

定制依赖

Build Type,Product Flavor也能够有它们自己的依赖关系。比如,使用flavor来生成一个基于广告的应用版本和一个付费的应用版本,当中广告版本依赖于一个广告SDK。

dependencies { flavor1Compile "..." }

定制权限

在风味目录下单独定制AndroidManifest.xml。

定义常量

在gradle.properties文件中可以定义常量,例如

isMoudle=true

然后在Android项目中的任何一个build.gradle文件中都可以把gradle.properties中的常量读取出来,通过读取这个常量的值来判断开发模式,例如:

if (isModule.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}

美团(walle)、腾讯(VasDolly)...等的多渠道打包插件

http://www.jsqmd.com/news/1157719/

相关文章:

  • 前端转AI全栈,6-9个月落地实战!收藏这份专属学习路线,轻松实现职业升级
  • Spring Boot 3 + Vue 3 + MySQL 智能灌溉系统源码 前后端分离 实战项目
  • Ouch 0.8.1 官方版下载(夸克网盘,SHA256校验)
  • 2026年现阶段厦门旋转货柜公司盘点:蓝兴泰科技为何备受关注? - 品牌鉴赏官2026
  • 2026工业电源采购攻略:分享充电器厂家怎么选择方法,优质防水电源厂家推荐,分析裸板电源厂哪家好 - 栗子测评
  • 2026医院供电配套采购参考,医用隔离电源工厂资质盘点,医用隔离变压器、医用隔离电源哪家好怎么选 - 栗子测评
  • 无刷直流电机 PWM 频率与电感选择:50kHz下电流纹波降低30%的3个关键参数
  • 2026 年最佳恶意软件清除软件推荐:多款软件各有亮点,助你守护设备安全!
  • 延伸音(Tension)应用指南:属七和弦5种常用Tension音搭配与省略五音原则
  • 智能阅卷系统OCRAutoScore:让AI帮你批改试卷,节省90%阅卷时间
  • 伯爵中国官方售后服务中心|服务电话及完整官方地址权威信息声明(2026年7月更新) - 亨得利官方服务中心
  • C语言语法笔记
  • 从零搭建高效Linux虚拟机:网络、磁盘与增强功能配置全解析
  • ESP32 Arduino 经典蓝牙 SPP 通信实战:2节点自动配对与LED控制(附完整代码)
  • 【0基础嵌入式学习日志】Day15:位操作、GPIO 寄存器模拟与 LED 控制
  • PagedAttention失效诊断与DeepSeek V4推理优化实战
  • 2026双叠自锁垫圈使用成本怎么降低
  • 猫抓浏览器插件:新手到专家的视频下载完全指南
  • 69、<简单>数组元素插入
  • 如果你用 Mac,那你可能需要 Noti Shift
  • 基于单片机人脸识别电子密码锁智能门禁指纹识别语音提醒防盗成品1123(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 3分钟快速安装:免费GitHub加速插件终极使用指南
  • 实测不踩坑!2026上海正规黄金回收商家榜单,本地人真心推荐 - 小蝶回收测评
  • AI视频生成实战:基于OpenMontage与AI编程助手的自动化工作流
  • 影刀RPA JSON文件处理:读写与嵌套解析
  • Unity游戏实时文本翻译插件XUnity.AutoTranslator原理与实战指南
  • 版本管理-Git Sourcetree
  • 02-01-确认环境依赖(全平台发布)
  • 2026年隧道升压器厂家综合对比指南,详解隧道升压器哪家好,从生产资质、设备性能、售后体系多角度筛选适配工程的厂商 - 栗子测评
  • mba论文银行开题报告范文