Jawaban ini akan menunjukkan perbedaan antara implementation
, api
dancompile
pada sebuah proyek.
Katakanlah saya punya proyek dengan tiga modul Gradle:
- aplikasi (aplikasi Android)
- myandroidlibrary (perpustakaan Android)
- myjavalibrary (perpustakaan Java)
app
memiliki myandroidlibrary
dependensi. myandroidlibrary
memiliki myjavalibrary
dependensi.
myjavalibrary
punya MySecret
kelas
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
memiliki MyAndroidComponent
kelas yang memanipulasi nilai dari MySecret
kelas.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Terakhir, app
hanya tertarik pada nilai darimyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Sekarang, mari kita bicara tentang ketergantungan ...
app
perlu dikonsumsi :myandroidlibrary
, jadi dalam app
penggunaan build.gradleimplementation
.
( Catatan : Anda dapat menggunakan api / kompilasi juga. Tapi tahan pikiran itu sejenak.)
dependencies {
implementation project(':myandroidlibrary')
}
Bagaimana menurut anda myandroidlibrary
seharusnya build.gradle? Lingkup mana yang harus kita gunakan?
Kami memiliki tiga opsi:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
Apa perbedaan antara mereka dan apa yang harus saya gunakan?
Kompilasi atau Api (opsi # 2 atau # 3)
Jika Anda menggunakan compile
atau api
. Aplikasi Android kami sekarang dapat mengakses myandroidcomponent
ketergantungan, yang merupakan MySecret
kelas.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Implementasi (opsi # 1)
Jika Anda menggunakan implementation
konfigurasi, MySecret
tidak terbuka.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Jadi, konfigurasi mana yang harus Anda pilih? Itu sangat tergantung pada kebutuhan Anda.
Jika Anda ingin mengekspos dependensi, gunakan api
atau compile
.
Jika Anda tidak ingin mengekspos dependensi (menyembunyikan modul internal Anda) kemudian gunakanimplementation
.
catatan:
Ini hanya inti dari konfigurasi Gradle, lihat Tabel 49.1. Plugin Java Library - konfigurasi yang digunakan untuk mendeklarasikan dependensi untuk penjelasan lebih rinci.
Proyek sampel untuk jawaban ini tersedia di https://github.com/aldoKelvianto/ImplementationVsCompile