Gradle
初识Gradle
在用AndroidStudio创建一个工程的时候,会发现工程目录中除了必须的工程代码以及各种资源文件外,还有一些后缀为.gradle的文件,这些就是gradle的配置文件,是基于gradle的构建脚本。
什么是Gradle
Gradle是一种项目自动化建构工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言, 而Groovy语言是一种基于jvm的动态语言。
Project和tasks
在grade中的两大重要的概念,分别是project和tasks。
Android studio中的project和Gradle中的project不是一个概念。
每一次构建都是有至少一个project来完成,每个project有至少一个tasks。每一个build.grade文件代表着一个project。tasks在build.gradle中定义,很像Java中的方法。在构建过程中,不同的Task各司其职。每个Task相当于一个Project对象的函数,专门用来干一件事。
不同的Task之间可以增加依赖,比如Task A依赖于B,那么要执行A首先会执行B。而一个任务可以依赖的任务不止一个。在每一个Project中都必须有一个build.gradle文件,这是一个构建脚本,类似于makefile,这个文件是整个Project构建的入口,可以在其中做一些配置,比如版本、插件、依赖等。
工作流程/生命周期
简单来说,Gradle的工作过程分为三个阶段:Initialization阶段、Configuration阶段以及Execution阶段。
初始化阶段:project实例在这儿创建,如果有多个模块,即有多个build.gradle文件,多个project将会被创建。
配置阶段:在该阶段,build.gradle脚本将会执行,为每个project创建和配置所有的tasks,会为所有的Task根据其依赖关系而建立一个有向图。
执行阶段:这一阶段,gradle会决定哪一个tasks会被执行,哪一个tasks会被执行完全依赖开始构建时传入的参数和当前所在的文件夹位置有关。
一旦一个tasks被执行,那么它不会再次执行了,不包含依赖的Tasks总是优先执行
为什么要选择Gradle
假如你是一个开发者,项目自动构建是你每天工作的一部分,难道你就不想让你的构建代码和你写的源代码一样可以扩展、测试和维护?Gradle的构建脚本是声明式的、可读的,可以清晰的表达意图。使用Groovy代替XML来写代码大大减少了构建代码的大小。更重要的是,Gradle集成了其他构建工具,比如Ant和Maven,使得原来的项目很容易迁徙到Gradle。
Gradle for Android
看看实际的Android工程中gradle是如何使用
配置
基于grade构建的项目通常至少有一个build.gradle,看看Android Studio默认的配置:
Android工程中常用到的配置文件有:
- gradle-wrapper.properties文件
工程配置gradle,distributionUrl是指定你的gradle版本,你可以改变该url来改变你的gradle版本。
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
- setting.gradle文件
setting.gradle文件将会在初始化时期执行,并且定义了哪一个模块将会被构建。
Android中一个项目中可以构建多个Module,会在setting.gradle文件中会有如下代码:(每构建一个module就要在这里配置一下,Android Studio会自动帮我们配好了)
include ':app', ':mylibrary'
- 图中框起来的两个build.gradle文件
根目录下的build.gradle文件是定义在这个工程下的所有模块的公共属性:
//这个就是实际构建开始的地方
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
该文件主要包含了两个方面:在仓库地址中,我们使用了jcenter,jcenter可以理解成是一个中央远程仓库,一个仓库代表着你的依赖包的来源,兼容maven中心仓库。构建脚本也定义了一个Android构建工具,声明了android gradle plugin的版本。
app目录下的build.gradle:
//构建脚本也定义了一个Android构建工具,Android plugin提供了所有需要去构建和测试的应用。每个Android应用都需要这么一个插件:
apply plugin: 'com.android.application'
//当使用Android 插件的时候,Android标签将可以被使用
android {
//编译该app时候,你想使用到的api版本
compileSdkVersion 24
//构建工具的版本号
buildToolsVersion "25.0.2"
//defaultConfig方法包含了该app的核心属性,该属性会重写在AndroidManifest.xml中的对应属性。
defaultConfig {
//app包名
applicationId "com.lipy.gradledemo"
//sdk相关配置
minSdkVersion 22
targetSdkVersion 24
//版本相关配置
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//构建相关设置,用于构建不同版本的app
buildTypes {
release {
//是否开启混淆
minifyEnabled false
//混淆文件位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//依赖
dependencies {
//将libs文件夹中所有的jar文件视为依赖包
compile fileTree(dir: 'libs', include: ['*.jar'])
//声明依赖库
compile 'com.android.support:appcompat-v7:24.2.1'
}
以上配置是在android studio创建android项目的时候默认配置好的。
我们还可以自定义配置:
- 全局设置
多模块在一个工程下,可以这样定义:
allprojects {
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
}
}
如果model不是application的话,可以这样:
在跟gradle.build中添加
ext {
allprojectCompileSdkVersion=24
allprojectBuildToolsVersion="25.0.2"
}
然后在具体的model中引用:
android {
compileSdkVersion allprojectCompileSdkVersion
buildToolsVersion allprojectBuildToolsVersion
}
- 配置应用签名信息
android {
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')//签名证书文件
keyAlias 'debug.keystore'//别名
storePassword "123456789"//证书的密码
keyPassword "123456789"//key的密码
}
}
- 依赖
依赖配置的关键字:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
compile project(':mylibrary')
provided 'com.google.code.gson:gson:2.2.4'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
- compile //包含所有的依赖包,都会写入apk
- provided//提供编译支持,但是不会写入apk
- apk//apk中存在,但是不会加入编译中
- testCompile//添加额外的library支持针对测试
- androidTestCompile//添加额外的library支持针对测试
在Gradle中添加依赖,仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的jar包。依赖包会在你执行build构建的时候从这些远程仓库下载,然后会在本地保留缓存。
Gradle会默认定义三个maven仓库:Jcenter和mavenCentral以及本地maven仓库
repositories {
mavenCentral()
jcenter()
mavenLocal()
}
我们也可以使用Jcenter和mavenCentral之外的远程仓库:
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
如果有密码:
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
使用aar文件:
在构建library项目时,会在 build/output/aar/下生成aar文件。创建一个文件夹aars文件夹,把它拷贝到该文件夹里,然后依赖:
repositories {
flatDir {
dirs 'aars'
}
}
也可以单独依赖某个
dependencies {
compile(name:'libraryname', ext:'aar')
}
使用基本的构建命令
使用命令行,导航到你的项目,然后输入:
gradle tasks
这一命令将会列出所以可运行的tasks
在开发的时候,构建项目,你需要运行
gradle assembleRelease
通过debug配置,该任务将会创建一个debug版本的app,同时会将其保存在./app/build/outputs/apk目录下。
其他常用命令:
gradle clean //清除....../app目录下的build文件夹
gradle build //检查依赖并编译打包,会把debug、release环境的包都打出来
gradle assembleRelease //编译并打Release的包
gradle installRelease //Release模式打包并安装
gradle installDebug//Debug模式打包并安装
gradle uninstallRelease //卸载Release模式包
我们也可以不使用命令行,Android studio有其对应的工具: