Android Gradle Реализация vs CompileOnly Performance
В документах упоминается, что implementation
обеспечивает значительное улучшение времени сборки по сравнению с compile
/api
. Что насчет compileOnly
?
Мой вариант использования - это мультимодуль (извините, мне не нравится проект с несколькими проектами w140), где у меня есть приложение для Android и несколько библиотек, от которых зависит приложение (implementation
). Некоторые библиотеки также зависят друг от друга. Должен ли я использовать implementation
или compileOnly
при объявлении зависимостей в библиотечных модулях? Мой модуль приложения будет использовать implementation
, чтобы зависеть от этих артефактов, поэтому мне не нужно, чтобы они проходили через библиотечные модули.
Ответы
Ответ 1
Конфигурация 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 required on run time only.
Поскольку ваш случай является "многомодульным", вы должны использовать конфигурацию api
, пока не дойдете до финального модуля, лучше использовать implementation
.
Следующий график описывает эти конфигурации:
![enter image description here]()
Спектакль?
Я думаю, что api
требует больше памяти, потому что gradle будет снимать каждый класс в этом транзитивном модуле, и наоборот, implementation
является предпочтительной конфигурацией, потому что (как упомянуто выше) она использовала для своих собственных внутренних реализаций.
Ответ 2
В плагине Android Gradle 3.0 ключевое слово compile
устарело в пользу implementation
и api
.
-
api
: вы пропускаете интерфейс этого модуля через свой собственный интерфейс, что означает то же самое, что и старая зависимость compile
-
implementation
: вы используете этот модуль только для внутреннего использования и не пропускаете его через интерфейс
Узнайте больше о реализации API против здесь и здесь
Зависимости compileOnly
функционируют аналогично provided
, позволяя объявлять compileOnly
зависимости, используемые только во время компиляции.
Зависимости только для компиляции охватывают ряд вариантов использования, в том числе:
- Зависимости, необходимые во время компиляции, но никогда не требующиеся во время выполнения, такие как аннотации только для исходного кода или процессоры аннотаций;
- Зависимости, необходимые во время компиляции, но требующиеся во время выполнения только при использовании определенных функций, так называемые необязательные зависимости (при его использовании);
- Зависимости, API которых требуется во время компиляции, но реализация которых должна обеспечиваться библиотекой, приложением или средой выполнения.
Зависимости только для компиляции заметно отличаются от обычных зависимостей компиляции. Они не включены в путь к классам среды выполнения и не являются транзитивными, то есть они не включены в зависимые проекты.
читать больше здесь