没有合适的资源?快使用搜索试试~ 我知道了~
1简介这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同1.1 新的构建系统的目标新构建系统的目标是:使得代码和资源的重用更
资源详情
资源评论
资源推荐
1 简介
这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同
1.1 新的构建系统的目标
新构建系统的目标是:
使得代码和资源的重用更加简单
使得创建同一应用程序的不同版本更加容易,不管是多个apk版本还是同一版本的多种定制
使得配置,扩展和自定义构建更加容易
良好的IDE集成
1.2 为什么使用Gradle
Gradle是一个高级构建系统和构建工具,允许通过插件自定义构建逻辑
以下一些功能使得我们选择Gradle:
使用特定领域语言(DSL)来描述和控制构建逻辑
构建脚本基于Groovy语言,允许通过DSL混合元素声明和通过代码控制DSL元素,来产生自定义的
构建逻辑
支持Maven和(或者)Ivy管理依赖
非常灵活。允许使用最佳实践,但也不强制自己的实现方式
插件能够提供自己的DSL和API供构建脚本使用
提供优秀的工具API以供IDE集成
2 环境要求
Gradle 1.10或者1.11或者1.12,以及插件版本0.11.1
SDK以及Buid Tools 19.0.0,某些功能可能需要更新的版本
3 基本项目
Gradle项目通过项目根目录下的 build.gradle 文件来描述构建过程
3.1 简单的构建文件
最简单的Java项目构建文件 build.gradle
这个脚本应用了Gradle的Java插件。这个插件了提供构建和测试Java应用的所有功能
最简单的Android项目的构建文件包含以下内容:
Note(译注): 最新的android插件声明
apply plugin: 'com.android.application'
apply plugin: 'java'
buildscript { repositories { mavenCentral() } dependencies {
classpath 'com.android.tools.build:gradle:0.11.1' }} apply plugin:
'android' android { compileSdkVersion 19 buildToolsVersion "19.0.0"}
在这个Android构建脚本里包含了三个主要内容:
buildscript { ... } 配置了驱动构建过程的代码。在这个案例中,声明了使用Maven仓库,以及一
个Maven文件(artifact)的依赖路径。这个文件就是包含了Android Gradle插件的库,版本为0.11.1
然后, android 插件被应用,像之前的Java插件一样
最后, android { ... } 配置了anroid构建过程需要的参数。这也是Adnroid DSL的入口。默认的情
况下,只有编译目标SDK版本,和构建工具版本是必须的。在脚本中,对应的是 compileSdkVersion
和 buildtoolsVersion 属性。 compileSdkVersion 和旧编译系统中 project.properties 文件中的
target 属性对应。这个新属性 compileSdkVersion 可以是一个int值(API Level)或者一个和之前的
target 属性值一样的字符串
重点: 你应该只应用android插件,同时应用java插件会导致构建错误
注意: 你同样需要一个 local.properties 文件来指明SDK的路径,和 build.gradle 在同一路径下,在
文件中使用 sdk.dir 属性指明。或者,你可以设置 ANDROID_HOME 环境变量。两者是一致的,你可以选
择一种你喜欢的方式。
3.2 项目结构
前面的android构建脚本使用了默认的文件夹目录结构。Gradle遵循 约定优于配置 的原则,在可能的情
况下提供了合理的默认配置参数。
基本的项目包含两个“source sets”组件。 main source code 和 test code ,位于以下的目录中:
在这些目录中,都存在目录对应源码组件
不管是Java还是Android插件,源码目录和资源目录都如下 :
对于Android插件,还有特有的文件和目录
Note: src/androidTest/AndroidManifest.xml 不是必须的,会自动被创建。
3.2.1 配置项目结构
当默认项目结构不合适的时候,可以配置项目目录。根据Gradle文档,可以通过下面的脚本重新配置
Java项目的sourceSets:
Note: srcDir 会添加指定的目录到源文件目录列表中(这在Gradele文档中没有提及,但是实际上是这样
的)。
为了替换默认的源文件目录列表,可以使用 srcDirs 来指定目录数组。这也是一种不同的使用方式:
src/main/ src/androidTest/
java/ resources/
AndroidManifest.xml res/ assets/ aidl/ rs/ jni/
sourceSets { main { java { srcDir 'src/java' }
resources { srcDir 'src/resources' } }}
sourceSets { main.java.srcDirs = ['src/java'] main.resources.srcDirs =
['src/resources']}
更多的信息,参考Gradle文档中的Java插件内容
Android插件使用相似的语法,但是由于使用是自己的 sourceSets ,相应的目录在( build.gradle 文
件中的)android对象中指定
下面是一个示例,它使用旧项目的源码结构,并且将androidTest sourceSet映射到tests目录
Note: 由于旧的结构将所有的源文件 (java, aidl, renderscript, and java资源文件)放在一个目录里,我们
需要映射这些sourceSet组件到src目录。
Note: setRoot() 方法将整个sourceSet(包含子目录)指向新的目录。比如上面,将 src/androidTest/*
指向了 tests/*
以上是Android特有的,如果配置在Java sourceSets中就没有作用
‘migrated’ 示例(位于本页面底部)中展示了这部分内容
3.3 构建任务
3.3.1 通用任务
在build文件中应用一个插件将自动创建一系列构建任务。Java插件和Android插件都是这样。任务约定
如下:
assemble
组合项目输出
check
执行所有检查
build
执行assemble和check两个task的所有工作
clean
清理项目输出
任务 assemble , check 和 build 不会做任何实际的事情。他们只是锚点任务(anchor tasks),插件依
赖他们来添加实际执行实际操作的任务。
这样就不需要考虑项目是什么类型,使用的是什么插件,都可以执行同样的任务。
例如,使用findbugs插件,会创建新的任务,并让 check 依赖这个任务,使得 check 被调用时这个任务
就会被调用。
在终端(命令行,gradle项目目录下)中运行下面的任务可以查询到高级别的任务:
gradle tasks 运行以下命令可以看到全部任务和任务依赖关系:
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') }}
gradle tasks --all
Note: Gradle自动监视一个任务声明的输入输出文件。再次执行构建任务时,如果文件没有改变,
Gradle会指明所有任务为 UP-TO-DATE ,意味着任务不需要执行。这样的话,任务可以正确地互相依赖,
而不不会导致非必须的构建操作
3.3.2 Java项目的任务
Java插件主要创建两个任务,下面是这两个锚点任务的依赖关系
assemble
jar
这个任务创建输出
check
test
这个任务运行测试
jar 任务直接或间接地依赖其他任务:例如 classes 任务将编译Java源码
testClasses 任务用于编译测试的,但是这个任务很少被调用,因为 test 任务依赖于它(就像依赖
classes 任务一样)
通常来说,你只需要调用 assemble 或者 check 任务,而不需要调用其他任务。
你可以在Gradle Java插件文档看到Java插件的全部任务和它们的描述
3.3.3 Android任务
Android插件使用同样的约定来保持和其他插件的兼容,并且添加了额外的锚点任务:
assemble
这个任务组织项目的输出
check
这个项目运行所有检查
connectedCheck
运行检查需要一个已连接的设备或者模拟器。并在所有已连接的设备上异步运行。
deviceCheck
通过APIs连接远程设备并运行检查。这通常在CI服务器上运行。
build
运行 assemble 和 check
clean
清理项目输出
新的锚点任务是必须的,以保证在不需要设备连接的情况下能运行常规检查。
需要注意的是, build 任务并不依赖 deviceCheck 或者 connectedCheck
一个Android项目至少有两个输出:debug APK 和 release APK。它们每一个都有自己的锚点任务来帮
助它们完成独立的构建:
assemble
assembleDebug
assembleRelease
它们都依赖其它任务来完成构建一个apk所需要的多个步骤。 assemble 任务依赖这两个任务,所以调
用 assemble 会生成两个APK。
Tip: Gradle支持在命令行中使用camel形式的任务名缩写。
例如:
gradle aR 和 gradle assembleRelease 是一样的,因为没有别的任务名有同样的缩写
锚点任务 check 也有自己的依赖:
check
lint
connectedCheck
connectedAndroidTest
connectedUiAutomatorTest (not implemented yet)
deviceCheck
依赖于当其它插件实现测试扩展点时所创建的任务。
最终,插件会为所有构建类型(debug, release, test)创建 install / uninstall 任务,如果输出文件可
以安装的话(必须签名)。
3.4 基本的构建过程定制
Android插件提供了大量DSL来直接从构建系统中定制大多数事情。
3.4.1 Manifest属性
通过DSL,可以配置以下manifest属性:
minSdkVersion
targetSdkVersion
versionCode
versionName
applicationId (实际的packageName – 前往 ApplicationId versus PackageName 查看更多)
Package Name for the test application
Instrumentation test runner
例如:
配置项位于 android 元素中的 defaultConfig 元素中。
之前版本的Android Plugin使用packageName来配置manifest文件的 packageName 属性。从0.11.1版
本开始,你应该在build.gradle文件使用applicationId来配置manifest文件的 packageName 属性。
这是为了消除Android应用的 packageName (作为Android应用的ID)和java包名之间的疑义。
在构建文件中定义的强大之处在于它可以是动态的。
例如,可以从一个文件中读取版本名称,或者使用自定义的逻辑:
Note: 函数名不要与指定范围内已经存在的getter方法名冲突。例如,在 defaultConfig { ...} 中调
用getVersionName()会自动使用defaultConfig.getVersionName(),而不是你自定义的其它
getVersionName()。
如果属性没有通过DSL设置,那么默认的属性值会被使用。下面是默认的属性值列表:
android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig
{ versionCode 12 versionName "2.0" minSdkVersion 16
targetSdkVersion 16 }}
def computeVersionName() { ...} android { compileSdkVersion 19
buildToolsVersion "19.0.0" defaultConfig { versionCode 12
versionName computeVersionName() minSdkVersion 16 targetSdkVersion
16 }}
剩余22页未读,继续阅读
豆瓣时间
- 粉丝: 22
- 资源: 329
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0