Аннотации поддержки Android @StringDef не работает при экспорте в файл .aar

У меня проблемы с аннотациями поддержки @StringDef. Они отлично работают, когда библиотека, в которой они находятся, является частью проекта (а не файлом .aar), но когда я компилирую библиотеку как файлы .aar и пытаюсь использовать их в другом проекте, аннотации не применяются.

http://tools.android.com/tech-docs/support-annotations

В разделе «Использование аннотаций в ваших собственных библиотеках» сказано:

Если вы аннотируете свои собственные библиотеки этими аннотациями и используете Gradle для создания артефакта AAR, во время сборки плагин Android Gradle извлечет информацию аннотации и отправит ее в ваш файл AAR для использования клиентами вашей библиотеки. Вы можете посмотреть файл annotations.zip внутри AAR, где записана информация; это использует формат XML внешних аннотаций IntelliJ. Это необходимо, потому что файлы .class не могут содержать достаточно информации об аннотациях для обработки указанной выше информации @IntDef; обратите внимание, что нам нужно записать ссылку на саму константу, а не на ее значение. Плагин Android Gradle будет запускать задачу извлечения аннотаций как часть сборки, если (и только если) ваш проект зависит от библиотеки поддержки аннотаций. (Обратите внимание, что в файл .aar помещаются только аннотации об удержании исходного кода; удержания на уровне класса хранятся в classes.jar.)

Я открыл файл .aar, и внутри него есть файл annotations.zip, и если я его извлечу, там будет XML-файл, содержащий все правильные аннотации.

Я использую @Retention(RetentionPolicy.SOURCE), поскольку он говорит, что мне нужно

Приложение, которое я пытаюсь использовать в качестве файлов .aar, действительно зависит от библиотеки поддержки compile 'com.android.support:support-annotations:23.1.1

Что мне не хватает, чтобы эти работы работали?

Изменить: я дважды проверил, что в проекте, использующем их как файлы .aar, также включен процессор аннотаций.


person Ben987654    schedule 23.02.2016    source источник
comment
Что вы имеете в виду, когда аннотации не применяются?   -  person Gabriele Mariotti    schedule 23.02.2016
comment
Когда я использую метод с аннотацией, и я не использую аннотированное значение, он должен пометить его красным и помешать мне компилировать. НАПРИМЕР. Привет против SomeClass.HELLO_CONSTANT. Работает, когда библиотека скомпилирована непосредственно в проект, но не при использовании в качестве файлов .aar.   -  person Ben987654    schedule 23.02.2016
comment
Пример изображения того, как он должен выглядеть, если было использовано неправильное значение - 0d9321c1-a-db1c6dfe-s-sites.googlegroups.com/a/android.com /   -  person Ben987654    schedule 23.02.2016


Ответы (2)


Проблема заключалась в том, что интерфейсы были частными.

По какой-то причине частный интерфейс работает правильно, когда проект библиотеки компилируется основным проектом в качестве подмодуля.

Когда проект библиотеки используется как файл .aar, частный интерфейс больше не работает.

person Ben987654    schedule 01.03.2016
comment
У меня такая же проблема ... вы определили свой public @interface YourTypeDef {} в отдельном java файле? Или вы создали класс для инкапсуляции реализации typedef аннотации? - person Sakiboy; 03.03.2018

Как упоминалось здесь, информация о константах, используемых как @StringDef Значения / @ IntDef будут потеряны после компиляции в файл aar. Остается только значения констант.

Аннотации @IntDef не могут быть сохранением класса, потому что то, что им нужно записать (какие константы действительны), не может быть выражено в файле .class - единственные данные, хранящиеся там для аннотации, - это значение константы, а не какой-то указатель на саму константу.

person tcrondo    schedule 02.12.2016
comment
Хорошо, но именно поэтому .aar содержит файл с именем annotations.zip. Внутри находится .xml файл, который кодирует информацию обо всех определениях типов. - person Jameson; 26.04.2019