使用Gradle构建Android项目
新项目中,使用了Google I/O 2013发布的新工具,使用Gradle构建Android项目,并且在新版的Intellig IDEA以及google的Android Studio对其支持。本文就介绍一下怎么使用gradle构建android项目,进行多个版本编译。
Gradle是什么?
Gradle是以Groovy为基础,面向java应用,基于DSL语法的自动化构建工具。是google引入,替换ant和maven的新工具,其依赖兼容maven和ivy。
使用gradle的目的:
更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;
环境需求
Gradle1.10或者更高版本,grale插件0.9或者更高版本.
android SDK需要有Build Tools 19.0.0以及更高版本
Gradle基本结构
使用ide创建的gradle构建的项目,会自动创建一个build.gradle,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.9.0' } } apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.0" } |
可以看到,构建文件主要有三个区域:
buildscript{…}
Configures the build script classpath for this project. 设置脚本的运行环境
apply plugin: ‘android’
设置使用android插件构建项目
android{…}
设置编译android项目的参数
任务task的执行
通常会有以下任务:
assemble The task to assemble the output(s) of the project(输出一个项目文件,android就是打包apk)
check The task to run all the checks.(运行检查,检查程序的错误,语法,等等)
build This task does both assemble and check (执行assemble和check)
clean This task cleans the output of the project(清理项目输出文件)
上面的任务assemble,check,build实际上什么都不做,他们其实都是其他任务的集合。
执行一个任务的方式为gradle 任务名
, 如gradle assemble
在android项目中还有connectedCheck(检查连接的设备或模拟器),deviceCheck(检查设备使用的api版本)
通常我们的项目会有至少生成两个版本,debug和release,我们可以用两个任务assembleDebug和assembleRelease去分别生成两个版本,也可以使用assemble一下子生成两个版本。
gradle支持任务名缩写,在我们执行gradle assembleRelease的时候,可以用gradle aR代替。
基本的构建定制
我们可以在build.gradle文件中配置我们的程序版本等信息,从而可以生成多个版本的程序。
支持的配置有:
minSdkVersion 最小支持sdk版本
targetSdkVersion 编译时的目标sdk版本
versionCode 程序版本号
versionName 程序版本名称
packageName 程序包名
Package Name for the test application 测试用的程序包名
Instrumentation test runner 测试用的instrumentation实例
例如:
1 2 3 4 5 6 7 8 9 10 11 | android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { versionCode 12 versionName "2.0" minSdkVersion 16 targetSdkVersion 16 } } |
目录配置
默认情况下项目目录是这样的 有两个组件source sets,一个main,一个test,对应下面两个文件夹。src/main/ src/androidTest/
然后对于每个组件目录都有两个目录,分别存储java代码和资源文件java/ resources/
对于android项目中呢,对应的目录和文件是AndroidManifest.xml //该文件src/androidTest/目录下不需要,程序执行时会自动构建res/ assets/ aidl/ rs/ jni/
如果需要上面这些文件,但是不是在上面所说的目录,则需要设置。
1 2 3 4 5 6 7 8 9 10 | sourceSets { main { java { srcDir 'src/java' } resources { srcDir 'src/resources' } } } |
可以给main或者test设置根目录,如
1 2 3 | sourceSets { androidTest.setRoot('tests') } |
可以指定每种文件的存储路径
1 2 3 4 5 6 7 8 9 10 11 | sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } |
特别是我们的ndk生成的.so文件,通常我们不是放到jni目录中的,我们需要设置一下
1 2 3 4 5 | sourceSets { main { jniLibs.srcDirs = ['libs'] } } |
签名配置
可以给不同类型进行不同的配置,先看示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | android { signingConfigs { debug { storeFile file("debug.keystore") } myConfig { storeFile file("other.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { foo { debuggable true jniDebugBuild true signingConfig signingConfigs.myConfig } } } |
上面的配置文件配置两个类型,一个时debug类型,一个时自己的自定义类型。两个分别使用了不同的签名,同时对于生成密钥,要填写设置的密码。