20分钟Android Gradle,android视频开发的面试问题
task xxx << {
}
这样的语法等价于
task xxx
xxx.dolast {
}
你可以在任意位置新建一个名为build.gradle
的文本,来练习上面讲述的task
定义与依赖。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9rCa6pLz-1614069914710)(https://upload-images.jianshu.io/upload_images/24944255-70205e09a71a2008.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]
接着讲 Project
Android
│
├──app
│ └──build.gradle
│
├──library
│ └──build.gradle
│
├──*.properties
│
├──build.gradle
│
└──setting.gradle
一个 Android 工程,通常是由上述结构构成,其中有着许多不为人知的巧妙用法。
setting.gradle文件
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 “😒{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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-anX3yhqH-1614069914713)(https://upload-images.jianshu.io/upload_images/24944255-3ccaccbe182a0591.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]
骚操作的背后
学习任何一门技术,最快的途径就是看源码,gradle
的源码位于src
目录中,例如在我本机的路径为:
/Users/zhangtao/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3/src
本地新建一个普通Java工程,导入源码查看代码与注释,这是最好的学习资料
《Android学习笔记总结 最新移动架构视频 大厂安卓面试真题 项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整资料开源分享
。
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)
a.from ‘resources’
a.into ‘target’
a.include(’/*.txt’, '/.xml’, '**/.properties’)
等价于
task myCopy(type: Copy)
myCopy {
from ‘resources’
into ‘target’
include(’/*.txt’, '/.xml’, '**/.properties’)
}
本章就讲到这里,下一篇讲如何创建一个Gradle插件,完成编译时向指定类或新生成类中动态添加代码(包括jar包中)。
往期回顾:
======================================================================
- 谷歌超全Kotlin学习王炸笔记!Kotlin入门到精通 高级Kotlin强化实战(附Demo)
- 阿里巴巴内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
- 大佬就是强,字节跳动高工熬夜半月整理的“组件化实战学习手册”,全是精髓!
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfgaeg
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01