虽然你们都写了不少年的安卓了,我以前一直都有对于build.gradle
有点疑惑和不解(这部分其实已经没有了)。就好比为啥android
叫android
?还有dependencies
是啥?apply form
和apply plugin
有什么区别。html
仍是先说下Groovy
吧,仍是老生常谈我并不喜欢我Groovy
,可是有时候我以为Groovy
也仍是很是不错的。java
Groovy是Java虚拟机的敏捷和动态语言,以Java语言的优点为基础,添加了从Python、Ruby和Smalltalk等语言中借鉴的特性。提供流行的编程语言特性,学习成本几乎为零。提供静态类型检查的能力,并静态地编译成java字节码,以得到健壮性和性能,与全部现有的Java类和库无缝集成,能够在任何可使用java的地方使用它。经过其强大的处理原语、OO能力和Ant DSL使编写shell和构建脚本变得容易。在开发Web,GUI,数据库或控制台程序时经过减小框架性的代码大大提升了开发者的效率。支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让代码变得易于阅读和维护。而且支持单元测试,能够简化测试。android
build.gradle
和咱们的编译息息相关,并且编译相关的对于一个安卓开发其实仍是很是重要,并且也是息息相关的。Groovy
的动态化也是有取舍的,下面我略列下我在开发过程当中碰到的问题吧。shell
在写Gradle脚本的时候,最痛苦的莫过于没有任何提示,惟一的调试手段就是使用print方法打印调试日志。若是咱们能使用Kotlin
编写Gradle
脚本的时候,你会发现一切都变得有趣起来,嘴角开始微微上扬。数据库
Gradle Kotlin DSL 1.0 Gradle
官方其实在18年末就已经正式发布了kts
的第一个版本了。那么话很少,为何咱们不试试呢。编程
要安利你们学新东西那么就最好先给你们一点甜头,我有糖尿病我先来滋醒你们。api
kts
内全部都是基于kotlin代码规范的,因此强类型语言的好处就是编译没经过的状况下,你根本没法运行。Groovy
的block
其实在kts都是由拓展函数实现的,因此咱们能直接看到传入的类是什么,以及这个类有哪些参数以及方法。举个例子Android
的block
块内的参数我就都能看懂了。kts
能和gradle
能同时编译,这样就可让新的东西往新的架构上迁移,而旧的那部分就能够不动了,这样岂不是美滋滋。咱们先来对比下两个基本内容相同的配置文件吧。markdown
第一个是我截取的kts
相关的,第二个则是我之前的一个项目采用的仍是build.gradle
。从第一眼的影像中,咱们能够简单的比对出kts
相关的代码提示上真的就会好不少。架构
举个例子各位大佬之前知道com.android.library
中的android
所表明的Extension
究竟是什么吗?那么和com.android.application
下的有什么不一样吗?我想知道他们的源代码在哪里怎么办?app
灵魂三问以后我想问下各位有没有啥本身的见解哦,起码我在以前就算使用remote
调试插件的时候,我也是靠猜想的方式去定位android
所表明的Extension
的。因此我在这边想要的出来的结论就是,若是你对安卓的编译感兴趣的状况下,能够先试试从kts
开始反向推倒下每一个字段所表明的含义是什么?
从kts
中,我发现com.android.application
下的android
的Extension
是BaseAppModuleExtension
,咱们全部定义的子属性其实都是在这个实体类上的拓展而已,而com.android.library
中的则是另一个实现类LibraryExtension
,相对而言他的字段属性就会更少一点,有兴趣的大佬能够自行跟踪翻查源代码。
虽然我在使用kts
以前就知道了,由于自定义plugin
的时候也会有对这部分的操做和使用。能够参考下逮虾户X,哈哈哈。
这部份内容其实在你编写自定义Plugin的时候仍是有很大几率会使用到的,好比你的插件能够根据applicationId
进行不一样的代码生成变化。
这里我小展开下,你们不知道有没有想过implementation
内的exclude
和禁止依赖传递的transitive
究竟是什么?
这里我就给你们买个关子,有兴趣的大佬能够转化下kts
,本身跟踪路径,看看其中到底都是些什么东西啊。
可是kts
必定就比gradle
好吗?我我的见解并非啊,在最新的as中,其实对于gradle
的源码跟踪其实就已经很是不错了。还有就是相比较而言,由于groovy
是一门动态化语言,因此其中的类型判断也更为简单,并且groovy
中的MethodMissing
这个机制,能够帮助咱们动态调用不少隐藏的api。
可是偏偏也就是由于这些对应的机制,有时候也会让开发无从入手,由于也不是别的啥,就是菜看不懂呀!!而kts
则有一个更有优点的地方就是代码提示了!!!
还有一点就是kts
,对于ext
的支持简直堪称地狱,若是你有定义在全局的相似dep
配置相关的,这部分改动真的可能要了你的老命。
这部分是真的彻底比不上groovy
,若是有除了用buildSrc
这种方式解决了的大佬,能够告诉我下,让我学习一下啊!!!
我最近的感受就是开发仍是能够多尝试一些新鲜的东西的,特别是这种东西若是不会破坏当前既有结构,并且能完美并存的东西,其实均可以去尝试下。
毕竟如今这个状况吧,你比别人多会一点相对来讲仍是有些好处的。并且我我的见解就是稍微多掌握点这个能帮助各位老哥更好的了解和学习编译流程相关的内容。
另外事先声明,今天这篇文章吧,我以为也就是一篇水文,就是给你们安利下我以为有意思的东西,并无实际太多的干货内容。