Ta odpowiedź będzie wykazać różnicę między implementation
, api
i compile
nad projektem. Powiedzmy, że mam projekt z trzech modułów Gradle:
- app (aplikacja Android)
- myandroidlibrary (Android library)
- myjavalibrary (biblioteka Java)
app
ma myandroidlibrary
jako zależności. myandroidlibrary
ma myjavalibrary
jako zależności.
app -> myandroidlibrary -> myjavalibrary
myjavalibrary
ma MySecret
klasa
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
ma MyAndroidComponent
klasę, która manipulowania wartości od MySecret
klasie.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Wreszcie app
jest zainteresowany tylko na wartości od myandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Teraz pomówmy o zależnościach na app
build.gradle. Jest bardzo prosty i intuicyjny.
dependencies {
implementation project(':myandroidlibrary')
}
Co sądzisz myandroidlibrary
build.gradle powinien wyglądać jak? Mamy trzy możliwości:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Jaka jest różnica między nimi i co powinienem używać?
skompilować i Api
Jeśli używasz compile
i api
. Nasza aplikacja na Androida może teraz uzyskać dostęp do zależności myandroidcomponent
, która jest klasą MySecret
.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Realizacja
Jeśli używasz implementation
konfiguracji MySecret
nie jest narażona.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Jaką konfigurację należy wybrać? To naprawdę zależy od twoich wymagań.
Jeśli chcesz ujawnić zależności, użyj api
lub compile
, jeśli nie chcesz ujawniać zależności (ukrywając swój moduł wewnętrzny), użyj implementation
.
To jest tylko istota konfiguracji Gradle, Table 49.1. Java Library plugin - configurations used to declare dependencies ma bardziej szczegółowe wyjaśnienie na ten temat.
Happy Exploring
Kim są "konsumenci"? – Suragch
konsument jest modułem korzystającym z biblioteki. w przypadku Androida jest to aplikacja na Androida. Myślę, że jest to jasne i nie jestem pewien, czy o to prosisz. – humazed
Tak też brzmiał dla mnie. Ale jeśli tworzę bibliotekę, oczywiście chcę, aby jej interfejs API był narażony na działanie aplikacji. W przeciwnym razie, w jaki sposób programista aplikacji użyłby mojej biblioteki? Dlatego nie rozumiem znaczenia "implementacji" ukrywania zależności. Czy moje pytanie ma sens? – Suragch