蜂信物联FastBee平台https://gitee.com/beecue/fastbee
阿里资料开源项目https://gitee.com/vip204888
百度低代码前端框架https://gitee.com/baidu/amis
OpenHarmony开源项目https://gitcode.com/openharmony
仓颉编程语言开放项目https://gitcode.com/Cangjie
上面这段代码定义了两个task,当我们执行hello
任务的时候,会输出 hello
,而执行world
任务的时候,由于声明了dependsOn: "hello"
,表示world
依赖hello
,会先执行hello,再执行world。
task xxx << {
}
这样的语法等价于
task xxx
xxx.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.key
if (Boolean.valueOf(entry.value)) {
def file = new File(rootProject.projectDir.parent, “/
m
o
d
u
l
e
N
a
m
e
.
r
e
p
l
a
c
e
(
"
W
"
,
"
"
)
/
{moduleName.replace("\\W", "")}/
moduleName.replace("W","")/{moduleName.toLowerCase()}”)
if (file.exists()) {
include “:
m
o
d
u
l
e
N
a
m
e
.
t
o
L
o
w
e
r
C
a
s
e
(
)
"
p
r
o
j
e
c
t
(
"
:
{moduleName.toLowerCase()}" project(":
moduleName.toLowerCase()"project(":{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 不只是有常用的group
、name
、version
,还包括不常用的configuration
、classifier
等等。
再看Task
Groovy 是基于 Java 的,只不过在这基础上加了一大堆的闭包,来帮助更方便的开发构建脚本。如果你不会 Groovy,没关系,当成 Java 写就行了,其实当成 Kotlin 写是最恰当的。如果你还不会 Kotlin,我强烈推荐你查看我的 【 Kotlin Primer 】系列文章
每个Task都可以配置其输入与输出,如果一个Task的输出与上一次的输出一致,则不会重复执行。此刻,会在命令行中输出UP-TO-DATE
表示已经是最新的结果。
例如如下Task:
task transform {
ext.srcFile = file(‘hello.txt’)
ext.destDir = new File(buildDir, ‘generated’)
inputs.file srcFile
outputs.dir destDir
doLast {
destDir.mkdirs()
def ins = new BufferedReader(new FileReader(srcFile))
def stringBuilder = new StringBuilder()
def temp
while ((temp = ins.readLine()) != null) {
stringBuilder.append(temp)
}
def destFile = new File(destDir, “world.txt”)
destFile.text = stringBuilder.toString()
}
}
重复执行后会输出UP-TO-DATE
骚操作的背后
学习任何一门技术,最快的途径就是看源码,gradle
的源码位于src
目录中,例如在我本机的路径为:
/Users/zhangtao/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3/src
本地新建一个普通Java工程,导入源码查看代码与注释,这是最好的学习资料。
task hello
在 Groovy 中,方法括号可以省略,如果字符串的类型是可以被推断的,那么引号也可以省略
public interface org.gradle.api.Project{
Task task(String name);
Task task(String name, Closure configureClosure);
}
// TaskFactory
public TaskInternal createTask(Map<String, ?> args) {
}
闭包的存在,目的是为了更好的为对象初始化。同 Kotlin 一样,当闭包做为最后一个参数的时候,可以省略括号。
Copy a = task(myCopy, type: Copy)
总结
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
,包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
[外链图片转存中…(img-RfYwBHxi-1725124583904)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。