Android中使用Gradle来构建App项目的入门指南
gradle是android开发中引入的全新的构建系统,因为全新的构建系统主要是出于下面的目的:
1. 方便复用代码和资源
2. 构建多种版本的apk更见简单,不论是为多渠道构建不同的apk还是构建不同环境的apk(debug,release)
3. 方便配置,扩展,自定义构建过程
4. 良好的ide集成
为什么选择gradle?
gradle主要有以下几个有点:
1. 使用领域驱动语言(dsl)来描述构建逻辑
2. 构建脚本使用groovy,可以方便的定制构建逻辑
3. 内建的依赖管理系统,使用maven或者ivy
4. 非常灵活。可以使用最佳实践但并不强制
5. 良好的ide支持
gradle项目使用项目根目录下的build.gradle文件来配置
一个最简单的java项目的build.gradle如下
apply plugin: 'java'
这表示改项目会使用gradle的java插件,该插件是gradle默认提供的,java插件提供了构建java应用和运行测试的功能。
最简单的android项目build.gralde
buildscript { repositories { mavencentral() } dependencies { classpath 'com.android.tools.build:gradle:0.11.1' } } apply plugin: 'android' android { compilesdkversion 19 buildtoolsversion "19.0.0" }
该android构建文件包含3个部分:
1.buildscript { ... } 配置驱动构建过程的代码,意思就是buildscript中的配置仅仅在构建过程中起作用,也就是构建程序所使用的配置。
上面的代码中就声明了我们的构建程序会使用maven*仓库,并且有一个classpath依赖是指向一个maven库的。这个maven库就是android gradle插件,版本号是0.11.1。
2.随后就是使用这个android插件,和之前使用java插件一样。
3.最后,android { ... }配置了android项目构建时需要的所有参数。
默认情况下,只需要指定compilesdkversion和buildtoolsversion,compilesdkversion指定使用哪个版本的sdk编译,buildtoolsversion指定使用哪个版本的构建工具。
注意点:
1. 只需要使用android插件,再使用java插件会报错.
2. 在local.properties中使用sdk.dir属性指定sdk路径,或者你可以使用android_home环境变量。
项目结构
gradle采用约定优于配置的原则,最简单方式是使用一个默认的目录结构。当然目录结构是可以自己修改的。
默认情况下,android gradle项目的代码都在src目录下,src下会有两个目录main和androidtest,其中main目录下是项目代码,androidtest目录下是测试代码。
src/main/ src/androidtest/
在main和androidtest目录下面,针对不同类型的code,又不会不同的目录。
对于java和android的gradle插件,java代码和java资源分别对应了java目录和resources目录。android插件还需要一些其他的目录和文件,比如
androidmanifest.xml res/ assets/ aidl/ rs/ jni/
下面我们来看一下如何更改这些默认的配置。
android工程,默认情况下,java文件和resource文件分别在src/main/java和src/main/res目录下,在build.gradle文件,andorid{}里面添加下面的代码,便可以将java文件和resource文件放到src/java和src/resources目录下。(注意,如果你在gradle文件中修改了,只需要重新sync一下,gradle会自动创建新的目录,并将对应的文件移动到新的目录下)
sourcesets { main { java { srcdir 'src/java' } resources { srcdir 'src/resources' } } }
更简便的写法是
sourcesets { main.java.srcdirs = ['src/java'] main.resources.srcdirs = ['src/resources'] }
数组里其实是可以指定多个目录,这样就可以将代码和资源放置到多个目录下。
在看一个android项目的例子:
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') } }
这里的main code其实使用的就是android gradle的默认值,而androidtest不再使用默认的androidtest目录,而是使用tests目录。