本篇文章由嵌入式企鹅圈原创团队、魅族资深project师degao撰写。

随着Android 开发环境从Eclipse转向Android Studio,我们每一个人都開始或多或少要接触gradle脚本。大多数人将gradle看做构建工具。出现故障不知怎样着手分析,仅仅能寄希望百度能找到解决方式,事实上大可不必。

假设我们把gradle看做编程框架,并理清gradle脚本与gradle对象的关系,通过查阅文档,不但能清晰理解gradle脚本,并且出现故障再也不用百度,通过查阅文档就能轻松解决这个问题。

本文就通过一个最普通的gradleproject。告诉大家怎样通过查阅api文档来看懂Android里面的gradle 脚本。

versionName"1.0"

}

buildTypes {

release {

minifyEnabled true

proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

}

}

}

六、在gradle中使用java语言编程的样例

直接上代码,想学习的就劳心理解啦,编辑器对代码不太友好啊。

1. build.gradle

buildscript {

repositories{

maven {

url 'http://artifactory.rnd.meizu.com/artifactory/all'

}

}

dependencies {

classpath 'org.aspectj:aspectjtools:1.8.6'

}

}

importorg.aspectj.bridge.IMessage

import org.aspectj.bridge.MessageHandler

importorg.aspectj.tools.ajc.Main

dependencies{

compile'org.aspectj:aspectjrt:1.8.6'

}

android.applicationVariants.all{ variant ->

JavaCompile javaCompile = variant.javaCompile

//println javaCompile.properties

javaCompile.doLast {

String[] args = [

"-showWeaveInfo",

"-1.5",

"-inpath", javaCompile.destinationDir.toString(),

"-aspectpath",javaCompile.classpath.asPath,

"-d", javaCompile.destinationDir.toString(),

"-classpath",javaCompile.classpath.asPath,

"-bootclasspath",android.bootClasspath.join(File.pathSeparator)

]

MessageHandler handler = newMessageHandler(true);

new Main().run(args, handler)

def log = project.logger

for (IMessage message : handler.getMessages(null,true)) {

switch (message.getKind()) {

case IMessage.ABORT:

case IMessage.ERROR:

case IMessage.FAIL:

log.error message.message,message.thrown

break;

case IMessage.WARNING:

case IMessage.INFO:

log.info message.message,message.thrown

break;

case IMessage.DEBUG:

log.debug message.message,message.thrown

break;

}

}

println "aspect args : " +args.toString()

}

}

2. groovy

以下这段代码展示了groovy中变量定义,函数定义,List,Map,Range,闭包。

1)变量定义

defvariable1 = 1   //能够不使用分号结尾

2)函数定义。

StringtestFunction(arg1,arg2){//无需指定參数类型

...

}

3)List变量由[]定义,比方

defaList = [5,'string',true] //List由[]定义,其元素能够是不论什么对象

4)List存取

aList[100]= 100 //设置第101个元素的值为10

assertaList[100] == 100

5)Map变量由[:]定义,比方

defaMap = ['key1':'value1','key2':true]

Map由[:]定义。注意当中的冒号。冒号左边是key,右边是Value。key必须是字符串,value能够是不论什么对象。另外,key能够用''或""包起来,也能够不用引號包起来。比方:

defaNewMap = [key1:"value",key2:true]//当中的key1和key2默认被处理成字符串"key1"和"key2"

只是Key要是不使用引號包起来的话,也会带来一定混淆。比方

defkey1="wowo"

defaConfusedMap=[key1:"who am i?

"]

//aConfuseMap中的key1究竟是"key1"还是变量key1的值“wowo”?显然,答案是字符串"key1"。假设要是"wowo"的话,则aConfusedMap的定义必须设置成:

defaConfusedMap=[(key1):"who am i?

"]

6)Range类,Range类型的变量 由begin值+两个点+end值表示

def aRange =1..5

//假设不想包括最后一个元素,则

defaRangeWithoutEnd = 1..<5

//包括1,2,3,4这4个元素

7)闭包

defxxx = {paramters -> code}  //或者

defxxx = {无參数,纯code}

比方:

defgreeting = { "Hello, $it!" }

assertgreeting('Patrick') == 'Hello, Patrick!'

当函数的最后一个參数是闭包的话。能够省略圆括号。

public static<T> List<T>each(List<T> self, Closure closure)

上面这个函数表示针对List的每一个元素都会调用closure做一些处理。

这里的closure。就有点回调函数的感觉。可是,在使用这个each函数的时候。我们传递一个怎样的Closure进去呢?比方:

