随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse。但是新的IDE与以往的Eclipse有很大区别,这导致部分开发者望而却步,其中一个大家觉得比较麻烦的是Android Studio采用的新的构建系统,gradle。那么这篇文章我将对gradle进行一个简单介绍(主要讲gradle配合Android Studio的使用),希望帮助大家熟悉gradle。
gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www.gradle.org/
更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;
1.基本配置:
首先明确gradle跟maven一样,也有一个配置文件,maven里面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android项目通常至少包含两个build.gradle文件,一个是project范围的,另一个是module范围的,由于一个project可以有多个module,所以每个module下都会对应一个build.gradle。这么说有点抽象,看下面这个图:
这是一个android工程的project视图,上面那个是module下的build.gradle文件。下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。下面看下这两个build.gradle里面的内容:
project#build.gradle:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { //构建过程依赖的仓库 repositories { jcenter() } //构建过程需要依赖的库 dependencies { //下面声明的是gradle插件的版本 classpath ‘com.android.tools.build:gradle:1.1.0‘ // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } //这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了 allprojects { repositories { jcenter() } } |
注:大家可能很奇怪,为什么仓库repositories需要声明两次,这其实是由于它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。
module#build.gradle:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//声明插件,这是一个android程序,如果是android库,应该是com.android.library apply plugin: ‘com.android.application‘ android { //安卓构建过程需要配置的参数 compileSdkVersion 21//编译版本 buildToolsVersion "21.1.2"//buildtool版本 defaultConfig {//默认配置,会同时应用到debug和release版本上 applicationId "com.taobao.startupanim"//包名 minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { //这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等 release { //release版本 minifyEnabled false//是否开启混淆 proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘//混淆文件位置 } } } dependencies { //模块依赖 compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])//依赖libs目录下所有jar包 compile ‘com.android.support:appcompat-v7:21.0.3‘//依赖appcompat库 } |
defaultConfig中是一些基本配置,它会同时应用到debug/release版本上,下面列举了所有可配项及对应的值:
buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。
buildTypes里还有很多可配置项,下面列举了所有可配项以及debug/release版本的默认值:
1
|
include ‘:module-a‘,‘:module-b‘ |
1
2
3
4
5
6
7
8
9
|
maven{ url "..." } ivy{ url "..." } flatDir{ dirs ‘xxx‘ } |
有一些仓库提供了别名,可直接使用:
1
2
3
4
5
|
repositories{ mavenCentral() jcenter() mavenLocal() } |
1
2
3
4
|
assemble 构建项目输出 check 运行检测和测试任务 build 运行assemble和check clean 清理输出任务 |
执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行
1
|
gradlew assemble |
它通常会执行:
1
2
|
gradlew assembleDebug gradlew assembleRelease |
1
2
|
chmod +x gradlew ./gradlew assemble |
可以通过:
1
|
gradlew tasks |
列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。
四.常见问题
1
|
compile files(‘libs/xxx.jar‘) |
如果libs下有多个jar文件,可以这样声明:
1
|
compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]) |
2.导入maven库:
1
|
compile ‘com.android.support:appcompat-v7:21.0.3‘ |
可见,格式为
1
|
compile ‘groupId:artifactId:version‘ |
1
|
compile project(‘:module-A‘) |
并且你需要在settings.gradle中把module-A模块包含进来:
1
|
include ‘:module-A‘,‘:app‘ |
此外,这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:
1
|
apply plugin: ‘com.android.library‘ |
而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的,这点需要注意。
1
2
3
4
5
|
5.依赖三方aar文件:
1
|
compile ‘com.aaa.xxx:core:1.0.1@aar‘ |
6.将库项目导出为aar:
首先你的项目必须是一个库项目,build.gradle中进行配置:
1
|
apply plugin : ‘com.android.library‘ |
然后你可以在命令行中进到项目目录,执行如下gradle任务:
1
|
gradlew assembleRelease//确保该目录下有gradlew文件 |
生成的aar在/build/output/aar文件夹中
7.引用本地aar:
首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:
1
2
3
4
5
|
repositories{ flatDir{ dirs ‘libs‘ } } |
最后在dependencies结点下依赖该aar模块:
1
2
3
|
dependencies{ compile (name:‘xxx‘,ext:‘aar‘) } |
1
2
3
|
compile (group:‘xxx‘,name:‘xxx‘,version:‘xxx‘){ exclude group:‘xxx‘,module:‘xxx‘//module对应的就是artifactId } |
9.多dex支持(打包65k方法数限制)
1
|
multiDexEnabled true |
接着,在dependencies结点下增加如下依赖:
1
2
3
|
dependencies{ compile ‘com.android.support:multidex:1.0.0‘ } |
最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。
详细内容参见官方文档。
10.自动移除不用资源
可以在buildTypes结点中增加如下配置:
1
2
3
4
5
6
|
buildTypes{ release{ minifyEnabled true shrinkResources true } } |
11.忽略lint错误:
可以在build.gradle文件中的android结点下增加如下配置:
1
2
3
4
5
|
android{ lintOptions{ abortOnError false } } |
12.声明编译的java版本
可以在build.gradle文件中的android结点下增加如下配置:
1
2
3
4
|
compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } |
13.应用签名配置
首先在module的build.gradle中增加这些字段:
1
2
3
4
|
storeFiles:keystore文件存储位置,通常是.jks文件 storePassword 密码 keyAlias keystore别名 keyPassword 密码 |
具体配置方式为:
首先在build.gradle的android结点下增加如下配置:
1
2
3
4
5
6
7
8
9
10
11
|
signingConfigs { //debug版本的签名配置,通常不用配,因为有默认的debug签名 debug { } release { storeFile file("key.jks") storePassword "123456" keyAlias "mykey" keyPassword "123456" } } |
注:debug的默认签名为:
1
|
signingConfig android.signingCongfigs.debug |
位置为
1
|
${home}\.android\debug.keystore |
然后在buildTypes结点下的对应版本中添加上面的配置:
1
2
3
4
5
|
buildTypes{ release{ signingConfig signingConfigs.release } } |
当然,release不是固定的名称,你可以随便取,比如这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
android { signingConfigs { debug { storeFile file("debug.keystore") } myConfig { storeFile file("other.keystore") storePassword "android" keyAlias "androiddebugkey" keyPassword "android" } } buildTypes { foo { debuggable true jniDebuggable true signingConfig signingConfigs.myConfig } } } |
真实开发中,把密码配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:
1
2
3
4
|
RELEASE_STOREFILE=xxx.jks RELEASE_STORE_PASSWORD=123456 RELEASE_KEY_ALIAS=mykey RELEASE_KEY_PASSWORD=123456 |
然后直接引用即可:
1
2
3
4
|
storeFile file(RELEASE_STOREFILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD |
14.定制buildConfig:
在build.gradle中配置:
1
2
3
4
5
6
7
8
|
buildTypes{ release{ buildConfigField "string","type","\"release\"" } debug{ buildConfigField "string","type","\"debug\"" } } |
这样就会在BuildConfig类中生成type字段:
1
2
3
4
|
//build/generate/source/buildConfig/release/包名/ 路径下的BuildConfig.java public static final String type = "release" //build/generate/source/buildConfig/debug/包名/ 路径下的BuildConfig.java public static final String type = "debug" |
转载请注明:Android开发中文站 » gradle入门
原文:http://www.cnblogs.com/lhwcoding/p/5106408.html