转载地址:http://www.jianshu.com/p/cd8fe9b16369#html
咱们仍是以AndroidStudio 2.1.1为例来说。java
用AndroidStudio就逃不开跟Gradle打交道,有人说这个东西很简单,就是一些配置,不用管,但我认为不是,引入一个工程编译都没法经过,而你又不知道错在哪,这怎么行呢?仍是有必要了解一下的。其实我本身也不是很熟悉Gradle,这里只能是把我了解的简单说一下,若有不正确欢迎指正。linux
那么什么是Gradle呢?我不想复制网上那些话了,太难懂。其实我理解的话,在AndroidStudio中,它就是个打包apk的工具,它能够把你写的Java代码、C++代码和资源文件通过编译、连接等操做,最终打包成一个apk,有人把这个过程叫作“构建(build)”,好吧,咱们也这么叫,Gradle就是用来构建项目的一个工具。android
这里先给你们推荐一个连接,讲的至关不错,我当初也是看这篇文章的:git
Grade入门github
咱们下面也是基于这篇文章作一个简单的归纳。shell
其实在AndroidStudio出来以前,咱们在eclipse中也有构建项目的概念,当时用的实际上是一款叫作ant的工具,google给咱们集成到SDK中了,是Apach基金组织推出的一个构建项目的工具,咱们当初之因此能把一大堆Java代码和图片打包成一个apk主要靠它。windows
而后熟悉J2EE开发的同窗可能用过一款叫作maven的工具,什么叫maven呢?maven也是Apach基金组织推出的一款工具,简单的说就是帮咱们下载jar包、而且经过配置xml文件使jar包能被咱们的Java代码引用的一个工具,咱们用eclipse作Android开发时其实不多有用到maven,都是直接从网上下载个jar包拷到工程目录下用。那么在使用Gradle以后,咱们在Android项目中也能够用maven了,想用什么jar包,直接填写在gradle配置文件中,jar包就会自动帮咱们下载到工程中,还能经过配置让jar包时刻保持最新版本,若是你网络条件好的话,用maven仍是比较方便的。api
那么Gradle其实就是融合了ant和maven的功能,即能构建项目,又能从网上的maven网站中自动帮咱们下载jar包。浏览器
打开AndroidStudio,新建一个工程,就能够看到以下目录结构:
若是你看到的目录结构跟图中不同,请点击目录顶端的区域,切换工程视图显示方式,默认的视图形式的名称叫作Android,推荐使用Project。
(1)从图中能够看出,在app模块下,有一个build.gradle文件,这个gradle文件是整个项目中最重要的一个gradle文件,咱们从此主要跟这个文件打交道;
(2)grade-wrapper.properties文件,这个文件中主要是告诉开发工具,若是咱们的电脑中找不到Gradle工具,那么要到哪一个网址去下载Gradle工具,下载哪一个版本的;
(3)整个工程目录下的build.gradle文件,这个文件跟模块下的build.gradle文件名字相同,可是是负责整个工程全部模块的构建的(一个工程有可能包含多个模块,好比你的项目中还可能有一个Library);
(4)settings.gradle文件,这个文件最简单,就是告诉gradle工具我这个工程中包含哪几个模块;
OK,如今一个一个来解释这几个文件中的内容,不按上边的显示顺序了,先挑简单的来讲吧:
一、先来讲一下settings.gradle,由于这个文件是最简单的,打开这个文件,你会看到以下内容:
看到了吧,只有一行,include ':app',意思是咱们这个工程中目前只有一个模块,模块的名字叫作app,书写格式是include关键字后边跟一对单引号,单引号中是模块名称,名称前边还加了一个冒号,不要问为何,这就是规定,若是你的工程中有多个模块,那么就是多对单引号,好比
include ':app',':library'
中间用英文逗号隔开便可;
二、grade-wrapper.properties是第二简单的文件了,打开这个文件能够看到下图所示内容:
上面已经说了,这个文件就是告诉系统若是咱们的电脑上没有Gradle工具,要到哪一个网址下载,因此整个文件最重要的一行就是最后一行了,其中https\中的反斜杠是一个转义符,不用纠结它,上面的那些distributionPath之类的配置是告诉系统若是须要下载Gradle工具的,下载完要保存在哪里,这个不用太纠结;
三、整个工程下的build.gradle文件,打开这个文件能够看到以下所示内容:
这个文件也很简单,主要分红两个结点,buildscript结点是标明Gradle工具自己要怎么配置,Gradle工具自己要从哪一个maven仓库下载,咱们这里默认使用的是一个叫作jcenter的maven仓库,所谓maven仓库其实就是个网站,jcenter的网址是http://jcenter.bintray.com,用浏览器打开能够看到里边按目录存放了不少jar包和其它的库文件,除了jcenter以外,经常使用的maven仓库还有mavenCentral等。
下边的allprojects标签的意思是咱们工程里边全部模块的通用配置,这里只规定全部模块中要用到的jar包也都从jcenter这个maven仓库中获取 ,在allprojects标签下配置的好处是你不须要再在每一个模块下的build.gradle中单独配置了,若是你想在每一个模块下单独指定用哪一个maven仓库,那么你在这个全局的build.gradle中也能够不写;
四、接下来就到最复杂的,也是最经常使用的了,就是咱们模块下的build.gradle文件,打开这个文件,能够看到以下图所示内容:
我挑几个重要的点说吧,不重要的就不说了,从上往下看:
(1)apply plugin标签
首先第一行,apply plugin,这个是Gradle工具规定的写法,意思是咱们要使用什么插件来构建项目,后边跟的是插件名称,com.android.application是Google经过Gradle的api,使用Groovy语言编写的一个插件,用于构建Android主工程,至关于eclipse中的ADT插件。
若是这个模块是一个Library的话,应该引入的插件叫作'com.android.library',若是你熟悉Gradle的api的话也能够写本身的插件,github上有许多辅助Android开发的插件,下载下来就是个jar包,能够引入AndroidStudio中,有兴趣的能够去了解一下;
(2)版本以及包名等常规配置
再下边的android标签下就是咱们主要关注的地方了,compileSdkVersion是咱们要用Android哪一个版本的api,等同于eclipse项目中project.properties文件配置的target=android-xx,xx是版本号,好比target=android-23;
buildToolsVersion,这个是构建工具的版本号,与咱们在代码中调用的api没什么关系,是打包用的,建议用比较新的版本,由于我曾经用比较旧的19.0.1版本时发现不少坑;
applicationId,这个就是咱们应用的惟一标识:包名。在eclipse中是配置在AndroidManifest.xml文件中的,在AndroidStudio中改成配置在build.gradle中了,这里注意若是你这个模块是Library,那么要把这行删掉,若是你在Library模块中也配置了applicationId的话到时候会在手机屏幕上看到两个应用图标,很怪;
应用版本号应该不用说了,用过eclipse的同窗应该很熟悉了,无非就是把之前在AndroidManifest.xml文件中配置的东西搬到这里来而已;
(3)buildTypes标签,这个是重点
再下边的buildTypes,这个标签大有文章,代表咱们能够打哪些类型的apk包,新建工程中只有一个release类型,意思是正式发布的apk要怎么打包。
buildTypes下除了release标签,默认的还有一个叫作debug的标签。在这些标签下,咱们能够指定要用到的混淆文件在哪一个目录下,签名文件(keystore)在哪一个目录下,签名文件的密码之类的,若是你没配置的话就使用默认值,若是想改的要怎么改呢?以下图:
如上图所示,咱们须要在android标签下调用一个signingConfigs标签,这个标签其实也是com.android.application插件中的,在下边随意增长配置,myConfig这个名字是随意起的,默认的有两个:release和debug,若是你想修改默认的打包配置就到这两个标签下改,若是想本身写一个就像图中这样写一个myConfig就能够了,里边写上用哪一个keystore文件,keystore的密码,而后不要忘了在buildTypes标签引用就能够了;
那么这些标签订义好以后要怎么使用呢?最经常使用的使用方式就是经过命令行要调用,在AndroidStudio中自带命令行工具,打开以后就能够自动定位到当前工程目录下,而后在命令行输入:
./gradlew build构建类型名称
便可执行相应的构建任务,以下图所示:
其中构建类型名称就是咱们在buildTypes下配置的构建类型标签的名称,而且要以大写字母开头(这也是规定),好比上图中输入
./gradlew buildDebug
就会执行咱们在buildTypes下配置的debug标签下的任务,而后在app/build/outputs/apk目录下会生成一个apk文件,以下图所示:
其实“任务”也是Gradle中的基本概念之一,Gradle把作一件相对完整的事情叫作一个任务,好比你在命令行输入
./gradlew clean
就会执行"clean"任务,咱们也能够自定义buildTypes,好比下图所示的这样:
名字随便起,而后咱们在命令行输入
./gradlew buildMyBuildType
就能够执行咱们自定义的任务了;
(4)dependencies标签
这个标签下就是咱们依赖的jar包,第三方库,或者library工程,以下图所示:
这几行是新建工程默认生成的,其中第一行
compile fileTree(dir:'libs',include: ['*.jar'])
这一行的配置很重要,代表咱们工程中要用到的jar包均可以放在app下的libs目录中,有了这一行配置,咱们就能够放心的把jar包放在libs目录下,而不须要再作额外的配置了,跟eclipse下基本同样了,是否是很方便;
而后再往下
compile 'com.android.support:appcompat-v7:23.4.0'
这一行就是代表到maven库中找v7支持包,仔细观察的话,这句话中单引号中内容被冒号分红了三个部分,com.android.support是这个支持包在maven库中的存放路径,appcompat-v7是这个包的名称,23.4.0是这个包的版本,有了这个配置,Gradle工具就会到咱们在全局gradle文件中指定的maven库中下载相应的支持包了,其中版本号这个东西颇有意思,你能够不写23.4.0,你能够写成23.4.+,意思就是若是支持包出了新版本,好比出了23.4.1,那么就用23.4这个分支下的最新版本,若是写成23.+,就是始终使用23这个版本下最新的分支版本,若是干脆写成一个+号,好比像下面这样
compile 'com.android.support:appcompat-v7:+'
就是告诉编译器,我要始终使用最新版的v7支持包,是否是比咱们手动拷贝jar包或aar包要灵活多了,不过仍是不建议这样写,由于gradle会始终访问网络去查询有没有新的包,国内的网速你懂的,并且你也没法肯定最新的包是否是必定适合你,有没有兼容旧版的代码。
而后dependencies标签下还能够配置咱们引用了哪些Library模块(对应eclipse下的Library工程),若是咱们的app主模块有引用Library工程,就必定要在dependencies标签下指定Library,像下面这样:
compile project(':my-library-module')
project后面括号中的内容要与前面所说的settings.gradle文件中写的模块名称一致,也是以冒号开头,而且用单引号括起来。
OK,关于Gradle配置的内容暂时先说这么多吧,由于我也不是很懂,更详细的内容必定要看一下文章开头推荐的那个连接Gradle入门,这篇文章讲的很浅显,也很全面。
随着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
|