位图和布局等应用资源会划归到各个模块的 res/ 目录内的类型专属目录中。您还可以添加各个文件的备用版本,这些版本针对不同的设备配置进行了优化(例如,适用于高密度屏幕的位图的高分辨率版本)。

Android Studio 可以帮助您通过多种方式添加新资源和备用资源,具体取决于您要添加的资源的类型。本页介绍了如何添加基本的资源文件、如何更改资源的位置以及资源合并的工作原理。

您还应该查看以下页面,详细了解如何创建特定的资源类型:

要添加布局文件,请参阅使用 Layout Editor 构建界面。

要添加字符串文件,请参阅使用 Translations Editor 本地化界面。

要添加位图,请参阅使用 Image Asset Studio 创建应用图标。

要添加 SVG 文件,请参阅添加多密度矢量图形。

如需了解如何通过应用代码引用资源,请参阅提供资源。

添加 XML 资源文件

尽管上文链接的页面介绍了专门面向每种资源类型的工作流程,但您可以通过执行以下步骤添加任何 XML 资源文件:

  1. 点击 Project 窗口中的目标应用模块(在 Android 或 Project 视图中时),然后依次选择 File > New > Android resource file。
  2. 在对话框中填写详细信息:
  • File name:输入 XML 文件的名称(不需要输入 .xml 后缀)。
  • Resource type:选择要创建的资源的类型。
  • Root element:为文件选择根 XML 元素(如果适用)。某些资源类型仅支持一种类型的根元素,因此这项可能无法修改,具体取决于上面选择的资源类型。
  • Source set:选择要将文件保存到的源代码集。
  • Directory name:目录命名方式必须特定于资源类型和配置限定符。因此,除非您想手动将配置限定符添加到目录名称(请改为参阅 Available qualifiers),否则不应修改此项。
  • Available qualifiers:您可以通过点击左侧列表中的限定符,然后点击 Add 图标  添加可用限定符,而不是为布局目录输入配置限定符。
  1. 添加完所需的所有限定符之后,点击 OK。

提示:右键点击 res 文件夹中的现有资源目录,然后依次选择 New > type-name。这会打开简化版本的 New Resource File 对话框,该对话框特定于您所需的资源类型。

提示:某些复杂的资源需要多个 XML 资源文件。例如,动画矢量可绘制对象具有矢量可绘制对象和动画对象,这需要至少三个 XML 文件。如果您需要重复使用这三个单独的 XML 文件中的一个或多个,可以将其保留。但是,如果这些 XML 文件仅用于这一个动画矢量可绘制对象,则您可以改为使用 Android 资源打包工具 (AAPT) 中提供的内嵌资源格式。借助 AAPT,您可以在一个 XML 文件中定义所有这三种资源。如需了解详情,请参阅内嵌复杂的 XML 资源。

添加资源目录

如果您需要添加新的资源目录,请按照以下步骤操作:

  1. 点击 Project 窗口中的目标应用模块,然后依次选择 File > New > Android resource directory。
  2. 在对话框中填写详细信息:
  • Directory name:目录命名方式必须特定于资源类型以及配置限定符的组合。因此,除非您想手动将配置限定符添加到目录名称(请改为使用 Available qualifiers),否则不应修改此项。
  • Resource type:选择要创建的资源的类型。
  • Source set:选择要将布局保存到的源代码集。
  • Available qualifiers:您可以通过点击左侧列表中的限定符,然后点击 Add 图标  添加可用限定符,而不是为布局目录输入配置限定符。
  1. 添加完所需的所有限定符之后,点击 OK。

更改资源目录

默认情况下,您的资源位于 module-name/src/source-set-name/res/。例如,模块的主源代码集的资源位于 src/main/res/,调试源代码集的资源则位于 src/debug/res/。

不过,您可以使用 sourceSets {} 块中的 res.srcDirs 属性将这些路径更改为任何其他位置(相对于 build.gradle 文件)。例如:

android {
        sourceSets {
            main {
                res.srcDirs = ['resources/main']
            }
            debug {
                res.srcDirs = ['resources/debug']
            }
        }
    }

您还可以为一个源代码集指定多个资源目录,构建工具会将它们合并在一起。例如:

android {
        sourceSets {
            main {
                res.srcDirs = ['res1', 'res2']
            }
        }
    }

注意:如果两个或多个资源目录包含同一资源文件,则进行资源合并时会出错。

如需了解详情,请参阅源代码集。

资源合并

最终 APK 文件中的资源可能有 3 个不同的来源:

  • 主源代码集(通常位于 src/main/res/)
  • 构建变体源代码集
  • Android 库 (AAR)

如果来自各个源代码集或库的所有资源都是唯一的,则它们均会添加到最终 APK 中。如果某项资源的文件名在其资源类型目录和资源限定符(如果已定义)中都是唯一的,系统即会将该资源视为唯一的。

如果存在同一资源的两个或多个匹配版本,则只有一个版本会包含在最终 APK 中。构建工具会根据以下优先级顺序(左侧的优先级最高)选择要保留的版本:

构建变体 > build 类型 > 产品变种 > 主源代码集 > 库依赖项

例如,如果主源代码集包含:

  • res/layout/foo.xml
  • res/layout-land/foo.xml

并且调试 build 类型包含:

  • res/layout/foo.xml

则最终 APK 会包括来自调试 build 类型的 res/layout/foo.xml 和来自主源代码集的 res/layout-land/foo.xml。

但是,当您的构建配置为一个给定的源代码集指定了多个资源文件夹时,如果这些来源之间存在冲突,则会发生错误,并且合并会失败,因为各个资源目录的优先级相同。