urlname
type
Post
password
SyncToConfluence
SyncToConfluence
category
Android
date
Oct 17, 2024
slug
3f763aed-1fb9-4b1a-ab63-939c0488ca54
icon
Button
catalog
学习
summary
tags
Android
Gradle
cover
Status
Done
BusyTime
Status 1
status
Published
😀
简述 Build Variants 的重要性与灵活性,提升开发效率和应用版本管理的灵活性。

📝 什么是Build Variant

在android里,使用Build Variants来定义具体的应用版本,具体的,可以在Android Studio中,找到当前项目的所有的Build Variants列表(相信作为Android开发,一定很熟悉)
每个 Build Variant 都可以拥有自己独立的资源、代码和依赖管理,方便对应用进行多版本管理。
例如,免费版可以显示广告,而付费版则没有广告功能;debug 版本可以带有调试信息和开发工具,而 release 版本会进行代码混淆和优化。
notion image

🤣 Build Variant的组成

Build Variant 的组成主要受三部分控制:
  • Build Type
  • Product Flavor
  • Dimension

Build Type

  • 决定应用的构建方式和发布方式。如:debug、release
  • 在Android项目创建好之后,默认就提供了两个build type:
    • debug(默认支持,可以不用在build.gradle中显示定义)
    • release

Product Flavor

  • 可以定义为应用于不同市场、客户或功能需求的应用版本。
  • 每个 Product Flavor 可以配置不同的包名、版本号、资源等。
  • 这里以不同的区域area版本(如 useu)和不同的特性版本feature(如 freepaid)为例:
  • 此时我们的build variants列表如下,可以看到不同的地区、特性,并没有进行组合,而是分别和build type进行组合而已,而我们要的是每个地区都能和对应的特性进行组合。这时候就需要用到Dimension的概念进行分组了。
notion image

Dimension

  • 可以对 Product Flavors 进行分组,以便实现多维度组合。
  • 默认情况下,所有的 Product Flavors 都属于一个隐式维度。
  • 每个维度中的 Product Flavor 都可以互相组合,从而形成多个 Build Variant
  • 在上面的例子中,定义了区域area(useu)和特性版本feature(freepaid)四个flavor,但是并不能达到我们预期,因为我们希望每个地区,都可以有对应的特性版本(freepaid),而不是将地区和特性版本放在同级,所以,这里可以用Dimension的特性,对其进行分组组合:
  • 此时我们的build variants列表如下,可以看到,不同的地区已经和不同的特性进行了组合,此时的build variant可以组成:area-feature-buildType
notion image

注意事项

  • 每个 Product Flavor 必须被明确分配到一个维度,否则会导致构建错误。
  • 增加维度会增加组合的复杂度,因此在设计维度时需要平衡管理和维护的难度。
  • 最终build variants的数量计算方法:dimensions * flavors * type

😥 高级知识点

过滤build variant

在大型项目中,随着 Product FlavorBuild Type 的组合数量增加,可能会生成很多不必要的 Build Variant。为了解决这个问题,Android 构建系统允许开发者通过 过滤变体 来减小构建复杂度。
使用 variantFilter 过滤变体:在 build.gradle.kts 中可以使用 variantFilter 来指定哪些变体应该被忽略。例如,某些测试环境下的付费版本可能不需要构建:
通过这种方式,可以显著减少构建的变体数量,从而提升构建速度。

优先级

在 Android 项目中,不同的 Build Variant 会引用不同的源代码和资源文件。系统会根据 Product Flavor Build Type 来确定资源和代码的优先级。合并的优先级规则如下:
  • Variant-specific 文件优先:每个 Build Variant 都可以有自己独立的源代码或资源目录。这些目录下的文件优先级最高,会覆盖其他目录中的同名文件。
  • Build Type 文件优先:例如 debug 版本的资源文件会覆盖公共资源目录中的文件。
  • Product Flavor 文件次优先:例如,free 版本的资源会覆盖主资源目录中的文件。
  • 主源集:主目录(通常为 main/)中的资源和代码被所有变体共享,优先级最低。

🤗 总结归纳

  • Build Variant 是 Android 项目中灵活的机制,帮助开发者管理多版本应用以满足不同业务需求。
  • 通过合理配置 Build TypeProduct FlavorFlavor Dimensions,可以实现高效的应用版本开发与发布。
  • 增加维度会增加组合的复杂度,因此在设计维度时需要平衡管理和维护的难度。

📎 参考文章

Note接入侧边栏小工具AOSP-Cuttlefish安装及运行
Loading...