《从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 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