Gradle简要教程

news/2024/5/20 3:05:59 标签: android, gradle, 教程

1    什么是Gradle


    最初Android的开发是用Eclipse进行,Eclipse之所以能够用来开发Android项目,是因为一个叫做ADT(Android Developer Tools)的东西,使用ADT,我们只需要写好代码,然后直接在Eclipse上进行编译,运行等一系列操作。自从Google推出Android Studio以来,默认使用Gradle作为构建工具。
    Gradle是一个开源的项目自动化构建工具,建立在Apache Ant 和Apache Maven概念的基础上,并引入了基于Groovy的特定邻域语言(DSL),而不在使用XML形式管理构建脚本。主要用于自动化地进行软件构建、测试、发布、部署、软件打包的项目。

2    依赖管理


    我们知道构建工具不光有编译、打包、运行、签名等功能,还有依赖管理的功能。回到Eclipse,用Eclipse开发的时候,如果我们需要使用到第三方库,我们需要先下载jar包,然后把jar包放到libs目录下,然后就可以使用了。
    在Gradle中,引用jar包的方式稍有区别,把jar包放到libs目录下之后,需要加入以下方法。
 
在此基础上,Gradle增加了新的方式引入第三方库:
 
可以直接看到源地址,想要进行版本升级,直接改后面的版本号,做到更直接的


3    关于Gradle


    Gradle是一种新的构建工具,它是一个独立的项目,与Android、Java无关,与传统的构建工具相比,Gradle采用了一种叫做Groovy的的语言,语法跟Java很像。
    Gradle是一个独立的项目,那么它如何在Android Stuidio上进行Android开发呢? 因为Google团队做了一个AS的插件叫做Android Gradle Plugin,基于这个插件,我们才可以在AS上进行Android Studio开发。在我们的项目的根目录的build.gradle文件里有这么一行代码:
 
这就是我们依赖gradle插件的代码,后面的版本号($gradlePluginVersion)就是Android Gradle Plugin的版本,须注意,这个版本号不是Gradle的版本号。
    当我们创建了一个AS项目,点击运行,默认就会帮我们安装Gradle,但是这个Gradle并不是真正的Gradle,而是Gradle Wrapper,可认为是Gradle的封装。
    简单的说,就是它在你的每一个项目都配置了一个指定版本的Gradle,通过这个每个项目你可以支持用不同的Gradle版本来构建项目。


4    Android项目中Gradle配置文件以及含义


4.1    根目录build.gradle


这个文件是整个项目的 gradle 全局配置文件,代码如下:
 
    buildscript:定义了 Android 编译工具的类路径。
repositories闭包中:
jcenter():它是一个代码托管仓库,很多的Android开源项目都会选择将代码托管到jcenter上,声明了这行配置后,我们就可以在项目中轻松使用任何的jcenter上的开源项目了。
classpath 'com.android.tools.build:gradle:2.2.2'声明了一个Gradle插件。gradle:2.2.2为Gradle插件的版本号。
    allprojects:中定义的属性会被应用到所有 module 中,但是为了保证每个项目的独立性,我们一般不会在这里面操作太多共有的东西。
    buildscript与allprojects的区别:
buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。
allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。


4.2    app目录build.gradle


    文件路径:XXX/app/build.gradle
    每个项目单独的build.gradle:针对每个module的配置,如果这里的定义的选项和顶层build.gradle定义的相同,后者会被覆盖。典型的配置内容如下:
 
从文件内容可以看出,主要分为三大部分:


1、apply plugin


  文件中第一行使用apply plugin表示应用了一个插件,该插件一般有两种值可选:
'com.android.application',表示为应用程序模块,可以直接运行;
'com.android.library',表示为库模块,只能作为代码库依附于别的应用程序模块来运行。


2、android闭包


  这个闭包主要为了配置Adnroid项目构建的各种属性,
    compileSdkVersion用于指定项目的编译版本,25表示使用Android 7.1系统的SDK编译。
    buildToolsVersion用于指定项目构建工具的版本。
android闭包中嵌套了defaultConfig闭包和buildTypes闭包:
a) defaultConfig闭包
  对项目的更多细节进行配置,其中applicationId指定了项目的包名,我们可以通过修改这个值来修改项目的包名。
  minSdkVersion指定项目最低兼容的版本,这里指定为15,表示最低兼容到Android 4.0系统。
  targetSdkVersion指定的值表示在该目标版本上已经做过充分测试,系统会为该应用启动一些对应该目标系统的最新功能特性,Android系统平台的行为变更,只有targetSdkVersion的属性值被设置为大于或等于该系统平台的API版本时,才会生效。例如,若指定targetSdkVersion值为22,则表示该程序最高只在Android5.1版本上做过充分测试,在Android6.0系统上(对应targetSdkVersion为23)拥有的新特性如系统运行时权限等功能就不会被启用。
