转载地址:http://www.jianshu.com/p/cd8fe9b16369#
我们还是以AndroidStudio 2.1.1为例来讲。
用AndroidStudio就逃不开跟Gradle打交道,有人说这个东西很简单,就是一些配置,不用管,但我认为不是,引入一个工程编译都无法通过,而你又不知道错在哪,这怎么行呢?还是有必要了解一下的。其实我自己也不是很熟悉Gradle,这里只能是把我了解的简单说一下,如有不正确欢迎指正。
一、基本概念
那么什么是Gradle呢?我不想复制网上那些话了,太难懂。其实我理解的话,在AndroidStudio中,它就是个打包apk的工具,它可以把你写的Java代码、C++代码和资源文件经过编译、链接等操作,最终打包成一个apk,有人把这个过程叫做“构建(build)”,好吧,我们也这么叫,Gradle就是用来构建项目的一个工具。
这里先给大家推荐一个链接,讲的相当不错,我当初也是看这篇文章的:
我们下面也是基于这篇文章做一个简单的概括。
二、Gradle与Ant、Maven之间的关系
其实在AndroidStudio出来之前,我们在eclipse中也有构建项目的概念,当时用的其实是一款叫做ant的工具,google给我们集成到SDK中了,是Apach基金组织推出的一个构建项目的工具,我们当初之所以能把一大堆Java代码和图片打包成一个apk主要靠它。
然后熟悉J2EE开发的同学可能用过一款叫做maven的工具,什么叫maven呢?maven也是Apach基金组织推出的一款工具,简单的说就是帮我们下载jar包、并且通过配置xml文件使jar包能被我们的Java代码引用的一个工具,我们用eclipse做Android开发时其实很少有用到maven,都是直接从网上下载个jar包拷到工程目录下用。那么在使用Gradle之后,我们在Android项目中也可以用maven了,想用什么jar包,直接填写在gradle配置文件中,jar包就会自动帮我们下载到工程中,还能通过配置让jar包时刻保持最新版本,如果你网络条件好的话,用maven还是比较方便的。
那么Gradle其实就是融合了ant和maven的功能,即能构建项目,又能从网上的maven网站中自动帮我们下载jar包。
三、AndroidStudio中与Gradle相关的文件
打开AndroidStudio,新建一个工程,就可以看到如下目录结构:
![](https://i-blog.csdnimg.cn/blog_migrate/f33b46ced7bbacdbde646e5c103612e1.webp?x-image-process=image/format,png)
如果你看到的目录结构跟图中不一样,请点击目录顶端的区域,切换工程视图显示方式,默认的视图形式的名称叫做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,现在一个一个来解释这几个文件中的内容,不按上边的显示顺序了,先挑简单的来说吧:
1、先来说一下settings.gradle,因为这个文件是最简单的,打开这个文件,你会看到如下内容:
![](https://i-blog.csdnimg.cn/blog_migrate/738913c05e2220758c40fb4b033f12e3.webp?x-image-process=image/format,png)
看到了吧,只有一行,include ':app',意思是我们这个工程中目前只有一个模块,模块的名字叫做app,书写格式是include关键字后边跟一对单引号,单引号中是模块名称,名称前边还加了一个冒号,不要问为什么,这就是规定,如果你的工程中有多个模块,那么就是多对单引号,比如
include ':app',':library'
中间用英文逗号隔开即可;
2、grade-wrapper.properties是第二简单的文件了,打开这个文件可以看到下图所示内容:
![](https://i-blog.csdnimg.cn/blog_migrate/3814c8720e7a0ea327b2bff4100f9457.webp?x-image-process=image/format,png)
上面已经说了,这个文件就是告诉系统如果我们的电脑上没有Gradle工具,要到哪个网址下载,所以整个文件最重要的一行就是最后一行了,其中https\中的反斜杠是一个转义符,不用纠结它,上面的那些distributionPath之类的配置是告诉系统如果需要下载Gradle工具的,下载完要保存在哪里,这个不用太纠结;
3、整个工程下的build.gradle文件,打开这个文件可以看到如下所示内容:
![](https://i-blog.csdnimg.cn/blog_migrate/4ee197e2220f740255f2532b6a1a9279.webp?x-image-process=image/format,png)
这个文件也很简单,主要分成两个结点,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中也可以不写;
4、接下来就到最复杂的,也是最常用的了,就是我们模块下的build.gradle文件,打开这个文件,可以看到如下图所示内容:
![](https://i-blog.csdnimg.cn/blog_migrate/dedc14525289a9679908636853621c0b.webp?x-image-process=image/format,png)
我挑几个重要的点说吧,不重要的就不说了,从上往下看:
(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)在哪个目录下,签名文件的密码之类的,如果你没配置的话就使用默认值,如果想改的要怎么改呢?如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/78815edde49679ef8bf33fb7626e3f5d.webp?x-image-process=image/format,png)
如上图所示,我们需要在android标签下调用一个signingConfigs标签,这个标签其实也是com.android.application插件中的,在下边随意增加配置,myConfig这个名字是随意起的,默认的有两个:release和debug,如果你想修改默认的打包配置就到这两个标签下改,如果想自己写一个就像图中这样写一个myConfig就可以了,里边写上用哪个keystore文件,keystore的密码,然后不要忘了在buildTypes标签引用就可以了;
那么这些标签定义好之后要怎么使用呢?最常用的使用方式就是通过命令行要调用,在AndroidStudio中自带命令行工具,打开之后就可以自动定位到当前工程目录下,然后在命令行输入:
./gradlew build构建类型名称
即可执行相应的构建任务,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/873da2b0f1c892d08165c527d32fe2be.webp?x-image-process=image/format,png)
其中构建类型名称就是我们在buildTypes下配置的构建类型标签的名称,并且要以大写字母开头(这也是规定),比如上图中输入
./gradlew buildDebug
就会执行我们在buildTypes下配置的debug标签下的任务,然后在app/build/outputs/apk目录下会生成一个apk文件,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/5639362c69a5773a9a806e183721afcc.webp?x-image-process=image/format,png)
其实“任务”也是Gradle中的基本概念之一,Gradle把做一件相对完整的事情叫做一个任务,比如你在命令行输入
./gradlew clean
就会执行"clean"任务,我们也可以自定义buildTypes,比如下图所示的这样:
![](https://i-blog.csdnimg.cn/blog_migrate/b19f9adc153899804bc06dbc44c8d589.webp?x-image-process=image/format,png)
名字随便起,然后我们在命令行输入
./gradlew buildMyBuildType
就可以执行我们自定义的任务了;
(4)dependencies标签
这个标签下就是我们依赖的jar包,第三方库,或者library工程,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/13510dc3ec64c1f6a544589275be71fb.webp?x-image-process=image/format,png)
这几行是新建工程默认生成的,其中第一行
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入门,这篇文章讲的很浅显,也很全面。
基本上看完这几节内容,大家应该对AndroidStudio不那么陌生了,之后我打算写一次我把公司的eclipse项目迁移到AndroidStudio的过程中遇到的一些坑以及解决方案,欢迎继续关注。
参考文章:http://www.androidchina.net/2155.html
原文链接:http://www.jianshu.com/p/cd8fe9b16369#
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。