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

How does resConfigs work in android (gradle)?

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

官方文档:


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

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


Android 应用设置

测试应用有


我的测试观察结果

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


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

结果 1: 在 apk 中,


测试 2: 我只指定了 drawables resConfigs="xxhdpi"

结果 2: 在 apk 中,


测试 3: 我指定了语言和可绘制对象 resConfigs="en","fr","xxhdpi"

结果 3: 在 apk 中,


问题:

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

相关问题:

  1. resConfigs 仅在应用级别 gradle 对我有效。当我试图在依赖模块上使用它时,它完全忽略了它。如何让它在依赖模块上工作。 (我试图整合 firebaseUI for auth
  2. resConfigs 处于开发的早期阶段,还是仅用于开发目的,不用于产品设置?

这里有一些注意事项

  • resConfigs 使用资源限定符组
  • 资源限定符分组在不同的桶中,如语言、dpi、平台版本等。

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

所有可用的grouping/buckets请参考以下link。 https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources

希望这是有道理的。