google 文档说明 对应地址: https://developer.android.com/studio/build
创建源代码集
默认情况下,Android Studio 会为您希望在所有构建变体之间共享的所有内容创建
main/
源代码集和目录。不过,您可以创建新的源代码集以精确控制 Gradle 为特定构建类型、产品变种(以及使用变种维度时的产品变种组合)和构建变体编译和打包的文件。例如,您可以在main/
源代码集中定义基本功能,并使用产品变种源代码集为不同客户端更改应用的品牌信息,或仅为使用“debug”构建类型的构建变体添加特殊权限和日志记录功能。
Gradle 要求您以某种类似于
main/
源代码集的方式组织源代码集文件和目录。例如,Gradle 要求将“debug”构建类型特有的 Java 类文件放在src/debug/java/
目录中。
Android Plugin for Gradle 提供了一项有用的 Gradle 任务,向您展示了如何组织每个构建类型、产品变种和构建变体的文件。例如,以下任务输出示例描述了 Gradle 要求在何处能够找到“debug”构建类型的某些文件:
------------------------------------------------------------
Project :app
------------------------------------------------------------
...
debug
----
Compile configuration: compile
build.gradle name: android.sourceSets.debug
Java sources: [app/src/debug/java]
Manifest file: app/src/debug/AndroidManifest.xml
Android resources: [app/src/debug/res]
Assets: [app/src/debug/assets]
AIDL sources: [app/src/debug/aidl]
RenderScript sources: [app/src/debug/rs]
JNI sources: [app/src/debug/jni]
JNI libraries: [app/src/debug/jniLibs]
Java-style resources: [app/src/debug/resources]
如需查看此输出,请按以下步骤操作:
- 点击 IDE 窗口右侧的 Gradle 图标
- 依次转到 MyApplication > Tasks > android,然后双击 sourceSets。Gradle 执行该任务后,系统应该会打开 Run 窗口以显示输出。
- 如果显示内容不是处于如上所示的文本模式,请点击 Run 窗口左侧的 Toggle view 图标
注意:任务输出还为您展示了如何组织要用于运行应用测试的文件的源代码集,如
test/
和androidTest/
测试源代码集。
当您创建新的构建变体时,Android Studio 不会为您创建源代码集目录,而是为您提供一些有用的选项。例如,如需仅为“debug”构建类型创建 java/ 目录,请执行以下操作:
> 由于“debug”构建类型被指定为目标源代码集,因此 Android Studio 会在创建 XML 文件时自动创建必要的目录。生成的目录结构应如图 2 所示
>Java 文件 :
打开 Project 窗格,然后从窗格顶部的下拉菜单中选择 Project 视图。
转到 MyProject/app/src/。
右键点击 src 目录,然后依次选择 New > Folder > Java Folder。
从 Target Source Set 旁边的下拉菜单中,选择 debug。
点击 Finish。
XML 文件 :Android Studio 会为“debug”构建类型创建源代码集目录,然后在其中创建 java/ 目录。或者,您也可以让 Android Studio 在您为特定构建变体向项目中添加新文件时为您创建这些目录。例如,如需为“debug”构建类型创建值 XML 文件,请执行以下操作:
在同一 Project 窗格中,右键点击 src 目录,然后依次选择 New > XML > Values XML File。
输入 XML 文件的名称或保留默认名称。
从 Target Source Set 旁边的下拉菜单中,选择 debug。
点击 Finish。
java
xml
由于“debug”构建类型被指定为目标源代码集,因此 Android Studio 会在创建 XML 文件时自动创建必要的目录。生成的目录结构应如图 2 所示
遵循相同的过程,您也可以创建产品变种的源代码集目录(如src/demo/
)和构建变体的源代码集目录(如src/demoDebug/
)。此外,您还可以创建针对特定构建变体的测试源代码集,如src/androidTestDemoDebug/
。如需了解详情,请转到测试源代码集。
更改默认源代码集配置
如果您的源代码未按照 Gradle 要求的默认源代码集文件结构进行组织(如上文关于创建源代码集的部分中所述),您可以使用
sourceSets
代码块更改 Gradle 为源代码集的每个组件收集文件的位置。您无需改变文件的位置,只需向 Gradle 提供相对于模块级build.gradle
文件的路径,Gradle 应该会在该路径下找到每个源代码集组件的文件。如需了解您可以配置哪些组件,以及是否可以将它们映射到多个文件或目录,请参阅 Android Plugin for Gradle DSL 参考文档。
以下代码示例将 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源的目录。默认目录是 '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'.
翻译后:
如果列出多个目录,Gradle会使用所有目录来收集来源。因为Gradle赋予这些目录相同的优先级,如果 您在多个目录中定义了相同的资源,合并资源时出错。默认目录为“ 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.
翻译后:
注意:您应该避免指定一个目录,该目录是一个目录的父目录或您指定的其他目录(other/res1' 包含 'other/res1/layouts,所以不行)。
例如避免以下操作,res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
而应该只指定根目录“ other / res1”,或者仅指定 嵌套“ other / res1 / layouts”和“ other / res1 / strings”目录。
// 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.
翻译后:
对于每个源集,您只能指定一个Android清单文件。 默认情况下,Android Studio创建的清单文件在 src / main / 目录中设置。
例如,应用配置了 androidTest源集的后,Gradle寻找Java 源 仅在src / tests / java /目录中查找
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属性指定该目录
在收集源集的源时,Gradle仅在相对于您指定的根目录位置中查找
setRoot 'src/tests'
...
}
}
}
...
使用源代码集构建
您可以让源代码集目录包含您希望只针对某些配置打包在一起的代码和资源。例如,如果您要构建“demoDebug”这个变体(“demo”产品变种和“debug”构建类型的混合产物),则 Gradle 会查看这些目录,并为它们指定以下优先级:
src/demoDebug/(构建变体源代码集)
src/debug/(构建类型源代码集)
src/demo/(产品变种源代码集)
src/main/(主源代码集)
注意:如果您将多个产品变种组合在一起,那么这些产品变种的优先级由它们所属的变种维度决定。使用
android.flavorDimensions
属性列出变种维度时,属于您列出的第一个变种维度的产品变种的优先级高于属于第二个变种维度的产品变种,依此类推。此外,您为产品变种组合创建的源代码集的优先级高于属于各个产品变种的源代码集。
上面列出的顺序决定了 Gradle 组合代码和资源时哪个源代码集的优先级更高。由于 demoDebug/ 源代码集目录很可能包含该构建变体特有的文件,因此如果 demoDebug/ 包含的某个文件在 debug/ 中也进行了定义,Gradle 会使用 demoDebug/ 源代码集中的文件。同样,Gradle 会为构建类型和产品变种源代码集中的文件指定比 main/ 中的相同文件更高的优先级。在应用以下构建规则时,Gradle 会考虑这种优先级顺序:
java/ 目录中的所有源代码将一起编译以生成单个输出。
注意:对于给定的构建变体,如果 Gradle 遇到两个或更多个源代码集目录定义了同一个 Java 类的情况,就会抛出构建错误。例如,在构建调试 APK 时,您不能同时定义 src/debug/Utility.java 和 src/main/Utility.java。这是因为,Gradle 在构建过程中会查看这两个目录并抛出“重复类”错误。如果您希望不同的构建类型有不同版本的 Utility.java,则可以让每个构建类型定义各自的文件版本,而不是将其包含在 main/ 源代码集中。
所有清单会合并成一个清单。将按照上面列表中的顺序指定优先级。也就是说,构建类型的清单设置会替换产品变种的清单设置,依此类推。如需了解详情,请参阅清单合并。
同样,values/ 目录中的文件也会合并在一起。如果两个文件同名,例如存在两个 strings.xml 文件,将按照上面列表中的顺序指定优先级。也就是说,在构建类型源代码集的文件中定义的值会替换在产品变种的同一文件中定义的值,依此类推。
res/ 和 asset/ 目录中的资源会打包在一起。如果在两个或更多个源代码集中定义了同名的资源,将按照上面列表中的顺序指定优先级。
res/ 和 asset/ 目录中的资源会打包在一起。如果在两个或更多个源代码集中定义了同名的资源,将按照上面列表中的顺序指定优先级。
最后,在构建 APK 时,Gradle 会为库模块依赖项随附的资源和清单指定最低优先级。
声明依赖项
您可以为特定构建变体或测试源代码集配置依赖项,方法是在
Implementation
关键字前面加上构建变体或测试源代码集的名称作为前缀,如以下示例所示。
dependencies {
// Adds the local "mylibrary" module as a dependency to the "free" flavor.
翻译后 :将本地“ mylibrary”模块添加为对“ free”风格的依赖。
freeImplementation project(":mylibrary")
// Adds a remote binary dependency only for local tests.
翻译后 :仅为本地测试添加远程二进制依赖项。
testImplementation 'junit:junit:4.12'
// Adds a remote binary dependency only for the instrumented test APK.
翻译后:仅为自动化测试APK添加远程二进制依赖项。
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
如需了解详情,请参阅添加构建依赖项。