Ответ на этот вопрос будет продемонстрировать разницу между implementation, apiи compileна проекте.
Допустим, у меня есть проект с тремя модулями Gradle:
- приложение (приложение для Android)
- myandroidlibrary (библиотека Android)
- myjavalibrary (библиотека Java)
appимеет myandroidlibraryкак зависимости. myandroidlibraryимеет myjavalibrary как зависимости.

myjavalibraryимеет MySecretкласс
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibraryимеет MyAndroidComponentкласс, который манипулирует значением из MySecretкласса.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Наконец, appинтересует только значение изmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Теперь поговорим о зависимостях ...
appпотреблять :myandroidlibrary, поэтому в appbuild.gradle пользуйтесь implementation.
( Примечание : вы также можете использовать api / compile. Но подождите немного.)
dependencies {
implementation project(':myandroidlibrary')
}

Как вы думаете, myandroidlibraryкак должен выглядеть build.gradle? Какой объем мы должны использовать?
У нас есть три варианта:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}

В чем разница между ними и что я должен использовать?
Компиляция или API (вариант № 2 или № 3)

Если вы используете compileили api. Наше приложение для Android теперь может получить доступ к myandroidcomponentзависимости, которая является MySecretклассом.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Реализация (вариант № 1)

Если вы используете implementationконфигурацию, MySecretне подвергается.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Итак, какую конфигурацию вы должны выбрать? Это действительно зависит от вашего требования.
Если вы хотите выставить зависимости, используйте apiили compile.
Если вы не хотите раскрывать зависимости (скрывая свой внутренний модуль), используйте implementation.
Замечания:
Это просто суть конфигураций Gradle, см. Таблицу 49.1. Плагин библиотеки Java - конфигурации, используемые для объявления зависимостей для более подробного объяснения.
Пример проекта для этого ответа доступен по адресу https://github.com/aldoKelvianto/ImplementationVsCompile.