系列文章:html
咱们都知道利用Android Studio编写APP时,会使用Gradle这个工具,那么Gradle究竟是什么呢?它在APP编写中起到什么做用呢?java
Gradle是一个项目自动化建构工具。构建就是根据输入信息执行一系列操做,最后获得几个产出物(APK包)。android
传统的构建工具备Ant和Maven,但他们有一些缺点,例如Maven使用XML来制定构建规则。XML虽然通俗易懂,可是很难在xml中描述if{某条件成立,编译某文件}/else{编译其余文件}这样有不一样条件的任务。针对这类问题天然须要编程来解决,因此,Gradle选择了Groovy语言。编程
Gradle的另外一个特色是它是一种DSL(Domain-Specific-Language),即特定领域语言,就是针对某一领域而产生的语言。DSL的好处是一句话能够包含不少意思,由于只针对特定领域解决问题。api
Gradle当前其支持的语言限于Java、Groovy和Scala,计划将来将支持更多的语言。Gradle能够帮你管理项目中的差别,依赖,编译,打包,部署...,你能够定义知足本身须要的构建逻辑,写入到build.gradle中供往后复用,通俗的说:gradle是打包用的。网络
Groovy是个灵活的动态脚本语言,基于JVM虚拟机,语法和Java很类似,又兼容Java,且在此基础上增长了不少动态类型和灵活的特性,如支持闭包和DSL。Groovy的开发环境配置能够参考Groovy 环境配置,具体语言特性教程能够参考-Groovy教程。闭包
Groovy基于Java,又扩展了Java,运行过程当中首先会先将其编译成Java类字节码,而后经过JVM来执行这个Java类。app
Gradle是一个工具,也是一个编程框架。要弄清楚Gradle,则必须知道其组成的基本组件,Gradle中每一个待被编译的工程叫Project,每一个Project在构建时都包含一系列Task,如Android Studio构建过程当中包括Java代码编译Task,资源编译Task,Lint规则检查Task,签名Task等等。框架
参考深刻理解Android之Gradlemaven
配置Gradle环境前,确保已经安装配置好Java环境,下载Gradle后解压并配置环境变量,具体能够参考-配置Gradle
下面是一个Gradle语言版的Hello word例子:
// Gradle版Hello word
// 新建build.gradle文件:
task hello{ // 定义一个任务Task名为hello
doLast{ // 添加一个动做Action,表示在Task执行完毕后回调doLast闭包中的代码
println'Hello World'//输出字符串,单双号都可
}
}
// 命令行:
gradle hello // 执行build.gradle中名为Hello的任务
// 输出:
Hello World
复制代码
总而言之,学习Gradle咱们须要掌握Groovy语言,以及Gradle在Android Studio中的工做方式,工做流程,工做原理。
Android Studio 会使用高级构建工具包 Gradle 来自动执行和管理构建流程,同时也容许开发者定义灵活的自定义版本配置。每一个版本配置都可定义本身的一组代码和资源,同时重复利用应用各个版本的共用部分。
Gradle提供了一种编译、构建和打包 Android 应用或库的灵活方式。 一个Android Studio和Gradle的项目目录以下:
咱们先来看看Android Gradle项目中那些涉及到gradle的文件分别是什么意思。
一个Android项目中全部文件的具体含义可参考Android开发者指南
上图中涉及到Gradle wrapper的部分以下所示,具体有上图中的gradle文件夹,gradlew文件和gradlew.bat批处理文件。
|--gradle
| |--wrapper
| |--gradle-wrapper.jar
| |--gradle-wrapper.properties
|--gradlew
|--gradlew.bat
复制代码
gradle文件夹中包含wrapper,wrapper顾名思义是对Gradle的一层包装,便于在团队开发过程当中统一Gradle构建的版本。
上面目录中gradlew
和gradlew.bat
分别是Linux和Windows下的可执行脚本,gradle-wrapper.jar
是具体业务逻辑实现的jar包,gradlew
可执行脚本最终仍是使用这个jar包来执行相关Gradle
操做,gradle-wrapper.properties
是配置文件,用于配置使用哪一个版本的Gradle,配置文件中的具体内容以下所示:
#Wed Jun 19 10:09:08 GMT+08:00 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
复制代码
此文件用于初始化以及工程树的配置,大多数用于配置子工程,在Gradle中多个工程是经过工程树来表示的,至关于咱们在Android Studio看到的Project和Module概念同样,根工程至关于Project,子工程至关于Module,一个Project能够有不少Module,一个子工程只有在Setting.gradle
中配置了才会生效。 配置举例:
// 添加:app和:common这两个module参与构建
include ':app'
project(':app').projectDir = new File('存放目录')
include':common'
project(':common').projectDir = new File('存放目录')
复制代码
若是不指定上述存放目录,则默认为是Settings.gradle
其同级目录。
每一个工程都会有build.gradle文件,该文件是该工程的构建入口,在此文件中能够对该工程进行配置,如配置版本,插件,依赖库等。 既然每一个工程都有一个build文件,那么根工程也不例外,在根工程中能够对子Module进行统一配置,全局管理版本号或依赖库。 build文件分为Project和Module两种,以下图所示:
buildscript {
// gradle脚本执行所需依赖仓库
repositories {
google()
jcenter()
}
// gradle脚本执行所需依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
}
}
allprojects {
// 项目自己须要的依赖仓库
repositories {
google()
jcenter()
}
}
复制代码
那么buildscript中的repositories和allprojects的repositories的做用和区别是什么呢?
参考 做者:CalvinNing -原文连接
此部份内容参考下文中3.3.2节。
此文件主要在其中配置项目全局 Gradle 设置,如 Gradle 守护进程的最大堆大小。如需了解详情,请参阅构建环境
Gradle的设计很是好,自己提供一些基本的概念和总体核心的框架,其余用于描述真实使用场景逻辑的都以插件扩展的方式来实现,好比构建Java应用,就经过Java插件来实现,那么天然构建Android应用,就经过Android Gradle插件来实现。
Gradle 提供了不少官方插件,用于支持Java、Groovy等工程的构建和打包。同时也提供了自定义插件机制,让每一个人均可以经过插件来实现特定的构建逻辑,并能够把这些逻辑打包起来,分享给其余人。
Android Gradle插件是基于内置的Java插件实现的。Gradle插件的做用以下:
下面分别说下二进制插件和脚本插件的使用方法,
id式:apply plugin:'plugin id'
类型式:apply plugin:org.gradle.api.plugins.JavaPlugin
简写式:apply plugin:JavaPlugin
从Gradle的角度看,Android其实就是Gradle的一个第三方插件,它是由Google的Android团队开发的,Android 开发 IDE Android Studio 就采用 Gradle 构建项目。
主要来看下Android Gradle的build.gradle配置文件:
// 插件id
apply plugin:'com.android.application'
// 自定义配置入口,后续详解
android{
compileSdkVersion 23 // 编译Android工程的SDK版本
buildToolsVersion "23.0.1" // 构建Android工程所用的构建工具版本
defaultConfig{
applicationId "com.example.myapplication" // 配置包名
minSdkVersion 14 // 最低支持的Android系统的Level
targetSdkVersion 23 // 表示基本哪一个Android版本开发
versionCode 1 // APP应用内部版本名称
versionName "1.0" // APP应用的版本名称
}
buildTypes{
release{ // 构建类型
minifyEnabled false // 是否启用混淆
proguardFiles getDefaultPraguardFile('proguard-andrcid.txt'), 'proguard-rules.pro' // 配置混淆文件 } } } // 配置第三方依赖 dependencies{
implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } 复制代码
android{}是Android Gradle插件提供的一个扩展类型,可让咱们自定义Android Gradle工程。defaultConfig{}是默认的配置,是一个ProductFlavor(构建渠道),ProductFlavor容许咱们根据不一样的状况同时生成不一样的APK包。buildTypes{}是一个NamedDomainObjectContainer类型,是一个域对象,能够在buildTypes{}里新增任意多个咱们须要构建的类型,好比debug类型。
NamedDomainObjectContainer具体能够参考-NamedDomainObjectContainer详解
因为发布或者推广APP的渠道不一样,就形成了Android APP可能会有不少个,因此须要针对不一样的渠道作不一样的处理。 在Android Gradle中,定义了一个叫Build Variant(构建变体/构建产物)的概念,一个构建变体(Build Variant)=构建类型(Build Type)+构建渠道(Product Flavor),下面举个例子:
- Build Type有release、debug两种构建类型
- Product Flavor有baidu、google两种构建渠道
- Build Variant有baiduRelease、baiduDebug、googleRelease、googleDebug四种构件产物
配置好发布渠道后,Android Gradle插件就会生成不少task,好比assembleBaidu,assembleRelease,assembleBaiduRelease等
Gradle中一个原子性的操做叫作task,简单理解为task是Gradle脚本中的最小可执行单元。
- assembleBaidu:运行后会生成baidu渠道的release和debug包
- assembleRelease:运行后会生成全部渠道的release包
- assembleBaiduRelease:运行后只会生成baidu的release包
构建流程涉及许多将项目转换成 Android 应用软件包 (APK)的工具和流程,具体以下图所示:
Android 应用模块的构建流程一般按照如下步骤执行:
构建流程结束时,将得到应用的调试版 APK 或发布版 APK,以用于部署、测试或发布给外部用户。
以上摘自Android开发者指南
行文至此,本文已大概理清Gradle的基本概念,以及其在Android Studio中的工做流程,但Android Studio中Gradle的工做具体细节还未解释,如点击Run图标背后的Gradle的具体工做流程是什么?这些会在后续博客中继续分析。