文章目录
Android开发效率提升十倍的利器-Gradle
Gradle_3">1 Gradle介绍
1 语言和作用
Gradle是一种自动化构建语言,是一种DSL(Domain Specific language),目前是Android的默认构建工具,还一个编程框架。
Gradle特性
语言:Groovy,先将其编译成java类字节码,然后通过JVM来执行这个java类。
支持环境 | Android Studio和命令行,命令行方便调试 |
构建粒度 | 支持多个project、多个版本、多个构建类型 |
可扩展性 | 有丰富的API和插件架构 |
其他构建工具 | Ant(销声匿迹)、Maven(日薄西山)等。 |
Gradle_18">2 Gradle的作用
https://fir.im/gradle
理解-解决-应用-分享
AndroidGradle_24">3 怎么理解Android工程的Gradle代码
Gradle的重要概念
gradlew :linux 、 mac
gradlew.bat :windows
Gradle_Wrapper_30">3.1 Gradle Wrapper
一个gradle的封装体。有了gradle wrapper,即便你的机器上没有安装gradle,也可以执行gradle的构建工作。
F:\Demo2\ZuJianHua\MyButterKnife\gradle\wrapper
gradle-wrapper.jar
gradle-wrapper.properties
将gradle-wrapper.jar转成gradle-wrapper.zip 并解压缩。
3.2 闭包(Closure)
Groovy中的闭包是一个开放、匿名的代码块,可以接收参数,返回值并赋值给变量。
Groovy表达式省略括号的规范
- 所有顶级表达式的括号可以省略。
- 当背包是一个顶级表达式的最后一个参数时,可以省略括号。
- 但是函数嵌套调用已经函数没有参数时不能省略。
./gradlew projects
AndroidGradle_Project_56">3.3 Android工程和Gradle Project
Gradle为每个build.gradle都会创建一个相应的Project领域对象,在编写Gradle脚本时,我们实际上都在操作诸如Project这样的Gradle领域对象。
在rootProject下
buildscript {//配置插件用的
repositories {//仓库
google()//到google中去下载
jcenter()//到jcenter中去下载
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'//google提供的插件
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
buildscript:来配置这个工程构建打包过程中需要哪些插件以及去哪里下载这些插件。
dsl:语言规范
allprojects {//配置Module用的
repositories {//仓库
google()
jcenter()
}
}
仓库:就是放编译好的代码的地方,或者存储jar包的地方(还有aar)。因为代码要基于第三方或者其他团队的的代码 来开放我们的代码,把代码放在仓库中分享给别人用。
task clean(type: Delete) {
delete rootProject.buildDir
}
清除buildDir
在settings.gradle:在初始化时候用,在Gradle构建的阶段,第一步执行的代码。
include ':app', ':butterknife_annotations', ':butterknife_compiler'
app的build.gradle:
//插件引入进来,都在'com.android.tools.build:gradle:3.2.0'这个插件提供的
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {//闭包,方法调用
applicationId "com.hongx.mybutterknife"
minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {//依赖
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
implementation
compile = api
gradle = class
api = public
implementation = private 依赖自己用,提高编译速度
Gradle_145">4 Gradle打包慢怎么办
解决方案:
1、gradle下载慢?
gradle-wrapper.properties中
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
all改成bin
还有
C:\Users\hongx\.gradle\wrapper\dists\gradle-4.6-all\bcst21l2brirad8k2ben1letg
下载相应gradle并放入文件夹下
2、依赖包下载慢?
设置代理
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
//放在第一个,会先去找,找不到到下一个仓库找。
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
阿里云仓库地址:
https://maven.aliyun.com/mvn/view
3、每次编译都很慢?
不要使用带+号的依赖,编译慢了,可靠性降低,容易出bug。
4、终极解决方案是什么?
自己搭建nexus。
5、碰到问题怎么办?
使用命令行来进行编译,编译有问题,会有详细的日志出来。
./gradlew assembleDebug
./gradlew assembleDebug --info 很详细的日志出来
./gradlew assembleDebug --debug 日志还不够
GradleAPKFIR_227">5 Gradle自动上传APK到FIR并发消息到钉钉插件
Gradle_228">5.1 Gradle的工作流程
之前都是静态的概念project、warpper、Closure,编程需要动态过程。
动态过程:
1、初始化
2、配置
3、执行
每个阶段都可以插入钩子Hook,就是自己的代码
- 初始化阶段,对multi-project build而言就是执行settings.gradle
- initilization phase的下个阶段是Configuration阶段。
- Configuration阶段的目标是解析每个project中的build.gradle。比如multi-project build例子中,解析每个子目录中的build.gradle。在这两个阶段之间,我们可以加一些定制化的Hook。这当然是通过API来添加的。
- Configuration阶段完后,整个build的project以及内部的Task关系就确定了。Configuration会建立一个有向图来描述task之间的依赖关系。所以,可以添加一个Hook,即当task关系图建立好之后,执行一些操作。
- 最后一个阶段就是执行任务了,当然,任务执行完后,我们还可以加Hook。
Gradle_tasks_243">5.2 Gradle tasks
一个Project由一个或者多个task组成,它是构建过程中的原子任务,可以使编译class、上传jar包等。
configuration阶段-任务执行前的操作-执行阶段-任务执行后的操作
参数 | 含义 | 默认值 |
---|---|---|
name | ||
type |
查看task:
或者命令行使用gradlew tasks
输出如下:
Gradle__256">5.3 Gradle 插件
深入理解Gradle的作用
- 解决自己的问题;
- 帮助其他同事,树立自己在团队中的良好形象;
- 优化开发流程;
- 分享自己的插件到互联网,提升自己的专业说服力;
Gradle_Plugin_Protal_265">5.4 分享到Gradle Plugin Protal
安装java和gradle
安装ideaintellj community