这是因为资源合并需要在TypedArray
检索到之前发生。
基于 Gradle 的构建系统使用新的资源合并机制。在以前的构建系统中,合并是通过将资源文件夹列表传递给充当叠加层的 aapt 来完成的,以及 --auto-add-overlay 以确保自动添加叠加层中的新资源(默认行为是叠加层是只覆盖现有资源,而不是创建新资源)。
基于 Gradle 的构建系统的目标之一是提供更大的灵活性,一个常见的功能请求是能够拥有多个资源文件夹。aapt 无法处理此问题,因此新的构建系统引入了一种新的合并机制,该机制在 aapt 之前运行并生成一个单一的、合并的资源文件夹,该文件夹被提供给 aapt。这种合并具有增量的优点,无论是通过 Gradle 的输入/输出更改检测,还是在实现方式上(即它可以通过仅在单个文件中应用更改来重新运行合并)。
合并的资源来自 3 种类型的来源:
- 主资源,与主sourceSet相关联,一般位于src/main/res
- 来自 Build Type 和 Flavor(s) 的变体覆盖。
- 库项目依赖项,通过其 aar 包中的 res 条目提供资源。
例如,如果您使用不同的productFlavors
或者buildTypes
您可能对每种口味有不同的资源。所以开发时最初设定的可能与更改风味后实际呈现的有所不同。