9

我写了以下注释:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.METHOD})
public @interface Warning {

}

它旨在注释如果不小心调用可能会导致问题的方法。我在我的项目中添加了一个注释处理器,但这仅在 javac 命令的日志输出中提供警告。我希望此警告与其他 lint 警告一起出现在 Android Studio 中,只要调用具有此注释的方法即可。这就是我尝试编写自定义 lint 规则的原因。我有 lint 规则的基本框架:

import com.android.tools.lint.detector.api.Category;
import com.android.tools.lint.detector.api.Detector;
import com.android.tools.lint.detector.api.Implementation;
import com.android.tools.lint.detector.api.Issue;
import com.android.tools.lint.detector.api.Scope;
import com.android.tools.lint.detector.api.Severity;

public class CaimitoDetector extends Detector implements Detector.JavaScanner {

  public static final Issue ISSUE = Issue.create(
      "WarningAnnotation",
      "This method has been annotated with @Warning",
      "This method has special conditions surrounding it's use, be careful when using it and refer to its documentation.",
      Category.USABILITY, 7, Severity.WARNING,
      new Implementation(CaimitoDetector.class, Scope.JAVA_FILE_SCOPE));

  @Override
  public void visitMethod(JavaContext context, AstVisitor visitor, MethodInvocation node) {

  }

}

import com.android.tools.lint.client.api.IssueRegistry;
import com.android.tools.lint.detector.api.Issue;

import java.util.Collections;
import java.util.List;

public class CaimitoIssueRegistry extends IssueRegistry {

  @Override
  public List<Issue> getIssues() {
    return Collections.singletonList(CaimitoDetector.ISSUE);
  }

}

但我不知道如何从这里开始。如何检查方法上是否存在注释,并发出警告以使其在 Android Studio 中可见?

4

1 回答 1

2

但我不知道如何从这里开始

我建议你Detector先写一个测试。这是一个示例项目,它演示了如何编写Detector测试 [1]。这样您就可以Detector根据自己的喜好尝试和调整。

如何检查方法上是否存在注释

我建议看看 Android 的默认检测器 [2]。在那里你很可能会找到一个好的起点。例如AnnotationDetector.

并发出警告,使其在 Android Studio 中可见?

如果您将自定义规则正确集成到项目中,Lint 将为您发出警告。请在此处查看 [3] 以了解有关如何在项目中集成自定义规则的不同选项。注意:自定义规则的 AFAIK 警告只会在运行相应的 Gradle 任务时报告。Android Studio 的“自动突出显示”不适用于自定义规则。

  1. https://github.com/a11n/CustomLintRules
  2. https://android.googlesource.com/platform/tools/base/+/master/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks
  3. https://github.com/a11n/android-lint/tree/master/6_application
于 2016-10-19T16:00:47.143 回答