您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 深入理解Android之Gradle(完整版)
深入理解Android之GradleGradle是当前非常“劲爆”得构建工具。本篇文章就是专为讲解Gradle而来。介绍Gradle之前,先说点题外话。一、题外话说实话,我在大法工作的时候,就见过Gradle。但是当时我一直不知道这是什么东西。而且大法工具组的工程师还将其和AndroidStudio大法版一起推送,偶一看就更没兴趣了。为什么那个时候如此不待见Gradle呢?因为我此前一直是做ROM开发。在这个层面上,我们用make,mm或者mmm就可以了。而且,编译耗时对我们来说也不是啥痛点,因为用组内吊炸天的神机服务器完整编译大法的image也要耗费1个小时左右。所以,那个时侯Gradle完全不是我们的菜。现在,搞APP开发居多,编译/打包等问题立即就成痛点了。比如:一个APP有多个版本,Release版、Debug版、Test版。甚至针对不同APPStore都有不同的版本。在以前ROM的环境下,虽然可以配置Android.mk,但是需要依赖整个Android源码,而且还不能完全做到满足条件,很多事情需要手动搞。一个app如果涉及到多个开发者,手动操作必然会带来混乱。library工程我们需要编译成jar包,然后发布给其他开发者使用。以前是用eclipse的export,做一堆选择。要是能自动编译成jar包就爽了。上述问题对绝大部分APP开发者而言都不陌生,而Gradle作为一种很方便的的构建工具,可以非常轻松得解决构建过程中的各种问题。二、闲言构建构建,叫build也好,叫make也行。反正就是根据输入信息然后干一堆事情,最后得到几个产出物(Artifact)。最最简单的构建工具就是make了。make就是根据Makefile文件中写的规则,执行对应的命令,然后得到目标产物。日常生活中,和构建最类似的一个场景就是做菜。输入各种食材,然后按固定的工序,最后得到一盘菜。当然,做同样一道菜,由于需求不同,做出来的东西也不尽相同。比如,宫保鸡丁这道菜,回民要求不能放大油、口淡的要求少放盐和各种油、辣不怕的男女汉子们可以要求多放辣子....总之,做菜包含固定的工序,但是对于不同条件或需求,需要做不同的处理。在Gradle爆红之前,常用的构建工具是ANT,然后又进化到Maven。ANT和Maven这两个工具其实也还算方便,现在还有很多地方在使用。但是二者都有一些缺点,所以让更懒得人觉得不是那么方便。比如,Maven编译规则是用XML来编写的。XML虽然通俗易懂,但是很难在xml中描述if{某条件成立,编译某文件}/else{编译其他文件}这样有不同条件的任务。怎么解决?怎么解决好?对程序员而言,自然是编程解决,但是有几个小要求:这种“编程”不要搞得和程序员理解的编程那样复杂。寥寥几笔,轻轻松松把要做的事情描述出来就最好不过。所以,Gradle选择了Groovy。Groovy基于Java并拓展了Java。Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Javaclass然后启动虚拟机来执行。当然,这些底层的渣活不需要你管。除了可以用很灵活的语言来写构建规则外,Gradle另外一个特点就是它是一种DSL,即DomainSpecificLanguage,领域相关语言。什么是DSL,说白了它是某个行业中的行话。还是不明白?徐克导演得《智取威虎山》中就有很典型的DSL使用描述,比如:土匪:蘑菇,你哪路?什么价?(什么人?到哪里去?)杨子荣:哈!想啥来啥,想吃奶来了妈妈,想娘家的人,孩子他舅舅来了。(找同行)杨子荣:拜见三爷!土匪:天王盖地虎!(你好大的胆!敢来气你的祖宗?)杨子荣:宝塔镇河妖!(要是那样,叫我从山上摔死,掉河里淹死。)土匪:野鸡闷头钻,哪能上天王山!(你不是正牌的。)杨子荣:地上有的是米,喂呀,有根底!(老子是正牌的,老牌的。)Gradle中也有类似的行话,比如sourceSets代表源文件的集合等.....太多了,记不住。以后我们都会接触到这些行话。那么,对使用者而言,这些行话的好处是什么呢?这就是:一句行话可以包含很多意思,而且在这个行当里的人一听就懂,不用解释。另外,基于行话,我们甚至可以建立一个模板,使用者只要往这个模板里填必须要填的内容,Gradle就可以非常漂亮得完成工作,得到想要的东西。这就和现在的智能炒菜机器似的,只要选择菜谱,把食材准备好,剩下的事情就不用你操心了。吃货们对这种做菜方式肯定是以反感为主,太没有特色了。但是程序员对Gradle类似做法却热烈拥抱。到此,大家应该明白要真正学会Gradle恐怕是离不开下面两个基础知识:Groovy,由于它基于Java,所以我们仅介绍Java之外的东西。了解Groovy语言是掌握Gradle的基础。Gradle作为一个工具,它的行话和它“为人处事”的原则。三、Groovy介绍Groovy是一种动态语言。这种语言比较有特点,它和Java一样,也运行于Java虚拟机中。恩??对头,简单粗暴点儿看,你可以认为Groovy扩展了Java语言。比如,Groovy对自己的定义就是:Groovy是在java平台上的、具有像Python,Ruby和Smalltalk语言特性的灵活动态语言,Groovy保证了这些特性像Java语法一样被Java开发者使用。除了语言和Java相通外,Groovy有时候又像一种脚本语言。前文也提到过,当我执行Groovy脚本时,Groovy会先将其编译成Java类字节码,然后通过Jvm来执行这个Java类。图1展示了Java、Groovy和Jvm之间的关系。实际上,由于GroovyCode在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码。图1Java、Groovy和JVM的关系下面我们将介绍Groovy。由于此文的主要目的是Gradle,所以我们不会过多讨论Groovy中细枝末节的东西,而是把知识点集中在以后和Gradle打交道时一些常用的地方上。3.1Groovy开发环境在学习本节的时候,最好部署一下Groovy开发环境。根据Groovy官网的介绍(),部署Groovy开发环境非常简单,在Ubuntu或者cygwin之类的地方:curl-sget.gvmtool.net|bashsource$HOME/.gvm/bin/gvm-init.shgvminstallgroovy执行完最后一步,Groovy就下载并安装了。图1是安装时候的示意图然后,创建一个test.groovy文件,里边只有一行代码:printlnhellogroovy执行groovytest.groovy,输出结果如图2所示:亲们,必须要完成上面的操作啊。做完后,有什么感觉和体会?最大的感觉可能就是groovy和shell脚本,或者python好类似。另外,除了可以直接使用JDK之外,Groovy还有一套GDK,网址是。图1Groovy安装示意图图2执行groovy脚本说实话,看了这么多家API文档,还是Google的AndroidAPI文档做得好。其页面中右上角有一个搜索栏,在里边输入一些关键字,瞬间就能列出候选类,相关文档,方便得不得了啊.....3.2一些前提知识为了后面讲述方面,这里先介绍一些前提知识。初期接触可能有些别扭,看习惯就好了。Groovy注释标记和Java一样,支持//或者/**/Groovy语句可以不用分号结尾。Groovy为了尽量减少代码的输入,确实煞费苦心Groovy中支持动态类型,即定义变量的时候可以不指定其类型。Groovy中,变量定义可以使用关键字def。注意,虽然def不是必须的,但是为了代码清晰,建议还是使用def关键字defvariable1=1//可以不使用分号结尾defvarable2=Iamapersondefintx=1//变量定义时,也可以直接指定类型函数定义时,参数的类型也可以不指定。比如StringtestFunction(arg1,arg2){//无需指定参数类型...}除了变量定义可以不指定类型外,Groovy中函数的返回值也可以是无类型的。比如://无类型的函数定义,必须使用def关键字defnonReturnTypeFunc(){last_line//最后一行代码的执行结果就是本函数的返回值}//如果指定了函数返回类型,则可不必加def关键字来定义函数StringgetString(){returnIamastring}其实,所谓的无返回类型的函数,我估计内部都是按返回Object类型来处理的。毕竟,Groovy是基于Java的,而且最终会转成JavaCode运行在JVM上函数返回值:Groovy的函数里,可以不使用returnxxx来设置xxx为函数返回值。如果不使用return语句的话,则函数里最后一句代码的执行结果被设置成返回值。比如//下面这个函数的返回值是字符串getSomethingreturnvaluedefgetSomething(){getSomethingreturnvalue//如果这是最后一行代码,则返回类型为String1000//如果这是最后一行代码,则返回类型为Integer}注意,如果函数定义时候指明了返回值类型的话,函数中则必须返回正确的数据类型,否则运行时报错。如果使用了动态类型的话,你就可以返回任何类型了。Groovy对字符串支持相当强大,充分吸收了一些脚本语言的优点:1单引号''中的内容严格对应Java中的String,不对$符号进行转义defsingleQuote='Iam$dolloar'//输出就是Iam$dolloar2双引号的内容则和脚本语言的处理有点像,如果字符中有$号的话,则它会$表达式先求值。defdoubleQuoteWithoutDollar=Iamonedollar//输出Iamonedollardefx=1defdoubleQuoteWithDollar=Iam$xdolloar//输出Iam1dolloar3三个引号'''xxx'''中的字符串支持随意换行比如defmultieLines='''beginline1line2end'''最后,除了每行代码不用加分号外,Groovy中函数调用的时候还可以不加括号。比如:println(test)---printlntest注意,虽然写代码的时候,对于函数调用可以不带括号,但是Groovy经常把属性和函数调用混淆。比如defgetSomething(){hello}getSomething()//如果不加括号的话,Groovy会误认为getSomething是一个变量。比如:所以,调用函数要不要带括号,我个人意见是如果这个函数是GroovyAPI或者GradleAPI中比较常用的,比如println,就可以不带括号。否则还是带括号。Groovy自己也没有太好的办法解决这个问题,只能兵来将挡水来土掩了。好了,了解上面一些基础知识后,我们再介绍点深入的内容。3.3Groovy中的数据类型Groovy中的数据类型我们就介绍两种和Java不太一样的:一个是Java中的基本数据类型。另外一个是Groovy中的容器类。最后一个非常重要的是闭包。放心,这里介绍的东西都很简单3.3.1基本数据类型作为动态语言,Groovy世界中的所有事物都是对象。所以,int,boolean这些Java中的基本数据类型,在Groovy代码中其实对应的是它们的包装数据类型。比如int对应为Integer,boolean对应为Boolean。比如下图中的代码执行结果:图4int实际上是Integer图3错误示意3.3.2容器类Groovy中的容器类很简单,就三种:List:链表,其底层对应
本文标题:深入理解Android之Gradle(完整版)
链接地址:https://www.777doc.com/doc-5194362 .html