分享

Ant,Maven与Gradle的概念的理解

 郭恩 2018-08-20

 转载地址:http://www.jianshu.com/p/cd8fe9b16369#

 

 

我们还是以AndroidStudio 2.1.1为例来讲。

用AndroidStudio就逃不开跟Gradle打交道,有人说这个东西很简单,就是一些配置,不用管,但我认为不是,引入一个工程编译都无法通过,而你又不知道错在哪,这怎么行呢?还是有必要了解一下的。其实我自己也不是很熟悉Gradle,这里只能是把我了解的简单说一下,如有不正确欢迎指正。

一、基本概念

那么什么是Gradle呢?我不想复制网上那些话了,太难懂。其实我理解的话,在AndroidStudio中,它就是个打包apk的工具,它可以把你写的Java代码、C++代码和资源文件经过编译、链接等操作,最终打包成一个apk,有人把这个过程叫做“构建(build)”,好吧,我们也这么叫,Gradle就是用来构建项目的一个工具。

这里先给大家推荐一个链接,讲的相当不错,我当初也是看这篇文章的:

Grade入门

我们下面也是基于这篇文章做一个简单的概括。

二、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,新建一个工程,就可以看到如下目录结构:


AndroidStudio中跟Gradle配置相关的文件

如果你看到的目录结构跟图中不一样,请点击目录顶端的区域,切换工程视图显示方式,默认的视图形式的名称叫做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,因为这个文件是最简单的,打开这个文件,你会看到如下内容:

 


settings.gradle

看到了吧,只有一行,include ':app',意思是我们这个工程中目前只有一个模块,模块的名字叫做app,书写格式是include关键字后边跟一对单引号,单引号中是模块名称,名称前边还加了一个冒号,不要问为什么,这就是规定,如果你的工程中有多个模块,那么就是多对单引号,比如

include ':app',':library'

中间用英文逗号隔开即可;

2、grade-wrapper.properties是第二简单的文件了,打开这个文件可以看到下图所示内容:


grade-wrapper.properties

上面已经说了,这个文件就是告诉系统如果我们的电脑上没有Gradle工具,要到哪个网址下载,所以整个文件最重要的一行就是最后一行了,其中https\中的反斜杠是一个转义符,不用纠结它,上面的那些distributionPath之类的配置是告诉系统如果需要下载Gradle工具的,下载完要保存在哪里,这个不用太纠结;

3、整个工程下的build.gradle文件,打开这个文件可以看到如下所示内容:


整个工程下的build.gradle

这个文件也很简单,主要分成两个结点,buildscript结点是标明Gradle工具本身要怎么配置,Gradle工具本身要从哪个maven仓库下载,我们这里默认使用的是一个叫做jcenter的maven仓库,所谓maven仓库其实就是个网站,jcenter的网址是http://jcenter.,用浏览器打开可以看到里边按目录存放了很多jar包和其它的库文件,除了jcenter之外,常用的maven仓库还有mavenCentral等。

下边的allprojects标签的意思是我们工程里边所有模块的通用配置,这里只规定所有模块中要用到的jar包也都从jcenter这个maven仓库中获取 ,在allprojects标签下配置的好处是你不需要再在每个模块下的build.gradle中单独配置了,如果你想在每个模块下单独指定用哪个maven仓库,那么你在这个全局的build.gradle中也可以不写;

4、接下来就到最复杂的,也是最常用的了,就是我们模块下的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文件,如下图所示:


用命令行生成的apk文件

其实“任务”也是Gradle中的基本概念之一,Gradle把做一件相对完整的事情叫做一个任务,比如你在命令行输入

./gradlew clean

就会执行"clean"任务,我们也可以自定义buildTypes,比如下图所示的这样:


自定义buildType

名字随便起,然后我们在命令行输入

./gradlew buildMyBuildType

就可以执行我们自定义的任务了;

(4)dependencies标签

这个标签下就是我们依赖的jar包,第三方库,或者library工程,如下图所示:


dependencies

这几行是新建工程默认生成的,其中第一行

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是什么?

gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www./

二.为什么使用gradle?

更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;

三.gradle入门需知

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版本的默认值:

现在大家对build.gradle已经初步了解了,我们再看下其他一些与gradle相关的文件:
1.gradle.properties:
从名字上就知道它是一个配置文件,没错,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias等。
2.settings.gradle:
这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:
1
include ':module-a',':module-b'
3.gradle文件夹:
这里面有两个文件,gradle-wrapper.jar和gradle-wrapper.properties,它们就是gradle wrapper。gradle项目都会有,你可以通过命令gradle init来创建它们(前提是本地安装了gradle并且配置到了环境变量中)。
4.gradlew和gradlew.bat:
这分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。
gradlew的用法跟gradle一模一样,比如执行构建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的缩写。
2.gradle仓库:
gradle有三种仓库,maven仓库,ivy仓库以及flat本地仓库。声明方式如下:
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()
}
3.gradle任务:
gradle中有一个核心概念叫任务,跟maven中的插件目标类似。
gradle的android插件提供了四个顶级任务
1
2
3
4
assemble 构建项目输出
check 运行检测和测试任务
build 运行assemble和check
clean 清理输出任务

执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行

1
gradlew assemble

它通常会执行:

1
2
gradlew assembleDebug
gradlew assembleRelease
这时会在你项目的build/outputs/apk或者build/outputs/aar目录生成输出文件
注:linux下执行构建任务需要首先更改gradlew脚本的权限,然后才能执行该脚本:
1
2
chmod +x gradlew
./gradlew assemble

可以通过:

1
gradlew tasks

列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。

四.常见问题

1.导入本地jar包:
跟eclipse不太一样,android studio导入本地jar除了将jar包放到模块的libs目录中以外,还得在该模块的build.gradle中进行配置,配置方式是在dependencies结点下进行如下声明:
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'
3.导入某个project:
你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:
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的,这点需要注意。

4.声明三方maven仓库:
可能你项目需要的一些库文件是在你们公司的***上,这时候repositories中仅有jcenter就不行了,你还需要把***地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。
配置方式:
1
2
3
4
5
repositories{
     maven{
          url="http://mvnrepo."
     }
}

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')
}
8.排除依赖:
当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:
1
2
3
compile (group:'xxx',name:'xxx',version:'xxx'){
      exclude group:'xxx',module:'xxx'//module对应的就是artifactId
}

9.多dex支持(打包65k方法数限制)

 首先在build.gradle的buildConfig中增加如下配置:
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

  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多