Android Studio 按逻辑关系将每个模块的源代码和资源分组为源集(可以理解成包含源代码和资源的文件夹,下面项目机构图中的蓝色部分)。模块的 main/ 源集包含其所有版本变体共用的代码和资源,是项目生成时会默认创建的源集。其他源集目录是可选的,不会默认生成,需要手动添加。
在您配置新的版本变体时,Android Studio 不会自动创建这些目录。不过,创建类似于 main/ 的源集,有助于更好地组织管理,不同版本变体(Build Variant)使用的文件和资源。
"src/main/" 源集:默认会创建的源集,此源集包含所有版本变体共用的代码和资源。
"src/buildType/" 源集:需要手动创建的源集,创建此源集以纳入特定版本类型(BuildType,例如 Debug 版和 Release 版两种类型)专用的代码和资源。
"src/productFlavor/" 源集:需要手动创建的源集,创建此源集以纳入特定产品变种(ProductFlavors,例如同一个 APP 的收费版和免费版两种风格)专用的代码和资源。
"src/productFlavorBuildType/" 源集:需要手动创建的源集,创建此源集以纳入特定版本变体(Build Variant = Build Type * Product Flavors)专用的代码和资源。
如果不同源集包含同一文件的不同版本。Gradle 将按以下优先顺序决定使用哪一个文件(左侧源集替换右侧源集的文件和设置):
版本变体 > 版本类型 > 产品变种 > 主源集 > 库依赖项
如果不同的源集中包含不同的清单文件(AndroidManifest.xml 文件),也会使用同样的顺序进行选择。
更多的内容详见
Android Gradle 项目结构默认情况下,Android 项目的文件目录结构是像下面这样的,借用官方的一张图:
上图中,灰黑色代表着整个项目部分,绿色是项目中的不同模块,蓝色便是一个模块中的不同源集。
从图中可以看出,存在着多个 build.gradle 文件。事实上,Gradle 项目可以进行模块化编译。所以包含多个 build.gradle 文件,其中最顶层的被称为项目 gradle 文件,各个模块的 build.gradle 文件被称为模块 Gradle 文件。每个模块都有一个 build.gradle 文件,但项目 build.gradle 文件只会有一个。
另外,图中有几个其他作用的目录名,其中包括存放编译结果的 build 目录(编译出来的 APP 会存放到这里),和指定模块所需依赖包(APP 也是一个模块)的 libs 目录。
settings.gradle 文件位于项目的根目录下,用于指示 Gradle 在构建应用时应将哪些模块包含在内。对大多数项目而言,该文件很简单。当然,它可以做一些很复杂的事,但这需要对 gradle 文件和 Android 项目编译过程有很深的了解。一般不建议做其他事。大多数的 Android 项目的 settings.gradle 文件形式如下:
// APP 模块会被编译进项目中 include \':app\'而项目的 build.gradle 文件通常长这个样子:
/** * 此文件的这个编译脚本的代码块配置 gradle 本身所需要的依赖包,不应该在这里配置每个模块所需要的依赖包。 */ buildscript { /** * 此处配置用于 Android Gradle 项目构建的依赖库的搜索和下载位置, * 默认配置了包括 JCenter, Maven Central, Ivy 的远程仓库。 * 当然也可以配置本地依赖库,或者是其他的远程仓库。 * 下面的代码指定了 jcenter 远程仓库。 */ repositories { google() jcenter() } /** * 该代码块指定Android 项目需要用到的依赖包。 * 下面的代码是导入 Android Gradle 的插件,用于 Android 项目构建。 * 项目中各个模块都需要用到的插件和依赖包可以在这里指定 */ dependencies { classpath \'com.android.tools.build:gradle:3.5.2\' } } /** * 此处可以指定用于项目中所有模块的依赖仓库。包括第三方插件和依赖包等。 * 但是应该注意,模块级别的依赖包应该在模块内部的 build.gradle 文件中定义。 * 项目默认包含以下两种。并不会导入依赖包(除非明确指定了需要导入的包,不推荐这么做) */ allprojects { repositories { google() jcenter() } } 定义全局公用的额外属性定义
对于包含多个模块的 Android 项目,可能有必要在项目层级定义某些属性并在所有模块之间共享这些属性。为此,可以将额外的属性添加到项目 build.gradle 文件内的 ext 代码块中。
// 项目的 build.gradle 文件 buildscript {...} allprojects {...} // ext代码块包含自定义的额外属性,这些属性能够被项目中的其他所有模块所使用 ext { // 下面是两个例子 compileSdkVersion = 28 supportLibVersion = "28.0.0" ... }使用