Gradle在Android中的应用(三)

根目录下的 build.gradle

根目录下的 build.gradle 是对整个project的定义配置:Top-level build file where you can add configuration options common to all sub-projects/modules.根据下面这个示例,我们一一解读。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
        // NOTE: Do not place your application dependencies here; they 			// belong in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            url 'https://jitpack.io'
        }
        maven {
            url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
        }
    }
}

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

 //ext {
 //      compileSdkVersion = 22
 //     buildToolsVersion = "22.0.1"
 //}

buildscript 方法

buildscript 方法定义了全局的相关属性。其中 repositories 定义了插件依赖包的来源: google 和 jcenter 仓库。dependencies 用来定义构建过程中所使用的Android插件,如同注释所说,不要在这里定义 module 中所使用的依赖包。

allprojects 方法

allprojects 方法中的定义作用于各个模块,repositories 定义了module中依赖包的来源,示例中不仅定义了 google 和 jcenter 两个中心仓库,还定义了两个个人 maven 仓库,其 url 表明了它的地址。

task

这里默认定义了一个名为 clean 的 task ,它用于删除build文件下的文件。当我们点击AndroidStudio的Build ->clean project 时就会执行。另外值得一提的是,Gradle 中有四种基本的命令: assemble ; check ; build ; clean 。展开 AndroidStudio 右侧的 Gradle 标签页 ,你会发现它们。当然我们也可以自己定义 task,不过 Android 开发中,我们基本不会用到。

ext

ext 中定义的是在全局的 gradle 文件中的属性,一般常用来定义全局统一的常量值,例如compileSdkVersion buildToolsVersion 等等。定义之后,我们就可以在 module 下的Build.gradle 中引用了:

android {
       compileSdkVersion rootProject.ext.compileSdkVersion
       buildToolsVersion rootProject.ext.buildToolsVersion
 }

apply from

当我们需要在 ext 中定义较多的属性时,我们可以将其独立出来,编写一个 .gradle 文件,示例中我的是 config.gradle , 通过apply from: "config.gradle" 将其引入,其作用等同于 ext 中定义。但是,我并不推荐这样去写,因为他会隐藏错误,例如当你写错一个单词时,Gradle构建时无法执行,报错时不会提示到你具体的错误处,因为它还没有强大到理解你自定义的内容。下面是 config.gradle 中的内容:

ext {
    support = '27.1.1'

    retrofit2 = '2.3.0'

    //其他...

//android 这个组名不要改
    android = [
            applicationId    : "com.tincher.examandmentoring",
            applicationName  : "ExamAndMentoring",
            providerName     : "com.tincher.ex.fileProvider",

            compileSdkVersion: 26,
            minSdkVersion    : 16,
            targetSdkVersion : 26,
            versionCode      : 1,
            versionName      : "1.0.0",

            versionCodeLib   : 1,
            versionNameLib   : "1.0.0",
    ]


    //为方便区分,可将其分成多组。嫌麻烦,放在一组中即可。分组的名字自己定义,
    //每项逗号隔开
    suptDeps = [
            suptAppcompat:"com.android.support:appcompat-v7:${support}",
            supportV4    : "com.android.support:support-v4:${support}",
            supportDesign: "com.android.support:design:${support}"
            // 其他...

 	]

 	baseDeps = [
 	        retrofit2:"com.squareup.retrofit2:retrofit:$retrofit2"
 	        // 其他...
 	    ]

在 module 下的 build.gradle 引用并使用它们:

def mAppName = rootProject.ext.android.applicationName

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName

		buildConfigField "String", "mAppName", "\"${mApplicationName}\""
    }

}

接下篇Gradle在Android中的应用(四)