Jawaban ini akan menunjukkan perbedaan antara implementation, apidancompile pada sebuah proyek.
Katakanlah saya punya proyek dengan tiga modul Gradle:
- aplikasi (aplikasi Android)
- myandroidlibrary (perpustakaan Android)
- myjavalibrary (perpustakaan Java)
appmemiliki myandroidlibrarydependensi. myandroidlibrarymemiliki myjavalibrary dependensi.

myjavalibrarypunya MySecretkelas
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrarymemiliki MyAndroidComponentkelas yang memanipulasi nilai dari MySecretkelas.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Terakhir, apphanya tertarik pada nilai darimyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Sekarang, mari kita bicara tentang ketergantungan ...
appperlu dikonsumsi :myandroidlibrary, jadi dalam apppenggunaan 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 compileatau api. Aplikasi Android kami sekarang dapat mengakses myandroidcomponentketergantungan, yang merupakan MySecretkelas.
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 implementationkonfigurasi, MySecrettidak 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 apiatau 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