Questa risposta sarà dimostrare la differenza tra implementation
, api
e compile
su un progetto.
Diciamo che ho un progetto con tre moduli Gradle:
- app (un'applicazione Android)
- myandroidlibrary (una libreria Android)
- myjavalibrary (una libreria Java)
app
ha myandroidlibrary
come dipendenze. myandroidlibrary
ha myjavalibrary
come dipendenze.
myjavalibrary
ha una MySecret
classe
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
ha MyAndroidComponent
classe che manipola il valore dalla MySecret
classe.
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 ...
app
bisogno di consumare :myandroidlibrary
, quindi app
nell'uso build.gradle implementation
.
( Nota : puoi usare anche api / compilare. Ma tieni questo pensiero per un momento.)
dependencies {
implementation project(':myandroidlibrary')
}
Come pensi myandroidlibrary
che 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 compile
o api
. La nostra applicazione Android ora è in grado di accedere alla myandroidcomponent
dipendenza, che è una MySecret
classe.
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 implementation
configurazione, MySecret
non è 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 api
o 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