Gradle⽤户使⽤指南
0. 前⾔
完全由个⼈翻译,能⼒有限,有些细节地⽅翻译不是很通顺,⼤家可以参考英⽂版本阅读,如果有问题,欢迎指正。转载请事先沟通,未经允许,谢绝转载。
1. 新⼯具介绍(Introduction)
能够复⽤代码和资源
能够构建⼏种不同版本参数的应⽤
能够配置、扩展、⾃定义构建过程
1.1 为什么选择Gradle(Why Gradle?)
Gradle是⼀款具有优势的构建⼯具,通过插件可以⾃定义构建过程。主要优势如下:
基于Groovy的领域特定语⾔(DSL),⽤于描述和操作构建过程
⽀持maven/lvy的依赖管理
⾮常灵活,并不强迫⽤户⼀定要使⽤最佳的构建⽅式
插件可以暴露⾃⾝的语⾔和接⼝api给构建⽂件使⽤
⽀持IDE集成
2.2 需求(Requirements)
Gradle 2.2(Gradle版本是2.2及以上,因为⽂档中有些新特性)
SDK with Build Tools 19.0.0.
2. ⼯程基本配置(Basic Project Setup)
Gradle⼯程默认的配置⽂件名称是adle,在主⼯程的根⽬录下。
2.1 配置⽂件⽰例(Simple build files)
下⾯是⼀个Android⼯程的最简单配置⽂件的内容。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'ls.build:gradle:1.3.1'
}
}
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.1.0"
}
配置内容主要分为三部分。
buildscript{},这个部分主要配置在构建过程中的依赖。上⾯⽰例中,声明使⽤jcenter依赖库,声明了⼀个maven库的依
赖ls.build:gradle:1.3.1,是指引⼊gradle集成⼯具,版本是1.3.1。(关于Android Gradle Plugin版本和Gradle版本关系,)
apply plugin,引⽤插件,com.android.application这个插件⽤于构建Android⼯程
android {},这部分是配置构建Android⼯程的参数。compileSdkVersion和buildToolsVersion是必须的
注意:主⼯程中只能引⽤com.android.application插件,如果引⽤java插件会报错,,第⼀个插件说明这是个Android⼯程,第⼆个插件说明这是个Java⼯程,所以只能引⽤⼀个。
注意:⽤户可以在local.properties⽂件中使⽤sdk.dir属性配置本地的Android sdk位置,或者设置⼀个名为Android_HOME的环境变量,这两种⽅法没有什么区别。
⽰例local.properties:
sdk.dir=/path/to/Android/Sdk
2.2 ⼯程结构(Project Structure)
Android⼯程⽂件有默认的⽬录结构。Gradle遵循约定由于配置规则,提供合理的默认值。⼯程以两个⽬录为主,⼀个是⼯程代码⽬录,⼀个是测试代码⽬录。
src/main/
src/androidTest/
在每个⽬录中都有⼀些⼦⽬录,Java⼯程和Android⼯程共有的⼦⽬录如下:
java/
resources/
Android⼯程中有⼀些独有的⽬录:
res
assets
aidl
rs
jni
jniLibs
所有的java⽂件都在src/main/java⽬录下,主要的配置⽂件⽬录是src/l。
src/l是⾃动创建的,不需要⼿动创建
2.2.1 配置⽬录结构(Configuring the Structure)
默认的⽬录结构并不能完全适配所有情况,⽤户可以配置⽬录结构。查看Java⼯程师怎么配置⽬录结构的。
在Android⼯程中使⽤同样的格式,但是因为Android⼯程中有独有的⼀些⽬录,所以配置信息需要写在android {}这部分。下⾯⽰例中,⼯程代码使⽤原来的⽬录,修改测试代码的⽬录。
android {
sourceSets {
main {
manifest.srcFile 'l'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest.setRoot('tests')
}
}
注意:因为旧的⽬录中包含所有的⽂件(java、AIDL、res等等),所以需要重设所有的⽬录
注意:setRoot()重设⽬录位置,沿⽤之前的⽬录结构,这个是Android⼯程特有的
2.3 构建任务(Build Tasks)
2.3.1 通⽤任务(General Tasks)
使⽤插件(包含Java和Android插件)去构建⼯程会⾃动创建很多任务,通⽤的任务如下:
assemble,打包⼯程所产出的⽂件
check,运营⼯程中所有的check任务
build, 执⾏assemble任务和check任务
clean,清除⼯程的产出的⽂件
assemble、check、build这三个任务实际上并不做任何事,他们只是⼀个壳任务,实告诉Gradle去执⾏那些的任务。
不管什么⼯程,依赖了什么插件,都可以反复去调⽤同⼀个任务。例如引⽤⼀个findBugs插件,会创建⼀个新的任务,让check任务依赖这个新任务,这样每次调⽤check任务时候,新建的任务也会执⾏。
使⽤gradle tasks指令获取⼯程中所有的可执⾏任务
使⽤gradle tasks --all执⾏获取⼯程中所有可执⾏任务简介以及依赖关系
如果⼯程中未做任何修改,执⾏build任务,每个任务描述后⾯都会加上UP-TO-DATE,这意味着这个任务不需要真正地执⾏,因为⼯程没有改动。这样每个任务都可以依赖其他任务,⽽且不需要其他任务做构建⼯作。
2.3.2 Java⼯程任务(Java project tasks)
引⽤Java插件时候,说明这个⼯程是个纯Java⼯程,会额外添加两个壳任务jar和tests。
assemble
jar 打包⼯程产出⽂件
check
tests 执⾏所有测试
jar任务会直接或者间接的依赖任务classes,这个任务会编译java源代码;tests任务会依赖任务testClasses,但是很少会直接调⽤这个任务,因为tests任务依赖它,直接调⽤tests任务即可。
⼤体上,⽤户可能只会调⽤assemble和check任务,很少调⽤其他任务。可以查看Java⼯程所有的任务和任务描述。
2.3.3 Android⼯程任务(Android tasks)
引⽤com.android.application插件,说明这个⼯程是Android⼯程,在通⽤任务基础上会额外添加两个壳任务。
connectedCheck,查看是否有设备连接
deviceCheck, 查看是否连接上设备
注意,build任务是不依赖connectedCheck和deviceCheck任务的。
⼀个Android⼯程⾄少有两个构建包,debug apk和release apk。每⼀个构建包都有⾃⼰的壳任务。
assemble
assembleDebug
assembleRelease
这两个任务会依赖其他⼀些任务,要构建出⼀个安装包,需要执⾏好多步骤。assemble任务依赖这两个任务,所以执⾏assemble任务时候,会产出debug和release两个apk。
注意:Gradle⽀持指令简写模式,例如gradle aR和gradle assembleRelease意义是相同的,只需要保证没有其他任务能简写成aR。
Android⼯程中check类任务有各⾃的依赖。
check
lint
connectedCheck
connectedAndroidTest
deviceCheck
它依赖于那些扩展了tests通⽤任务的任务
最后,Android⼯程中,也会有对程序安装和卸载的任务。
installDebug
installRelease
uninstallAll
uninstallDebug
android获取真正的签名uninstallRelease
uninstallDebugAndroidTest
2.4 ⾃定义基本构建(Basic Build Customization)
Android的插件提供了领域特定语⾔(DSL)来帮助⽤户直接地⾃定义构建过程。
2.4.1 清单内容(Manifest entries)
通过DSL⽤户可以设置⼀些构建参数,可设置内容如下:
minSdkVersion
targetSdkVersion
versionCode
versionName
applicationId (最终有效的包名,查看细节)
testApplicationId (⽤于测试app)
testInstrumentationRunner
⽰例如下:
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
versionCode 12
versionName "2.0"
minSdkVersion 16
targetSdkVersion 23
}
}
查看可以配置的清单参数信息。
可以在.gradle⽂件中动态配置这些清单信息,例如,动态配置versionName参数,⽰例如下:
def computeVersionName() {
...
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
versionCode 12
versionName computeVersionName()
minSdkVersion 16
targetSdkVersion 23
}
}
注意:⾃定义时尽量不要使⽤gettter的⽅法名,防⽌冲突,例如,VersionName()会替换掉⾃定义的getVersionName()⽅法,也就是说每⼀个参数都有默认的getter⽅法
2.4.2 构建类型(Build Types)
Android⼯程中默认的会有debug和release两种构建⽅式,主要区别在于调试程序的能⼒以及apk签名细节。debug的版本为了防⽌在构建过程中弹出提⽰,系统会根据明⽂的⽤户名/密码⾃动创建⼀个数字证书⽤于签名,使⽤debug证书签名的apk是⽆法上架销售的。release版本在构建过程中不进⾏签名,将签名放在之后的环节。
在buildTypes中配置构建类型信息,默认会创建两种构建⽅式,debug和release,在Android⼯程中允许⾃定义这两种构建⽅式的具体细节信息。⽰例如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论