Questa risposta sarà dimostrare la differenza tra implementation, apie compilesu un progetto.
Diciamo che ho un progetto con tre moduli Gradle:
- app (un'applicazione Android)
- myandroidlibrary (una libreria Android)
- myjavalibrary (una libreria Java)
appha myandroidlibrarycome dipendenze. myandroidlibraryha myjavalibrary come dipendenze.

myjavalibraryha una MySecretclasse
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibraryha MyAndroidComponentclasse che manipola il valore dalla MySecretclasse.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Infine, appè interessato solo al valore dimyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Ora parliamo di dipendenze ...
appbisogno di consumare :myandroidlibrary, quindi appnell'uso build.gradle implementation.
( Nota : puoi usare anche api / compilare. Ma tieni questo pensiero per un momento.)
dependencies {
implementation project(':myandroidlibrary')
}

Come pensi myandroidlibraryche dovrebbe apparire build.gradle? Quale ambito dovremmo usare?
Abbiamo tre opzioni:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}

Qual è la differenza tra loro e cosa dovrei usare?
Compila o API (opzione # 2 o # 3)

Se stai usando compileo api. La nostra applicazione Android ora è in grado di accedere alla myandroidcomponentdipendenza, che è una MySecretclasse.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Implementazione (opzione n. 1)

Se stai usando la implementationconfigurazione, MySecretnon è esposto.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Quindi, quale configurazione dovresti scegliere? Dipende molto dalle tue esigenze.
Se vuoi esporre le dipendenze usa apio compile.
Se non si desidera esporre dipendenze (nascondere il modulo interno), utilizzare implementation.
Nota:
Questa è solo una sintesi delle configurazioni Gradle, fare riferimento alla Tabella 49.1. Plug-in Java Library: configurazioni utilizzate per dichiarare dipendenze per una spiegazione più dettagliata.
Il progetto di esempio per questa risposta è disponibile su https://github.com/aldoKelvianto/ImplementationVsCompile