写点什么

20 分钟掌握 Android-Gradle,移动开发专业

作者:嘟嘟侠客
  • 2021 年 11 月 27 日
  • 本文字数:2353 字

    阅读完需:约 8 分钟

例如我们新建一个 Android 工程,在其根目录中输入:


gradle tasks -q


可以看到如下输出(你可能需要事先配置 gradle 的环境变量,或也可使用./gradlew替代):



根据上图可以看到当前工程中的每条task都已罗列出,并且有黄色的输出表示当前task的描述。其中-q表示忽略gradle本身的log信息,加上这个参数可以屏蔽很多无关的输出,不加也不会影响执行。

Task 声明格式

声明一个 task 只需要在任务名前面加上task就可以了,例如下面声明了一个hello的 Task。


task hello


通常我们会给 task 附带一些执行动作,称之为Action,例如


hello.doFirst{println "hello first"}


hello.doLast{println "hello last"}


也可以附带一个闭包配置,称之为Configuration,闭包中不仅可用做赋值操作,也可以执行一些自动执行的配置。


hello {println "hello"}

Task 依赖

单独声明一个task在实际开发中几乎不会有任何的意义,更多的时候是让多个task组合起来,一个依赖另一个,形成一连串的任务集。


task hello


hello.doFirst{println "hello "}


task world(dependsOn: "hello") << {println "world"}


上面这段代码定义了两个 task,当我们执行hello任务的时候,会输出?hello,而执行world任务的时候,由于声明了dependsOn: "hello",表示world依赖hello,会先执行 hello,再执行 world。


task xxx << {}


这样的语法等价于


task xxxxxx.dolast {}


你可以在任意位置新建一个名为build.gradle的文本,来练习上面讲述的task定义与依赖。


接着讲 Project

Android│├──app│ └──build.gradle│├──library│ └──build.gradle│├──*.properties│├──build.gradle│└──setting.gradle


一个 Android 工程,通常是由上述结构构成,其中有着许多不为人知的巧妙用法。

setting.gradle 文件

关于setting.gradle中也可以写代码,是很多人不知道的。如下代码是我在上一篇文章【企业级 Android 模块化平台设计建议】中讲到的一个例子,在setting.gradle文件中,可以指定一个project位置,这里就可以将一个外部工程中的模块导入到 APP 工程中了。


getLocalProperties().entrySet().each { entry ->def moduleName = entry.keyif (Boolean.valueOf(entry.value)) {def file = new File(rootProject.projectDir.parent, "/{moduleName.toLowerCase()}")if (file.exists()) {include ":{moduleName.toLowerCase()}").projectDir = file}}}

build.gradle

一个项目的根 gradle 文件,用于描述这个项目的统一资源,其中包括各子资源的使用方式、插件的依赖环境等等。


subprojects{apply plugin: 'com.android.library'dependencies {compile 'com.xxx.xxx:xxx:1.0.0'}}


通常我们在每个模块都会引用的 aar 的时候,都会在每个模块里面都去手动的compile一遍,例如support包。 但实际上有一个非常简单的办法,写一遍就可以了,就是在项目的根gradle文件中的subprojects闭包中声明这个dependencies


通常在写compile依赖的时候,我们都会写成这样:


compile 'com.android.support:appcompat-v7:25.0.0'


其实在gradle中,这是一个方法调用,它的本质是compile()方法传入了一个map参数,因此完整的写法实际上是这样的:


compile group: 'com.android.support' name:'appcompat-v7' version:'25.0.0'


同时,map 的可使用 key 不只是有常用的groupnameversion,还包括不常用的configurationclassifier等等。

再看 Task

Groovy 是基于 Java 的,只不过在这基础上加了一大堆的闭包,来帮助更方便的开发构建脚本。如果你不会 Groovy,没关系,当成 Java 写就行了,其实当成 Kotlin 写是最恰当的。如果你还不会 Kotlin,我强烈推荐你查看我的 【?Kotlin Primer?】系列文章


每个 Task 都可以配


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


置其输入与输出,如果一个 Task 的输出与上一次的输出一致,则不会重复执行。此刻,会在命令行中输出UP-TO-DATE表示已经是最新的结果。例如如下 Task:


task transform {ext.srcFile = file('hello.txt')ext.destDir = new File(buildDir, 'generated')inputs.file srcFileoutputs.dir destDirdoLast {destDir.mkdirs()def ins = new BufferedReader(new FileReader(srcFile))def stringBuilder = new StringBuilder()def tempwhile ((temp = ins.readLine()) != null) {stringBuilder.append(temp)}def destFile = new File(destDir, "world.txt")

建议

当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。


  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!

  • 准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历

  • 我希望每一个努力生活的 it 工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

  • 有什么问题想交流,欢迎给我私信,欢迎评论

【附】相关架构及资料



内含往期 Android 高级架构资料、源码、笔记、视频。高级 UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter 全方面的 Android 进阶实践技术


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
20分钟掌握Android-Gradle,移动开发专业