Відповідь на це питання буде продемонструвати різницю між 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 Library - конфігурації, які використовуються для оголошення залежностей для більш детального пояснення.
Зразок проекту для цієї відповіді доступний на https://github.com/aldoKelvianto/ImplementationVsCompile