Android使用Gradle配置构建变体

转载:https://blog.csdn.net/ming54ming/article/details/78766182

每个构建变体都代表您可以为应用构建的一个不同版本。例如,您可能希望构建应用的免费版本(只提供有限的内容)和付费版本(提供更多内容)。您还可以针对不同的设备、根据 API 级别或其他设备变体构建应用的不同版本。然而,如果您希望根据设备 ABI 或屏幕密度构建不同的版本,则请改用 [APK 拆分]

gradle.png

主要是在android {} 代码块内部创建和配置构建类型,其中defaultConfig是一些基本配置,buildTypes就是构建类型,其中默认情况下已经有了一个release版本,就是所谓的发布版本,release{}代码块里面就是属于release版本的一些配置,其实默认情况下应该还有一个debug版本,就是平常的调试版本,只是这里没有显示出来。

配置构建类型buildTypes

buildtype.png

这里我们来看一下buildTypes的基本构建,
applicationIdSuffix: 是在当前applicationId的基础上拼接剩下的字段形成一个新的applicationId,因为同一个applicationId是无法同时运行在同一个手机上的,这里也可以直接使用applicationId属性来命名新的一个包名。
initWith:复制其他buildTypes的内容,这里的jnidebug变体就复制了debug变体的内容。一般写法是可以命名一个默认的变体,将一些公共的变量在里面赋值从而给其他变体使用。

配置产品风味ProductFlavor

创建产品风味与创建构建类型类似:只需将它们添加到 productFlavors {} 代码块并配置您想要的设置。产品风味支持与 defaultConfig 相同的属性,这是因为 defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig {} 代码块中提供所有风味的基本配置,每种风味均可更改任何这些默认值,例如 applicationId。


ProductFlavor .png

这里可以看到使用和buildTypes类似,具体需要哪些属性可以查看官网地址。这里有个地方应该注意的是,编译类型其实是buildTyps和productFlavor的组合,这里有三种buildTypes和两种productFlavor所以最终有6种编译类型。

在创建和配置您的产品风味之后,在通知栏中点击 Sync Now。在同步完成后,Gradle 会根据您的构建类型和产品风味自动创建构建变体,并按照 <product-flavor><Build-Type> 的格式命名这些变体。例如,如果您创建了“演示”和“完整”这两种产品风味并保留默认的“调试”和“发布”构建类型,Gradle 将创建以下构建变体:

  • 演示调试
  • 演示发布
  • 完整调试
  • 完整发布

您可以将构建变体更改为您要构建并运行的任何变体,只需转到 Build > Select Build Variant,然后从下拉菜单中选择一个变体。然而,要开始自定义每个构建变体及其功能和资源,您需要了解如何创建和管理源集。

组合多个商品风味

某些情况下,您可能希望组合多个产品风味中的配置。例如,您可能希望基于 API 级别为“完整”和“演示”产品风味创建不同的配置。
为此,您可以通过适用于 Gradle 的 Android 插件创建产品风味组,称为风味维度。
构建您的应用时,Gradle 会将您定义的每个风味维度中的产品风味配置与构建类型配置组合来创建最终构建变体。Gradle 不会组合属于相同风味维度的产品风味。


3.png

flavorDimensions属性:创建一个“模式”风味维度以组织“完整”和“演示”产品风味,以及一个“api”风味维度以基于API级别组织产品风味配置

风味维度 demo full
minApi24 [minApi24][Demo] [minApi24][Full]
minApi23 [minApi23][Demo] [minApi23][Full]
minApi21 [minApi21][Demo] [minApi21][Full]

在 Gradle 为每个构建变体或对应 APK 命名时,属于较高优先级风味维度的产品风味首先显示,之后是较低优先级维度的产品风味,再之后是构建类型。以上面的构建配置为例,Gradle 可以使用以下命名方案创建总共 12 个构建变体:

构建变体:[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]

对应 APK:app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk

例如,
构建变体:minApi24DemoDebug
对应 APK:app-minApi24-demo-debug.apk

过滤变体

您可以在模块级 build.gradle 文件中创建一个变体过滤器,以移除某些构建变体配置。
假设您计划为演示版本的应用仅支持 API 级别 23 和更高级别。您可以使用代码块过滤出组合了“minApi21”和“演示”产品风味的所有构建变体配置:

android {
  ...
  buildTypes {...}

  flavorDimensions "api", "mode"
  productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
      def names = variant.flavors*.name
      // To check for a certain build type, use variant.buildType.name == "<buildType>"
      if (names.contains("minApi21") && names.contains("demo")) {
          // Gradle ignores any variants that satisfy the conditions above.
          setIgnore(true)
      }
  }
}
...

创建源集

默认情况下,Android Studio 会创建 main/ 源集和目录,用于存储在所有构建变体之间共享的一切资源。然而,当然也可以创建新的源集来控制 Gradle 要为特定的构建类型、产品风味(以及使用风味维度时的产品风味组合)和构建变体编译和打包的确切文件。
例如,可以在 main/ 源集中定义基本的功能,使用产品风味源集针对不同的客户更改应用的品牌,或者仅针对使用调试构建类型的构建变体包含特殊的权限和日志记录功能。

使用步骤如下:
(1)打开 Project 窗格并从窗格顶端的下拉菜单中选择 Project 视图。
(2)导航至 /app/src/。
(3)右键点击 src 目录并选择 New > Folder > Java Folder。
(4)从 Target Source Set 旁边的下拉菜单中,选择编译的版本。
(5)点击 Finish。

同样可以用来创建XML 值文件:
(1)在相同的 Project 窗格中,右键点击 src 目录并选择 New > XML > Values XML File。
(2)为 XML 文件输入名称或保留默认名称。
(3)从 Target Source Set 旁边的下拉菜单中,选择 编译的版本。
(4)点击 Finish。


4.png
5.png
6.png

更改源集配置

如果您的源未组织到 Gradle 期望的默认源集文件结构中,可以
使用 sourceSet{} 代码块更改 Gradle 希望为源集的每个组件收集文件的位置。
下面的代码示例可以将 app/other/ 目录中的源映射到 main 源集的某些组件,并更改 androidTest 源集的根目录。

android {
  ...
  sourceSets {
    // Encapsulates configurations for the main source set.
    main {
      // Changes the directory for Java sources. The default directory is
      // 'src/main/java'.
      java.srcDirs = ['other/java']

      // If you list multiple directories, Gradle uses all of them to collect
      // sources. Because Gradle gives these directories equal priority, if
      // you define the same resource in more than one directory, you get an
      // error when merging resources. The default directory is 'src/main/res'.
      res.srcDirs = ['other/res1', 'other/res2']

      // Note: You should avoid specifying a directory which is a parent to one
      // or more other directories you specify. For example, avoid the following:
      // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
      // You should specify either only the root 'other/res1' directory, or only the
      // nested 'other/res1/layouts' and 'other/res1/strings' directories.

      // For each source set, you can specify only one Android manifest.
      // By default, Android Studio creates a manifest for your main source
      // set in the src/main/ directory.
      manifest.srcFile 'other/AndroidManifest.xml'
      ...
    }

    // Create additional blocks to configure other source sets.
    androidTest {

      // If all the files for a source set are located under a single root
      // directory, you can specify that directory using the setRoot property.
      // When gathering sources for the source set, Gradle looks only in locations
      // relative to the root directory you specify. For example, after applying the
      // configuration below for the androidTest source set, Gradle looks for Java
      // sources only in the src/tests/java/ directory.
      setRoot 'src/tests'
      ...
    }
  }
}
...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容