b) buildTypes闭包
  这个闭包主要指定生成安装文件的主要配置,一般包含两个子闭包,一个是debug闭包,用于指定生成测试版安装文件的配置,可以忽略不写;另一个是release闭包,用于指定生成正式版安装文件的配置。
  上面的代码中省去了debug闭包的内容,只写了release闭包。其中minifyEnabled表明是否对代码进行混淆,true表示对代码进行混淆。proguardFiles指定混淆的规则文件,这里指定了proguard-android.txt文件和proguard-rules.pro文件两个文件,proguard-android.txt文件为默认的混淆文件,里面定义了一些通用的混淆规则。proguard-rules.pro文件位于当前项目的根目录下,可以在该文件中定义一些项目特有的混淆规则。


3、dependencies闭包


  该闭包定义了项目的依赖关系,一般项目都有三种依赖方式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的jar包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖可以对jcener库上的开源项目添加依赖关系。


4.3    Gradle文件夹


这个目录底下,有个wrapper文件夹,我们可以看看这个gradle-wrapper.properties文件:
 
可以看到,这里指示了gradle的下载地址以及当前项目使用到的版本号,很多时候,导入项目不成功可能这个版本号不匹配而导致的。


4.4    settings.gradle


这个文件是全局的项目配置文件,里面主要声明一些需要加入 gradle 的 module。


5    相关优化


加快编译速度的方式总结:


5.1    修改运行内存


    方法:菜单栏-help-Edit Custom VM Option,增加如下内容:
-Xms2048m
-Xmx2048m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m
-xmx 参数是 Java 虚拟机启动时的参数,用于限制最大堆内存


5.2    修改gradle设置


gradle.properties中做如下修改
#JVM内存
org.gradle.jvmargs = -Xmx2048m
#开启并行编译
org.gradle.parallel = true
#开启编译守护进程
org.gradle.daemon = true

5.3    使用本地gradle


    开启offline work,编译时,Android Studio会从cache中加载各种依赖,在第一次成功编译后,开启次选项会减少远程成就依赖,从而加快编译。


5.4    使用 Instant Run


    此功能可以减少编译次数,例如:修改TextView值的时候,可以快速的体现在手机上,而不用重新编译工程。


http://www.niftyadmin.cn/n/860960.html

相关文章

jmx 监控 Druid节点

通过jmx 远程监控Druid节点 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.portJMX端口 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse 注意:这4行文字是换行的,而且每行是前后是没有空…

数学表达式计算 MathParser.org-mXparser

背景 在系统中需要计算公式,参数可以配置,类似excel的情况,可以实现数据的计算。 mXparser 实例 public static void main(String[] args) throws InterruptedException {Argument days new Argument("days 30");Expression min …

AndroidStudio运行出错问题总结

依赖版本是否有问题,例如目标版本是26.0.0,而依赖版本高于目标版本为27.0.0远程仓库是否被墙,如果被墙则添加阿里云仓库gradle版本配置是否出错。如果出错则切换成可运行项目的gradle版本

Java基础(关键字,标识符,注释,常量及变量)

文章目录关键字标识符注释常量变量关键字 被Java赋予特殊含义的单词: class,new,private,protected,public,static,final,abstract,interface,this,super,instanceof,extends,implements,try,cache,finally,throw,throws,if,else,do,while,for,break,continue,switch,case,retu…

git squash

今天在合并代码时,突然发现,gitlab 上多了一个 选项 squash:这个选项,使用压缩提交记录。有的时候可能由于,提交比较多,而且提交的记录有没有太多意义。提交记录,就没有必要出现在主干记录。此时就可以使用…

java.lang.IllegalStateException: TimerTask is scheduled

现象 在程序中调用 timer.schedule(timertask)时传入相同的timertask对象。导致发生异常java.lang.IllegalStateException: TimerTask is scheduled already 解决 每次调用timer.schedule(timertask)对象时,重新创建新的对象timertask。

FixedOrderComparator BeanComparator 实现指定排序

实现根据指定的数组排序,切未指定的属性,在指定之前 String[] strs { "北部网信","其他","合计","南部" };Arrays.sort(strs);log.info("-{}", JSONObject.toJSONString(strs));String[] sorts { &…

Java泛型-泛型方法,泛型接口,泛型类

文章目录java泛型泛型类泛型接口泛型方法java泛型 泛型出现的动机 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。 泛型类 在编译期,是无法知道K和V具体是什么类型,只有在运行时才会真正根据类型来构…