Gradle
gradle简介
gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。
- 采用了Domain Specific Language(DSL语言)来描述和控制构建逻辑。
- 构建文件基于Groovy,并且允许通过混合声明DSL元素和使用代码来控制DSL元素以控制自定义的构建逻辑。
- 支持Maven或者Ivy的依赖管理。
- 插件可以提供自己的DSL和API以供构建文件使用。
- 良好的API工具供IDE集成。
基本的构建文件
build.gradle
buildscript {
repositories {
jCenter() //gradle脚本相关的仓库
}
dependencies {
//构建Android项目需要的插件
//声明android gradle plugin的版本,不是gradle的版本
classpath 'com.android.tools.build:gradle:0.11.1'
}
}
//声明使用插件,会自动生成tasks
apply plugin: 'com.android.application'
//DSL
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
}
//这里是整个项目的仓库源,在这里声明就不需要每个模块都单独声明
allprojects {
repositories {
jcenter()
}
}
项目结构
基本的项目开始于两个名为“sourceSets”的组件,分别位于:
- src/main
- src/androidTest
gradle的默认Android项目结构如下:
- java/
- res/
- assets/
- aidl/
- rs/
- jni/
- AndroidManifest.xml
如果项目的结构和默认结构不同如(Eclipse的Android项目的目录结构就和默认的不同),那么就需要在build文件的Android域中指明对应的文件路径,以Eclipse目录结构为例:
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest.setRoot('tests')
}
}
主要项目文件
settings.gradle
这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的modue
include ':facebook'
include ':google-play-services_lib'
include ':recyclerview_li_v7'
include ':WeChatMusic'
local.properties
本地属性,不应该加入到版本控制中。在Android studio中就会生成以下内容,指定本地Android
SDK的路径。
sdk.dir=E:\\android-sdk-windows
gradle.properties
从名字上就知道它是一个配置文件,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias,代理等。
Android plugin
tasks
gradle添加插件会自动创建一系列的构建任务build tasks去执行。Android plugin会创建以下任务:
- assemble 这个task用于组合项目中的所有输出。
- check 这个task用于执行所有检查。
- connectedCheck 这个task将会在一个指定的设备或者模拟器上执行检查,它们可以同时在所有连接的设备上执行。
- deviceCheck 通过APIs连接远程设备来执行检查,这是在CL服务器上使用的。
- build 这个task执行assemble和check的所有工作。
- clean 这个task清空项目的所有输出。
APK属性
同时Android plugin提供了大量的DSL来定制大部分的属性:和AndroidManifest.xml的区别?
- minSdkVersion
- targetSdkVersion
- versionName
- applicationId (有效的包名 – 更多详情请查阅ApplicationId 对比 PackageName)
- package Name for the test application
- Instrumentation test runner
以前在AndroidManifest.xml中定义的packageName既决定了APK在手机上的唯一标识,又会生成对应的包名的R文件,如:com.example.app.R。这样如果我们需要为我们的APP构建不同版本(免费版,付费版),让它们可以同时在手机上安装,就必须修改包名,而修改包名就必须修改代码。所以gradle将packageName的两个作用解耦,唯一标识现在有applicationId决定。
例如:
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
versionCode 12
versionName "2.0"
minSdkVersion 16
targetSdkVersion 16
}
}
//在android元素中的defaultConfig元素中定义所有配置。
buildType
默认情况下,debug 和 release 实例都会被创建。Android plugin 允许像创建其他 Build Type 一样定制这两个实例。可以在 buildTypes 的 DSL 容器中完成:
android {
buildTypes {
debug {
//设置包名为 <app appliationId>.debug,以便能够在同一个设上安装 debug 和 release 版的 apk
applicationIdSuffix ".debug"
}
jnidebug {
//创建了名为 jnidebug 的新 BuildType,并且用 debug build type 的默认配置来初始化自身
initWith(buildTypes.debug)
packageNameSuffix ".jnidebug"
jnidebugBuild true
}
}
}
另外,每个 Build Type 都会创建一个新的 assemble 任务。
签名
proguard
依赖
有以下3种不同的依赖:
- 本地包
dependencies {
compile files('libs/foo.jar')
} - 远程包
compile ‘url:包名:版本’
dependencies {
compile 'com.google.guava:guava:11.0.2'
} - 本地lib
compile project(':google-play-services_lib')
compile project(':WeChatMusicEngine') //本地项目
}
多模块
在每个模块下生成一个build.gradle定义构建逻辑,然后在settings.gradle声明相关模块
其他
- ### gradle wrapper
wrapper是不同系统的脚本文件(window:gradlew.bat,linux shell gradlew),这样其他人在没有安装gradle的情况下也可以构建我们的项目。gradlew会检测系统是否安装了gradle如果安装了,就通过gradle构建项目,否则会先到下载并安装gradle。要生成这些脚本文件,只需要运行wrapper task就可以了。运行后会有以下的文件生成:
gradlew
/
gradlew.bat
gradle/wrapper/
gradle-wrapper.jar
gradle-wrapper.properties
如果要修改wrapper的属性,还可以如下配置wrapper的属性:
task wrapper(type: Wrapper) {
gradleVersion = '2.0'
}
或者直接修改gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http://services.gradle.org/distributions/gradle-2.4-all.zip
wrapper先会到GRADLE_USER_HOME/wrapper/dists检测gradle是否安装了,如果没有就检测GRADLE_USER_HOME/wrapper/dists是否有zip文件,如果没有才到最后的url下载对应的版本。
Android studio会自动生成对应的文件,如果选择了使用wrapper的话。
- ### .iml文件和.idea文件夹
这些是和IDE相关的文件,不应该加入到版本控制中,Anddroid Studio 会自动生成这些文件。