当我为Lint实现自定义检测器时,如何调试java源代码?

2022-09-02 03:37:27

我是一名安卓开发者。我已经通过实现新的XXXDetector和XXXIssueRegistry来设计自己的lint规则,这是我的源代码片段:

我的 XXXIssueRegistry 文件:

public class MyIssueRegistry extends IssueRegistry {
  @Override
  public List<Issue> getIssues() {

    System.out.println("!!!!!!!!!!!!! ljf MyIssueRegistry lint rules works");
    return Arrays.asList(AttrPrefixDetector.ISSUE,
            LoggerUsageDetector.ISSUE);
  }
}

我的 XXXDetector 文件:

public class LoggerUsageDetector extends Detector
    implements Detector.ClassScanner {
public static final Issue ISSUE = Issue.create("LogUtilsNotUsed",
        "You must use our `LogUtils`",
        "Logging should be avoided in production for security and performance reasons. Therefore, we created a LogUtils that wraps all our calls to Logger and disable them for release flavor.",
        Category.MESSAGES,
        9,
        Severity.ERROR,
        new Implementation(LoggerUsageDetector.class,
                Scope.CLASS_FILE_SCOPE));

@Override
public List<String> getApplicableCallNames() {
    return Arrays.asList("v", "d", "i", "w", "e", "wtf");
}

@Override
public List<String> getApplicableMethodNames() {
    return Arrays.asList("v", "d", "i", "w", "e", "wtf");
}

@Override
public void checkCall(@NonNull ClassContext context,
                      @NonNull ClassNode classNode,
                      @NonNull MethodNode method,
                      @NonNull MethodInsnNode call) {
    String owner = call.owner;
    if (owner.startsWith("android/util/Log")) {
        context.report(ISSUE,
                method,
                call,
                context.getLocation(call),
                "You must use our `LogUtils`");
    }
}
}

现在我可以通过runnig命令运行我的自定义lint规则:

$gradle lint

我将像在控制台中预期的那样获得输出消息。

但是我想调试我的XXXDetector源文件。我该怎么做?如果我单击“调试”或“运行”或“构建”,我的自定义lint规则将不会运行!所以我必须在不支持调试的控制台中运行它。我该如何解决这个问题?


答案 1

要调试自定义 lint 检查,您需要运行带有参数的 Gradle lint 任务,例如:-Dorg.gradle.debug=true

./gradlew --no-daemon -Dorg.gradle.debug=true lintDebug

Gradle 将停止执行,直到附加调试器。

将调试器附加到本地进程:

Attach to local process

并选择相应的 Java 进程:

Select process

附加调试器后,Gradle 将继续执行,您将能够调试自定义 lint 规则:

Debugger window


答案 2

以下是在 AndroidStudio 中调试 lint 规则的方法:

点击Edit configurations... edit configurations

添加新的运行配置“gradle”:

add configuration

然后,选择您的项目并输入任务(这是为我准备的,因为我有多个不同的调试版本变体,其中一个称为)。lintDebuglintLiveDebugliveDebug

enter image description here

现在,只需单击调试按钮即可启动此配置,就像您习惯的那样。这对我来说非常有效。

我还可以建议为您的lint代码创建一个测试套件,以加快开发周期和调试。


推荐