Ta odpowiedź będzie wykazać różnicę między implementation, apioraz compilenad projektem.
Powiedzmy, że mam projekt z trzema modułami Gradle:
- aplikacja (aplikacja na Androida)
- myandroidlibrary (biblioteka Androida)
- myjavalibrary (biblioteka Java)
appma myandroidlibraryjako zależności. myandroidlibraryma myjavalibrary jako zależności.

myjavalibraryma MySecretklasę
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibraryma MyAndroidComponentklasę, która manipuluje wartością z MySecretklasy.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Wreszcie appinteresuje się tylko wartością zmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Porozmawiajmy teraz o zależnościach ...
apptrzeba konsumować :myandroidlibrary, więc w appbuild.gradle użyj implementation.
( Uwaga : możesz również użyć interfejsu API / kompilacji. Ale przytrzymaj tę myśl przez chwilę.)
dependencies {
implementation project(':myandroidlibrary')
}

Jak myślisz, jak myandroidlibrarypowinna wyglądać build.gradle? Z jakiego zakresu powinniśmy korzystać?
Mamy trzy opcje:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}

Jaka jest różnica między nimi a tym, czego powinienem używać?
Kompiluj lub API (opcja nr 2 lub nr 3)

Jeśli używasz compilelub api. Nasza aplikacja na Androida ma teraz dostęp do myandroidcomponentzależności, która jest MySecretklasą.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Realizacja (opcja nr 1)

Jeśli używasz implementationkonfiguracji, MySecretnie jest narażony.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Którą konfigurację wybrać? To naprawdę zależy od twoich wymagań.
Jeśli chcesz ujawnić zależności, użyj apilub compile.
Jeśli nie chcesz ujawniać zależności (ukrywanie modułu wewnętrznego), użyj implementation.
Uwaga:
To tylko streszczenie konfiguracji Gradle, patrz Tabela 49.1. Wtyczka Java Library - konfiguracje używane do deklarowania zależności w celu uzyskania bardziej szczegółowych wyjaśnień.
Przykładowy projekt dla tej odpowiedzi jest dostępny na https://github.com/aldoKelvianto/ImplementationVsCompile