其实学到这里,对于 AndroidStudio 里的 Gradle 仍是不懂, 好多东西见过 ,但是 不知道具体是干啥的,因此学好基础,到后面再看 Android Gradle 就很简 单了 。我 们接着学习基础。java
带着疑问去学习。android
咱们在 Gradle 中会常常看到根目录下有个 settings.gradlebash
settings.gradle 的做用是为了设置子工程,由于在 Gradle 的多工程是经过工程树来表示的,其实和 AndroidStudio 中的 project 和 Module 的概念差很少,根工程就是 project,子工程就是 module。app
一个子工程只有在 Settins 文件中配置了才会被 Gradle 识别,也就是才会在构建的时候被包含进去。ide
rootProject.name = 'mopub-android'
include ':mopub-sdk', ':mopub-sample', ':mopub-sdk:mopub-sdk-base', ':mopub-sdk:mopub-sdk-banner',
':mopub-sdk:mopub-sdk-interstitial', ':mopub-sdk:mopub-sdk-rewardedvideo',
':mopub-sdk:mopub-sdk-native-static', ':mopub-sdk:mopub-sdk-native-video'
复制代码
这里是为子项目指定默认的目录,咱们也能够手动指定目录。学习
include ':mopub-sdk'
project (':mopub-sdk').projectDir = new File(rootDir,'mopub/mopub-sdk')
复制代码
每个 Project 都会有一个 build.gradle ,这是该 Project 构建的入口,在这里对 Project 进行配置,好比依赖哪的库啊,依赖哪一个插件啊。gradle
虽然每一个 Project 都有一个 build.gradle 可是 Root Project 是老大,能够获取到全部 Child Project ,因此在 Root Project 的 build.gradle 中能够对 Child Project 统一进行配置。好比全部的 Child Project 的仓库为 jcenter,这样咱们依赖的 jar 就能够直接从 jcenter 中下载了。ui
buildscript {
repositories {
jcenter()
google()
}
...
}
复制代码
Child Projectgoogle
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.google.auto.service:auto-service:1.0-rc4'
implementation 'com.squareup:javapoet:1.11.1'
implementation project(path: ':router_annotation')
}
复制代码
多 Project 实际上是为了更好的拆分,低耦合、高聚合,一个项目能够由多个 project 组成,一个 Project 又能够由多个 Task 组成。spa
好比编译一次 Java 代码,上传到 JCenter,打包成 aar 等等都是任务。
//文件名为 custom.gradle
ask customTask{
doFirst{
println ':customTask:doFrist'
}
doLast{
println ':customTask:doLast'
}
}
复制代码
task Buying {
doLast{
println 'Buying:买菜'
}
}
task Washing(dependsOn: Buying){
doLast{
println 'Washing:洗菜'
}
}
task Cook(dependsOn: Washing){
doLast{
println 'Cook:作饭'
}
}
复制代码
名称有点拗口,其实意思就是,好比咱们写了一个 Task ,其实这个 Task 就和咱们定义的其余变量一下,能够直接使用 Task 以及他的方法。
task exHello {
println '<<'
}
exHello.doFirst{
println project.hasProperty('exHello')
println 'doFirst'
}
exHello.doLast{
println 'doLast'
}
复制代码
这个咱们就用的比较多了,基本都会使用到。若是须要添加额外的自定义属性,那么能够经过两种方式,一种是 ext.age 这样单独添加,一种是 ext{} 添加多个。
ext.age = 12
ext{
phone = 123456
address = 'beijing'
}
task exCustomProperty{
println phone
println address
println age
}
复制代码
相信你们在 AS 中都用过吧,因此这个自定义属性仍是用的很普遍的。跨 Project、跨 Task 等统一配置相信你们基本都搞过,没有搞过的就去搞搞。
还有一个地方挺常常用的,那就是 SourceSet,以及 使用 projectFlavors 中,都会和它打交道。
apply plugin:"java"
task exCustomProperty{
sourceSets.each{
println " ${it.name}--${it.java.srcDirs}"
}
}
sourceSets.all{
ext.srcDirs = null
}
sourceSets {
main {
srcDirs = ['main/src']
}
test{
srcDirs = ['test/src']
}
}
复制代码
因此咱们再开发中的时候,为了不各个 module 的配置不一样和免去手抖带来的 bug,因此须要统一管理一些配置信息,因此就能够 ext{},美滋滋,偷懒的利器。
这就是在 Gradle 中灵活的地方,在这个脚本文件中可使用 Groovy、Java 以及 Gradle 的任何语法和 API,来作咱们想要作的事情。在脚本里,能够定义类,内部类,导入包,定义方法,常量,接口,灵活的你想象不到,好比 咱们根据时间来生成 apk 包名。
def buildTime(){
def data = new Date()
def formattedData = date.format('yyyyMMdd')
return formattedData
}
复制代码
划重点: 本文是彻底参考 《Android Gradle 权威指南》而写,做为学习笔记使用。