Это очень интересный вопрос, но я не думаю, что вы могли бы решить такую задачу с помощью процессора аннотаций, поскольку они работают на уровне генерации кода Kotlin/Java.
Как бы вы аннотировали XML @Something
, чтобы он по-прежнему оставался действительным XML?
Взгляните на это:
KoltinConf18 — обработка аннотаций в Kotlin
![Скриншот из записи выступления на youtube](https://i.stack.imgur.com/huzyR.png)
В 7:18 Зак переходит к обработке аннотаций в Java, и в основном он говорит:
- Происходит во время компиляции
- И вы не можете изменить код, просто сгенерируйте больше
Таким образом, используя простую обработку аннотаций, вы не можете изменить уже существующий файл AndroidManifest.xml
.
Альтернативой может быть написание плагина Gradle, который генерирует эти биты XML и объединяет их с текущим файлом XML, который уже существует в проекте.
Что-то из макушки моей головы может быть:
- Создайте аннотацию и отметьте все действия, которые вы хотите ввести в этот фрагмент кода.
- На стороне плагина; когда вы пишете задачу Gradle; вы можете использовать отражение и выяснить, какие классы аннотированы таким расширением. Или просто заставьте программиста поместить эти действия в определенный каталог внутри исходной папки, что было бы намного проще
- С полными именами классов вы можете просмотреть узлы
<activity>
в AndroidManifest.xml
, отфильтровать имена классов, которые не соответствуют списку аннотированных имен классов.
- Измените эти узлы фрагментом кода, который вы хотите внедрить.
Чтобы приступить к написанию подключаемого модуля Gradle, посмотрите здесь
Простым примером для начала может быть:
Шаг 1
Вы создаете отдельный модуль для написания своего плагина, если он становится слишком громоздким, но для этого простого примера я решил поместить его прямо в файл build.gradle.kts
. Это не обязательно должен быть файл kotlin Gradle, но я лучше разбираюсь в Kotlin, чем в Groovy :)
а>
Как видите, я создал текст testFile.txt
в корне проекта.
В коде я просто перехожу к нему и читаю его; распечатайте его содержимое, а затем измените его.
Вы можете сделать то же самое со своим AndroidManifes.xml
. Затем вам нужно будет рекурсивно перебирать исходные файлы из вашего srcDir
в поисках всех этих действий, аннотированных вашей специальной аннотацией, и сохранять все полные имена классов внутри файла List<String>
. Затем выполните необходимые замены внутри AndroidManifest
Обратите внимание, что с этой базовой конфигурацией задача Gradle появляется на вкладке Gradle внутри категории others
, чтобы изменить это, немного выйдя за рамки обработки аннотаций.
Шаг 2, прибыль
а>
Это работает, так как вы можете видеть, что файл был обновлен, а операторы println показывают предыдущее содержимое файла перед его изменением.
person
Some random IT boy
schedule
22.05.2020