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

这篇博客探讨了Android Lint在使用lombok-ast进行AST解析时遇到的内存占用过大的问题,特别是对于大型项目容易导致OOM。问题根源在于ECJ编译器要求源码以char[]格式输入,而Lint使用String存储源码,导致内存复制。Google在Lint 25.3.0中通过使用CharSequence接口修复了这个问题,减少了内存占用。建议使用基于lombok-ast的Lint规则时升级到25.3.0以上版本。
摘要由CSDN通过智能技术生成

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

1.3、内存占用过大

lombok-ast的第三个大问题是内存占用。由于现在的Lint只能从gradle里运行,当运行gradle lint时,如果Android项目较大,时常会在扫描中出现OOM。而且项目规模越大,出现OOM的可能性越高。不少人基于自己过往的经验,认为是gradle造成的,毕竟gradle也是个吃内存大户,但是即便修改gradle properties试图提高可分配内存上限,作用还是有限,OOM依旧层出不穷。

那么问题究竟在哪里?其实就出在lombok-ast上,说的更准确点,是它所依赖的ECJ编译器上。前文说过,Lint是使用lombok-ast来进行AST分析,而lombok-ast又是封装了ECJ的AST Parser,它们的关系如下图。
Lint-lombok-ECJ关系

为简化分析,以Lint 25.0.0代码为例(25.2.0加入了PSI,流程更加复杂),其工作流程是:(此处省略无关流程,只述重点)
(1)LintDriver启动扫描
LintDriver#analyze() -> LintDriver#checkProject() -> LintDriver#runFileDetectors() -> LintDriver#checkIndividualJavaFiles() / LintDriver#checkJava()

package com.android.tools.lint.client.api;

public class LintDriver {
   
    private void checkIndividualJavaFiles(
            @NonNull Project project,
            @Nullable Project main,
            @NonNull List<Detector> checks,
            @NonNull List<File> files) {
        JavaParser javaParser = mClient.getJavaParser(project);
        if (javaParser == null) {
            mClient.log(null, "No java parser provided to lint: not running Java checks");
            return;
        }
        ......
    }
}

(2)生成JavaParser
在Lint

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值