resConfigs 在 android (gradle) 中如何工作?

yaj*_*esh 12 android build gradle kotlin android-studio

缺乏关于 gradle 方法的适当文档resConfigs让我问这个问题。

官方文档:

  • 这个例子中,谷歌给出了如何将其与语言一起使用的具体示例。
  • 这个例子中,谷歌混合了语言和绘图
  • 我无法找到任何像 gradle doc 这样的javadoc

我的(大部分是错误的)理解:

如果我在 前面指定某些内容resConfigs,则只有该内容会包含在最终版本中,其他所有内容都不会捆绑到 apk 中。


安卓应用程序设置

测试应用程序有

  • 多种语言(values-en、values-fr、...)
  • 多个可绘制文件夹(drawable-xxhdpi、drawable-xxxhdpi,...)
  • 多个 Android 版本(values-v21、values-v7、...)
  • 多个最小宽度(sw800、sw1000、...)
  • 多个方向(港口、陆地)
  • ETC

我的测试观察

注意:我使用android studios的apk分析器推导出以下结果。在每次测试之前,都会在启用 proguard(shrink) 的情况下生成完整的清理、重建和生产版本。


测试 1: 我仅指定语言resConfigs="en", "fr"

结果1: 在apk中,

  • 除 en 和 fr 外,所有语言都消失了
  • 所有其他资源都存在(drawables、dimens、sw、orientation ...)

测试 2: 我只指定了可绘制对象resConfigs="xxhdpi"

结果2: 在apk中,

  • 所有语言都在场
  • 所有其他资源都存在(dimens、SW、方向...)
  • 除了 xxhdpi 之外,所有可绘制对象都消失了。(所有其他可绘制文件夹都存在,但有 0 字节文件)

测试 3: 我指定了语言和绘图resConfigs="en","fr","xxhdpi"

结果3: 在apk中,

  • 除 en 和 fr 外,所有语言都消失了
  • 所有其他资源都存在(dimens、SW、方向...)
  • 除了 xxhdpi 之外,所有可绘制对象都消失了。

问题:

  1. 当我只指定 languages 时resConfigs="en", "fr",为什么其他资源会捆绑到 apk 中(例如:drawables)
  2. 类似地,当我只指定 时 resConfigs="xxhdpi",为什么语言和其他资源会被捆绑在一起
  3. 如果 gradle 使用一些智能来找出要排除的内容和不排除的内容,是否存在属于同一类别的资源组列表,是否有任何文档?
    例如
    • 语言是一个组,如果gradle找到至少一个语言标签,它就会排除所有其他语言。否则,包括所有语言?
    • Drawable是一组,如果gradle找到至少一个drawable标签,它会排除所有其他drawable。否则,包括所有可绘制对象?

相关问题:

  1. resConfigs仅在应用程序级别 gradle 上为我工作。当我尝试在依赖模块上使用它时,它完全忽略了它。如何使其在依赖模块上工作。(我试图集成firebaseUI 进行 auth
  2. 处于resConfigs开发的早期阶段,还是仅用于开发目的,而不用于产品设置?

Ams*_*eev 5

这里有一些需要记住的事情

  • resConfigs 与资源限定符组一起使用
  • 资源限定符分为不同的类别,如语言、dpi、平台版本等。

当您向 resConfigs 提供资源限定符时,该存储桶中限定符的所有其他资源都将被删除。其他桶中的资源不受影响。

请参阅以下链接了解所有可用的分组/存储桶。 https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources

希望这是有道理的。