参考资料
- Gradle Plugin 用户使用指南
- [Android Studio 自定义Gradle Plugin][https://www.jianshu.com/p/af2b0a43133f]
- Gradle 入门–只此一篇
- 给 ANDROID 初学者的 GRADLE 知识普及
- 深入理解Android之Gradle
- 重新认识AndroidStudio&Gradle
- Gradle入门系列
- 官方文档 https://docs.gradle.org/current/dsl/
- api文档: http://www.groovy-lang.org/api.html
简介
Groovy
是一种动态语言。它和Java
一样,也运行于Java虚拟机中。几乎完全兼容JavaGradle
提供了构建项目的一个框架,可以单独安装使用,安装地址https://gradle.org/install/
gradle-wrapper
顾名思义,这表示是包装过的Gradle
,Android
工程中一般就的就是它,所以命令行执行的时候就会变成gradlew [task名称]
,这里的gradlew,其实提指的就是工程根目录下的gradlew.bat
和gradlew
文件
如果工程里面没有
gradle-wrapper
,可以通过gradle wrapper
生成
以下几个常用命令(注意Win系统下gradlew
而linux系统下需要用./gradlew
)
./gradlew -v
版本号./gradlew clean
清除9GAG/app目录下的build文件夹./gradlew build
检查依赖并编译打包
这里注意的是./gradlew build
命令把debug
、release
环境的包都打出来,如果正式发布只需要打 Release 的包,该怎么办呢,下面介绍一个很有用的命令 assemble , 如./gradlew assembleDebug
编译并打Debug包./gradlew assembleRelease
编译并打Release的包./gradlew :app:dependencies --configuration compile
查看依赖关系
完成工程构建示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19├── app #Android App目录,可改名,但需要在settings.gradle里面配置
│ ├── app.iml
│ ├── build #构建输出目录
│ ├── build.gradle #构建脚本
│ ├── libs #so相关库
│ ├── proguard-rules.pro #proguard混淆配置
│ └── src #源代码,资源等
├── build
│ └── intermediates
├── build.gradle #工程构建文件
├── gradle
│ └── wrapper
| ├── gradle-wrapper.jar
| └── gradle-wrapper.properties #gradle的版本配置
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell脚本
├── gradlew.bat #gradle wrapper window下的shell脚本
├── local.properties #配置Androod SDK位置文件
└── settings.gradle #工程配置
Gradle脚本写法
都以
gradlew
的写法为例
几个重要对象Project,Task ,Action
Project:是Gradle最重要的一个领域对象,我们写的build.gradle脚本的全部作用,其实就是配置一个Project实例。它里面有几个重要的成员变量和方法,例如:
1 | rootProject //整个工程实例 |
Task:被组织成了一个有向无环图(DAG)。Gradle中的Task要么是由不同的Plugin引入的,要么是我们自己在build.gradle文件中直接创建的
可以通过gradlew tasks
来查看有哪些任务task
定义task
1 | task myTask { |
用以下命令执行
1 | gradlew myTask |
这段代码的含义:给Project添加一个名为“myTask”的任务
用一个闭包来配置这个任务,Task提供了doFirst和doLast方法来给自己添加Action。注意:
要执行的代码一定要放到doLast或者doFirst中,不会它会在任务构建完成前执行
1 | //Test文件夹下建一个src目录,建一个dst目录,src目录下建立一个文件,命名为test.txt |
这是一个“显式地声明Task的类型“的方式
task的依赖关系
1 | task taskA { |
然后我们在命令行运行:
1 | gradle taskA |
运行结果会先执行taskB的打印,然后执行taskA的打印
通过
dependsOn
的依赖方式,可让我们已有的task后面添加任务,例如Maven的打包上传gradlew upload
(不太确定是不是这个命令)和AndResGuard
资源压缩就是通过依赖实现的
通过project.afterEvaluate{ }添加任务
例如我们编译完成apk后,需要把apk,mapping等文件拷出来并重命名,但是又不想改变原有的命令
例如新建文件copyApk.gradle
1 | def outputPath = "./outApk/" |
在app模块的build.gradle
的最下面引用该文件
1 | apply from: "copyApk.gradle" |
一些方法的使用
拷贝文件
用copy方法
1 | copy{//拷贝maping文件 |
引入layoutlib.jar包
该包下面有一些系统使用的类,但不建议引入(可以用反射)
1 | dependencies { |
从AndroidManifest下面获取VersionName
1 | //获取apk版本号 |
获取当前git的分支名
1 | /** |