Difference between build.gradle (Project) and build.gradle (Module)

I am trying to add a dependency of Android Asynchronous Http Client into my project. So there are two build.gradle files in the project.

Enter image description here

As per my understanding, there are different kind of dependencies:

  1. One which defined on the root level of build.gradle (Project:My-app)
  2. One inside the buildscript of the build.gradle (Project:My-app)
  3. Another is build.gradle (Modules:app)

This question is about repositories for dependencies of the buildScript, explain a bit about first two types.

Also build.gradle (Project:My-app) says

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

So I guess the dependency code of Android Asynchronous Http Client should be added in build.gradle (Module:app).

How does it all fit together?

62925 次浏览

Gradle (项目: My-app)

顶级生成文件,您可以在其中添加通用的配置选项 所有附属项目/单元。

每个项目包含一个 最高级别的格拉德尔文件。它通常包含所有 modules常见构型。无论是包括在这个顶级的 Gradle Gile,它将影响所有 模组

例如:

// Top-level build file where you can add configuration options common to all sub-projects/modules.


buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-alpha3'


//Maven plugin
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'


// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}


allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}


task clean(type: Delete) {
delete rootProject.buildDir
}

Gradle (模块: app)

构建特定模块 (您可以在其中添加依赖项、签名配置、构建类型、风格等等)的文件

All 模组 have a specific Gradle file. Whatever is included in this 格莱德 file, it will only affect the 模组 that is included on.

例如:

apply plugin: 'com.android.application'


android {
compileSdkVersion 23
buildToolsVersion "23.0.2"


defaultConfig {
applicationId "com.hrskrs.gesturefun"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
zipAlignEnabled true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
zipAlignEnabled true
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}


dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':gesture-fun')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.jakewharton:butterknife:7.0.1'
}

这有点令人困惑,因为 Android Studio 默认显示两个 build.gradle文件并排放置(在使用 Android 视图时)。

enter image description here

如果切换到 Project 视图,您可以看到实际的结构以及不同的 build.gradle文件所在的位置。

enter image description here

build.gradle(Project: MyApplication)文件位于项目的根文件夹中,其配置设置适用于项目中的每个模块。模块是更大项目的一个独立部分。在一个多模块的项目中,这些模块有它们自己的工作,但是一起工作,形成整个项目。大多数 Android 项目只有一个模块,即应用程序模块。

这里的 build.gradle(Module: app)文件位于 app文件夹中。它的构建设置仅适用于应用程序模块。如果存在另一个模块,那么该模块也将拥有自己的 build.gradle文件。作为一个 例子,我制作了一个包含三个模块的库项目: 一个库模块、一个演示应用程序模块和另一个计划用于测试的应用程序模块。他们每个人都有自己的 build.gradle文件,我可以调整。

enter image description here

在一个基本的项目中,几乎所有需要编辑的内容都在应用程序模块的 build.gradle文件中。你可以这样记住:

你正在制作一个 应用程序,所以转到 build.gradle(模块: 应用程序)文件。

进一步阅读

About the relation of the two gradle files, 人类 made a very clear explanation,and I will make some supplement about it.

如果您的项目只有一个模块(如 应用程序) ,顶部 Gradle (项目: My-app)的优势不是很明显。因为您可以在 Gradle (模块: app)中配置关于模块的所有内容,并且在接下来的日子里升级时只需修改一个文件。

但是如果您的项目有五个模块,并且它们具有相同的依赖关系 A,那么如果您不使用顶部的 Gradle (项目: My-app),那么您需要在接下来的几天内维护五个文件。

顺便说一下,Gradle (模块: app)可以覆盖 Gradle (项目: My-app)

这种设计可以提高应用程序的可维护性。

[项目对模组]

项目的 build.gradle文件用于公共/共享逻辑。例如,您可以在这里定义存储库(Maven、 Google、 JCenter和自定义) ,或者使用共享变量指定 ext {}classpath< sup > [ About ]

模块的 build.gradle用于当前模块,如依赖关系、 minSdkVersion、 targetSdkVersion、编译 SdkVersion< sup > [ About ] 、 ProGuard 设置 s< sup > [ About ] 。通常作为一个开发人员,您应该处理这个文件。

Things get more clear when you have multi-project module, then differences of module vs project Gradle are more clear.

您可以使用 用于定义所需的类路径,插件,源代码库(google,maven 等)从.build.gradle 的项目级别的更改中获取依赖项,这些更改适用于完成项目。 然而,有一个谷歌问题跟踪说,关于依赖泄漏到项目。

https://github.com/gradle/gradle/issues/8301

Https://github.com/gradle/gradle/issues/4741

但是在高级别上,如果您希望更改适用于您的整个项目,那么可以向项目级别的 Gradle 文件添加一些内容,这样可以减少维护模块之间的依赖性。

顶级模块主要用于签名信息,版本详细信息,构建类型,产品风格,插件和依赖关系等的时候。 进一步的低级模块主要关注依赖关系和特定模块所需的插件,通常我们只是使用 < strong > low 模块的构建级别来添加特定的依赖关系。