def iamList =[1,2,3,4,5]  //定义一个List

iamList.each{//调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?

println it

}

上面代码有以下知识点:

each函数调用的圆括号不见了!

原来。Groovy中,当函数的最后一个參数是闭包的话,能够省略圆括号。比方

deftestClosure(int a1,String b1, Closure closure){

//dosomething

closure() //调用闭包

}

那么调用的时候,就能够免括号!

testClosure4, "test", {

println"i am in closure"

}

開始你的Gradle构建和编程之旅吧~~

很多其它的嵌入式linux和android、物联网、汽车自己主动驾驶等领域原创技术分享请关注微信公众号:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border: none; max-width: 100%; font-family: 'Microsoft YaHei'; line-height: 25.984375px; text-align: center;" />

从编程的角度理解gradle脚本﹘﹘Android Studio脚本构建和编程[魅族Degao]的更多相关文章

  1. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  2. 机器学习:从编程的角度理解BP神经网络

    1.简介(只是简单介绍下理论内容帮助理解下面的代码,如果自己写代码实现此理论不够) 1) BP神经网络是一种多层网络算法,其核心是反向传播误差,即: 使用梯度下降法(或其他算法),通过反向传播来不断调 ...

  3. Android Studio的构建系统:Gradle

    原文作者:youxiachai <用Gradle 构建你的android程序> 前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android st ...

  4. gradle与android studio 关系及gradle配置

    前言 我们一般开发android 使用android studio ,android studio 安装的时候,会帮我们做两件事,配置好自己的jdk. 实际上,使用的其实不是我们在path中配置的jd ...

  5. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...

  6. Android Studio项目构建常见问题解决

    1. 创建或导入项目后编译时一直在等待 问题: 原因:AS连网去下载gradle了,但是网络不好或不通 解决:禁用网络,AS就会立即自动终止下载进入到主界面了.此时再去指定离线的gradle版本进行编 ...

  7. android studio学习----构建编译

    项目创建成功后会自动下载Gradle,这个过程特别慢,建议翻墙.下载的Gradle在Windows平台会默认在 C:\Documents and Settings\<用户名>.gradle ...

  8. android studio学习----构建(gradle )依赖时使用动态依赖的问题

    今天在看Dan Lew大神的博客发现最新的文章就是 “Don't use dynamic versions for your dependencies” Everyone, please, to st ...

  9. gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)

    近期一直在做android自己主动打包,之前已经完毕了用纯命令行的形式打包.原生态ant脚本打包.和基于android的SDK的打包.而且实现了多渠道打包,后来同事推荐了gradle,网上的资料说gr ...

随机推荐

  1. js点击特效

    //点击效果博客页面点击就可以看到 <script type="text/javascript"> !function(e, t, a) { function n() ...

  2. JVM命令参数指南

    1.调整最大堆内存 -Xmx 8192m 2.调整最小堆内存-Xmx 8192m3.设置虚拟机垃圾回收机制-XX:+UseG1GC4.收集垃圾日志信息-Xloggc:/D:gc.log5.OOM异常之 ...

  3. python 实现线程之间的通信

    前言:因为GIL的限制,python的线程是无法真正意义上并行的.相对于异步编程,其性能可以说不是一个等量级的.为什么我们还要学习多线程编程呢,虽然说异步编程好处多,但编程也较为复杂,逻辑不容易理解, ...

  4. [DP专题]悬线法

    参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p27 ...

  5. Elasticsearch之批量操作bulk

    1.bulk相当于数据库里的bash操作. 2.引入批量操作bulk,提高工作效率,你想啊,一批一批添加与一条一条添加,谁快? 3.bulk API可以帮助我们同时执行多个请求 4.bulk的格式: ...

  6. Redis学习笔记(二)-key相关命令

    Redis支持的各种数据类型包括string,list ,set ,sorted set 和hash . Redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符 ...

  7. Lua eval实现

    因为loadstring总是在全局环境中编译它的串,所以编译出的函数访问的变量是全局变量.为了避免污染全局环境我们需要用setfenv修改函数的环境 function eval(equation, v ...

  8. css选择器的综合使用

    代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...

  9. java编译器和java解释器、JVM

    作用: JVM:JVM有自己完善的硬件架构,如处理器.堆栈(Stack).寄存器等,还具有相应的指令系统(字节码就是一种指令格式).JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成 ...

  10. dubbo之负载均衡

    在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用. Random LoadBalance 随机,按权重设置随机概率. 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按 ...