项目结构中的每个build.gradle文件代表一个project,在这编译脚本文件中可以定义一系列的task;
task 本质上又是由一组被顺序执行的Action`对象构成,Action其实是一段代码块,类似于Java中的方法。
参考:来源(请点击)
每次构建的执行本质上执行一系列的Task。某些Task可能依赖其他Task。
那些没有依赖的Task总会被最先执行,而且每个Task只会被执行一遍。每次构建的依赖关系是在构建的配置阶段确定的。
这是创建Project阶段,构建工具根据每个build.gradle文件创建出一个Project实例。
初始化阶段会执行项目根目录下的settings.gradle文件,来分析哪些项目参与构建。
告诉Gradle这些项目需要编译,所以我们引入一些开源的项目的时候,需要在这里填上对应的项目名称,来告诉Gradle这些项目需要参与构建
settings.gradle
include ':demo', ':library'
这个阶段,通过执行构建脚本来为每个project创建并配置Task。
配置阶段会去加载所有参与构建的项目的build.gradle文件,会将每个build.gradle文件实例化为一个Gradle的project对象。
然后分析project之间的依赖关系,下载依赖文件,分析project下的task之间的依赖关系。
这是Task真正被执行的阶段,Gradle会根据依赖关系决定哪些Task需要被执行,以及执行的先后顺序。
task是Gradle中的最小执行单元,我们所有的构建,编译,打包,debug,test等都是执行了某一个task。
一个project可以有多个task,task之间可以互相依赖。
例如我有两个task,taskA和taskB,指定taskA依赖taskB,然后执行taskA,这时会先去执行taskB,taskB执行完毕后在执行taskA。
root—
settings.gradle
gradle.properties
build.gradle
demo——–build.gradle
library—–build.gradle
|
|
include ':demo', ':library'
VERSION_NAME=1.2.0 // 在gradle.properties文件下定义了一些宏属性 方便在程序中获得
VERSION_CODE=22
GROUP=com.daimajia.swipelayout
ANDROID_BUILD_MIN_SDK_VERSION=9
ANDROID_BUILD_TARGET_SDK_VERSION=25
ANDROID_BUILD_SDK_VERSION=25
ANDROID_BUILD_TOOLS_VERSION=25.0.2
这个文件用来配置针对所有模块的一些属性。它默认包含2个代码块:
buildscript{…}和allprojects{…}
buildscript{…} 配置构建脚本所用到的代码库和依赖关系
allprojects{…} 定义所有模块需要用到的一些公共属性
buildscript {
repositories {
jcenter() // 配置代码仓库使用 jcenter() 和 maven
maven {
url "https://jitpack.io"
}
}
dependencies { // 配置脚本的依赖关系 使用 把 com.android.tools.build:gradle:2.3.0 这个安卓Gradle Plugin 加入到classpth中
//buildscript:定义了 Android 编译工具的类路径
classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
}
}
allprojects {// 定义所有模块需要用到的一些公共属性
repositories {
jcenter() // 所有模块都使用 jcenter() 这个代码仓库 jCenter是一个著名的 Maven 仓库
maven {
url "https://jitpack.io"
}
}
task alltaskDemo << { //执行gradle alltaskDemo 定义了 所有 module 包括 本身project 都包含的共同方法 alltaskDemo
println project.name
}
}
subprojects { // // Project 的为所有的子Project 不包括本身 起作用的 方法 执行 gradle subtask
task subTask << {
println project.name
}
}
project(':demo') { // 为子Modle :demo定义任务task
task demoTask << {
println 'add demoTask in root build.gradle'
}
}
task clean(type: Delete) { // 为project本身 添加一个 Task , 这个task 用于删除根目录下的buildDir文件夹
delete rootProject.buildDir // 【D:\version\9GAG-master\build 】
}
在该文件下默认有3个重要的代码块:plugin,android 和 dependencies
apply plugin: 'com.android.application' // 应用com.android.application这个Plugin 说明 编译出来是APK
repositories { // 指定 jcenter() 这个代码仓库 其实root: settings.gradle已经指定了
jcenter()
}
android { // android代码块用于配置 应用的各种配置编译信息
// project.ANDROID_BUILD_SDK_VERSION 为 ANDROID_BUILD_SDK_VERSION=25 在 gradle.properties 文件中定义
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION) // 当前APK编译使用的SDK版本 25
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION // 安卓编译工具版本 25.0.2
defaultConfig {
minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)// 最小支持的SDK版本位 9
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION) // 目标SDK版本 25
versionName project.VERSION_NAME // 工程APP的名称
versionCode Integer.parseInt(project.VERSION_CODE) // 工程APP的版本号
}
buildTypes { // 定义了编译类型 详情看下面
release { // release发布 编译类型 区别于 debug编译类型
minifyEnabled false // minifyEnabled 表示是否混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //proguardFiles 混淆文件
}
}
lintOptions { // 忽略编译器的 lint 检查
abortOnError false
}
}
dependencies { // 定义依赖关系项
compile project(":library") // 编译本Module时 依赖本地另一个:library 这个Module
compile 'com.android.support:recyclerview-v7:25.1.1' // 编译时依赖的jcenter 包 每个库名称包含三个元素:组名:库名称:版本号
// compile files('libs/YibaAnalytics5.jar') // 表示依赖本地的 libs/YibaAnalytics5.jar 这个JAR包
// flatDir { dirs '../aar' } // ../aar 表示根目录下的 aar 文件夹
//compile(name:'YibaAnalytics-release', ext:'aar') // 自定义依赖包目录 并添加编译依赖
compile 'com.daimajia.easing:library:1.0.0@aar'
compile 'com.daimajia.androidanimations:library:1.1.2@aar'
compile 'com.nineoldandroids:library:2.4.0'
// This dude gave a shoutout to you (daimajia) on his github page:
compile 'jp.wasabeef:recyclerview-animators:1.0.3@aar'
}
buildTypes的属性
name:build type的名字
applicationIdSuffix:应用id后缀
versionNameSuffix:版本名称后缀
debuggable:是否生成一个debug的apk
minifyEnabled:是否混淆
proguardFiles:混淆文件
signingConfig:签名配置
manifestPlaceholders:清单占位符
shrinkResources:是否去除未利用的资源,默认false,表示不去除。
zipAlignEnable:是否使用zipalign工具压缩。
multiDexEnabled:是否拆成多个Dex
multiDexKeepFile:指定文本文件编译进主Dex文件中
multiDexKeepProguard:指定混淆文件编译进主Dex文件中
apply plugin: 'com.android.library' // 指定本module 生成 lib库文件
android {
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
minSdkVersion 9
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
}
}
dependencies { // 编译时依赖
compile 'com.android.support:recyclerview-v7:25.2.0'
compile 'com.android.support:support-v4:25.2.0'
//compile 'com.android.support:support-v4:+'
//compile 'com.android.support:support-v4:24.1.1'
}
apply from: './gradle-mvn-push.gradle'
// build a jar with source files
task sourcesJar(type: Jar) { // 定义一个把源码生成jar包的任务task
from android.sourceSets.main.java.srcDirs // 源input为路径main这个sourceSets下的 main.java.srcDirs
classifier = 'sources'
}
artifacts { // artifacts 貌似在 'com.android.library' 这个plugin提供的方法属性 ,artifacts的archives属性表示 执行的编译构建任务
archives sourcesJar
}