Gradle是一种自动化构建语言,是一种DSL(Domain Specific language),目前是Android的默认构建工具,还一个编程框架。
Gradle特性 语言:Groovy,先将其编译成java类字节码,然后通过JVM来执行这个java类。
支持环境Android Studio和命令行,命令行方便调试构建粒度支持多个project、多个版本、多个构建类型可扩展性有丰富的API和插件架构其他构建工具Ant(销声匿迹)、Maven(日薄西山)等。https://fir.im/gradle 理解-解决-应用-分享
Gradle的重要概念 gradlew :linux 、 mac gradlew.bat :windows
一个gradle的封装体。有了gradle wrapper,即便你的机器上没有安装gradle,也可以执行gradle的构建工作。
F:\Demo2\ZuJianHua\MyButterKnife\gradle\wrapper gradle-wrapper.jar gradle-wrapper.properties将gradle-wrapper.jar转成gradle-wrapper.zip 并解压缩。
Groovy中的闭包是一个开放、匿名的代码块,可以接收参数,返回值并赋值给变量。 Groovy表达式省略括号的规范
所有顶级表达式的括号可以省略。当背包是一个顶级表达式的最后一个参数时,可以省略括号。但是函数嵌套调用已经函数没有参数时不能省略。 ./gradlew projectsGradle为每个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 依赖自己用,提高编译速度
解决方案: 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/distsall改成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 日志还不够
之前都是静态的概念project、warpper、Closure,编程需要动态过程。 动态过程: 1、初始化 2、配置 3、执行 每个阶段都可以插入钩子Hook,就是自己的代码
初始化阶段,对multi-project build而言就是执行settings.gradleinitilization phase的下个阶段是Configuration阶段。Configuration阶段的目标是解析每个project中的build.gradle。比如multi-project build例子中,解析每个子目录中的build.gradle。在这两个阶段之间,我们可以加一些定制化的Hook。这当然是通过API来添加的。Configuration阶段完后,整个build的project以及内部的Task关系就确定了。Configuration会建立一个有向图来描述task之间的依赖关系。所以,可以添加一个Hook,即当task关系图建立好之后,执行一些操作。最后一个阶段就是执行任务了,当然,任务执行完后,我们还可以加Hook。一个Project由一个或者多个task组成,它是构建过程中的原子任务,可以使编译class、上传jar包等。 configuration阶段-任务执行前的操作-执行阶段-任务执行后的操作
参数含义默认值nametype查看task: 或者命令行使用gradlew tasks 输出如下:
深入理解Gradle的作用
解决自己的问题;帮助其他同事,树立自己在团队中的良好形象;优化开发流程;分享自己的插件到互联网,提升自己的专业说服力;安装java和gradle 安装ideaintellj community
