Использование useBuildCache в gradle и kapt

Я хотел бы использовать новую возможность плагина kotlin gradle и кэшировать мои результаты сборки, для получения дополнительной информации прочтите это. Другой способ ускорения сборки - кэширование задач kapt, но по умолчанию он не включен.

because Gradle does not yet have a way to map inputs and outputs for annotation processors

Единственная зависимость от kapt, которая у меня есть, - это dagger 2, по вашему опыту безопасно ли ее кэшировать?

6
0
1 082
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Причина, по которой кэширование выходных данных задач Kapt не считается безопасным, заключается в том, что процессоры аннотаций содержат произвольный код, который может не соответствовать одному или нескольким требованиям, обеспечивающим правильное кеширование:

  • Преобразование должно использовать только входные данные задачи и не должно принимать во внимание что-либо еще. По умолчанию входные данные задачи включают в себя источники, путь к классам компиляции, макеты Android, параметры и реализации компилятора и процессора аннотаций и некоторые другие вещи, но вы можете зарегистрировать дополнительные входные данные по своему усмотрению.

    Нарушение этого правила приводит к ложным попаданиям в кеш, когда некоторые входные данные, которые использует процессор аннотаций, не отслеживаются как таковые, и изменение этих входов не отражается в ключе кеша, вычисленном Gradle, что приводит к попаданию во время выполнения задачи. фактически приведет к разным результатам.

  • Все выходные данные, производимые процессором аннотаций, должны отслеживаться как выходы задачи, которые по умолчанию являются сгенерированными источниками Java и Kotlin, и сгенерированными двоичными классами. Если задача вызывает что-либо еще, вы можете вручную зарегистрировать это в качестве выходных данных задачи в сценарии сборки.

    Несоблюдение этого правила приведет к тому, что некоторые из произведенных выходных данных останутся вне кеша, не сохраняя их и, следовательно, не загружая их.

  • Обработчик аннотаций должен быть чистым, то есть при одинаковых входных данных он должен выдавать одинаковые результаты. Он не должен показывать случайное поведение или использовать системное время.

    Кэширование выходных данных процессора аннотаций, который не следует этому правилу, бесполезно, так как это часто приводит к пропуску кеша или ложному попаданию в кеш.

Насколько я могу судить, Dagger 2 следует этим правилам, и кеширование его выходных данных должно работать нормально, хотя я не могу дать никаких гарантий по этому поводу. В любом случае, не стесняйтесь экспериментировать и посмотреть, как кеширование работает для вашей сборки.

Если вы столкнетесь с какими-либо проблемами с конкретным процессором аннотаций, который предположительно должен уживаться с кешированием в соответствии с приведенными выше правилами, сообщите об этом в Система отслеживания проблем Kotlin.

Другие вопросы по теме