从lombok到UAST – 浅谈Android Lint的AST Parser(1)

本文介绍了Android Lint的静态代码扫描工具,重点讨论了其从lombok-ast到UAST(Unified AST)的AST Parser演变过程。lombok-ast因对Java语言支持有限,不支持类型解析等问题,逐渐被IntelliJ的PSI取代。然而,Lint最终选择了UAST作为新的AST解析器,以应对更复杂的代码分析需求。
摘要由CSDN通过智能技术生成

自从ADT 16第一次引入Android Lint(以下简称:Lint)以来,Lint便成为Android平台上最重要的静态代码扫描工具。与早期基于XPath的静态扫描工具不同,Lint基于AST(Abstract Syntax Tree)进行分析,可以用来定制很复杂的扫描规则。

关于Lint的介绍,网上已有很多文章可参考。关于Lint规则的定制,也是个复杂的话题,这里不展开。本文着眼点在于Lint使用的AST Parser,这是整个静态扫描最核心的部分。

Lint从第一个版本就选择了lombok-ast作为自己的AST Parser,并且用了很久。但是Java语言本身在不断更新,Android也在不断迭代出新,lombok-ast慢慢跟不上发展,所以Lint在25.2.0版增加了IntelliJ的PSI(Program Structure Interface)作为新的AST Parser。但是PSI于IntelliJ、于Lint也只是个过渡性方案,事实上IntelliJ早已开始了新一代AST Parser,UAST(Unified AST)的开发,而Lint也将于即将发布的25.4.0版中将PSI更新为UAST。

因为Lint发布时间较久,已有很多研发人员基于lombok-ast开发了大量定制规则,出于兼容目的,Lint一直到现在都还保留着lombok-ast,也就是说,从25.2.0之后,一直是新旧两套AST Parser并存。我们现在就来看一看这个变迁的过程。

1、lombok-ast

说起Project lombok,这也是Java世界里一个很经典的项目了。通过一组强大的annotation,它可以在编译时修改编译器前端生成的AST,最终生成符合JVM规范的字节码。可以简单地理解为,lombok的annotation,实际上创造了一个语法简化版的Java语言,帮助提升开发效率,lombok会在编译阶段将这种简化的语言翻译成真正的Java,保证其兼容性。

lombok从一开始就同时支持两大主流Java编译器,javac和ECJ(Eclipse Compiler for Java)。这两个编译器虽然都可以生成符合JVM规范的字节码,但它们的实现是完全不同的。这使得lombok团队不得不建立了一个子工程lombok-ast,专门用于封装特定编译器的AST实现细节。也正是由于它的编译器无关特性,Lint选择了这个模块。

lombok-ast虽然功能很强,但是到今天它越来越不够用了,具体地说,有这么几个缺点:

1.1、对Java语言只支持到Java 6

lombok-ast的更新维护太慢了,它对Java语言的支持只能完美支持到Java 6 …… 对于Java 7、Java 8的新特性,根本不支持 …… 可是我们都看到,Android从4.4就开始支持Java 7了,从6.0开始支持Java 8,如果你装了Android Studio >= 2.1和SDK >= 24,开发目标版本较低的应用一样可以用某些Java 8特性。眼看Java 9就要发布了,lombok-ast还只支持到Java 6 ……

例如Java 8里一个大家喜闻乐见的新特性,lambda表达式

public void demoThreadUseLambda() {
    new Thread(() -> {
        System.out.println("Thread running ......");
    }).start();
}

lombok-ast是不支持的,如果你试图自己写个Lint规则,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值