Android R класс недоступен при обработке аннотации с Android Gradle плагин 3.6.2 - PullRequest
4 голосов
/ 10 апреля 2020

У меня есть библиотека, которая использует обработку аннотаций для создания API для получения ресурсов здесь:

https://github.com/Comcast/resourceprovider

Я только что обновил плагин Gradle android из 3.2.1–3.6.2, и вдруг класс R не обнаруживается во время раундов обработки аннотаций.

Код для поиска класса R находится в функции процесса:

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    for (Element annotatedElement : roundEnv.getElementsAnnotatedWith(RpApplication.class)) {

        // annotation is only allowed on classes, so we can safely cast here
        TypeElement annotatedClass = (TypeElement) annotatedElement;
        if (!isValidClass(annotatedClass)) {
            continue;
        }

        try {
            List<String> rStringVars = new ArrayList<>();
            List<String> rPluralVars = new ArrayList<>();
            List<String> rDrawableVars = new ArrayList<>();
            List<String> rDimenVars = new ArrayList<>();
            List<String> rIntegerVars = new ArrayList<>();
            List<String> rColorVars = new ArrayList<>();
            List<String> rIdVars = new ArrayList<>();

            //lame.  this assumes that the application class is at the top level.  find a better way.
            String packageName = getPackageName(processingEnv.getElementUtils(), annotatedClass);
            String rClassName = packageName + R_CLASS_IDENTIFIER;

            boolean generateIdProvider = annotatedElement.getAnnotation(RpApplication.class).generateIdProvider();
            boolean generateStringProvider = annotatedElement.getAnnotation(RpApplication.class).generateStringProvider();
            boolean generateColorProvider = annotatedElement.getAnnotation(RpApplication.class).generateColorProvider();
            boolean generateDrawableProvider = annotatedElement.getAnnotation(RpApplication.class).generateDrawableProvider();
            boolean generateIntegerProvider = annotatedElement.getAnnotation(RpApplication.class).generateIntegerProvider();
            boolean generateDimensionProvider = annotatedElement.getAnnotation(RpApplication.class).generateDimensionProvider();
            roundEnv.getRootElements().stream().filter(element -> element instanceof TypeElement).forEach(element -> {
                TypeElement typeElement = (TypeElement) element;
                if (typeElement.getQualifiedName().toString().equals(rClassName)) {......}

И я никогда не попаду в этот блок. Все отлично работает с Android Gradle Plugin 3.5.0.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 20 апреля 2020

Как указано в выпуске: https://issuetracker.google.com/issues/153964091

временно, мы можем использовать android.generateRJava=true для принудительной генерации класса R. Однако это будет удалено в AGP 4.1

...