Внедрение Android Gradle против производительности CompileOnly
В документах упоминается, что implementation
обеспечивает значительное улучшение времени сборки compile
/api
, Как насчет compileOnly
?
Мой вариант использования - это многомодульный (извините, мне не нравится многопроектная терминология Грэдла) проект, в котором у меня есть приложение для Android и несколько библиотек, от которых зависит приложение (implementation
). Некоторые из библиотек также зависят друг от друга. Должен ли я использовать implementation
или же compileOnly
при объявлении зависимостей в библиотечных модулях? Мой модуль приложения будет использовать implementation
зависеть от этих артефактов, поэтому мне не нужно, чтобы они были транзитивными через библиотечные модули.
2 ответа
api
Конфигурация должна использоваться для зависимостей, которые экспортируются во внешние modules
(переходная зависимость). Наоборот implementation
Конфигурация должна использоваться для зависимостей, которые являются внутренними для компонента (не транзитивная зависимость).
реализация против compileOnly:
В их работе нет сходства, compileOnly
является
- конфигурация, унаследованная от java-плагина
- требуется во время компиляции
- также не включается в путь к классам среды выполнения и не подвергается зависимым проектам.
Так compileOnly
не заменяет implementation
задание конфигурации, например:
implementation 'com.android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'
compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.
Поскольку ваш случай является "мультимодулем", вы должны использовать api
конфигурация, пока не дойдете до последнего модуля, лучше использовать implementation
,
Следующий график описывает эти конфигурации:
Спектакль?
Я думаю api
требует больше памяти, потому что gradle будет снимать каждый класс в этом переходном модуле, и наоборот implementation
является предпочтительной конфигурацией, потому что (как упоминалось выше) она используется для собственных внутренних реализаций.
compileOnly
зависимости функционируют аналогично provided
, что позволяет объявлять нетранзитивные зависимости, используемые только во время компиляции.
Зависимости только для компиляции охватывают ряд вариантов использования, в том числе:
- Зависимости, необходимые во время компиляции, но никогда не требующиеся во время выполнения, такие как аннотации только для исходного кода или процессоры аннотаций;
- Зависимости, необходимые во время компиляции, но требующиеся во время выполнения только при использовании определенных функций, так называемые необязательные зависимости( при его использовании);
- Зависимости, API которых требуется во время компиляции, но реализация которых должна обеспечиваться библиотекой, приложением или средой выполнения.
Зависимости только для компиляции заметно отличаются от обычных зависимостей компиляции. Они не включены в путь к классам среды выполнения и не являются транзитивными, то есть они не включены в зависимые проекты.
читайте больше здесь - https://blog.gradle.org/introducing-compile-only-dependencies