Câu trả lời này sẽ chứng minh sự khác biệt giữa implementation, apivà compiletrên một dự án.
Giả sử tôi có một dự án với ba mô-đun Gradle:
- ứng dụng (một ứng dụng Android)
- myandroidl Library (thư viện Android)
- thư viện myjaval (một thư viện Java)
appcó myandroidlibraryphụ thuộc. myandroidlibrarycó myjavalibrary phụ thuộc.

myjavalibrarycó một MySecretlớp học
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrarycó MyAndroidComponentlớp thao túng giá trị từ MySecretlớp.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Cuối cùng, appchỉ quan tâm đến giá trị từmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
Bây giờ, hãy nói về sự phụ thuộc ...
appcần phải tiêu thụ :myandroidlibrary, vì vậy trong appviệc sử dụng build.gradle implementation.
( Lưu ý : Bạn cũng có thể sử dụng api / biên dịch. Nhưng hãy giữ suy nghĩ đó một lát.)
dependencies {
implementation project(':myandroidlibrary')
}

Bạn nghĩ myandroidlibrarybuild.gradle nên như thế nào? Chúng ta nên sử dụng phạm vi nào?
Chúng tôi có ba lựa chọn:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}

Sự khác biệt giữa chúng và tôi nên sử dụng cái gì?
Biên dịch hoặc Api (tùy chọn # 2 hoặc # 3)

Nếu bạn đang sử dụng compilehoặc api. Ứng dụng Android của chúng tôi hiện có thể truy cập myandroidcomponentphụ thuộc, đó là một MySecretlớp.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
Thực hiện (tùy chọn số 1)

Nếu bạn đang sử dụng implementationcấu hình, MySecretkhông được tiếp xúc.
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
Vậy, bạn nên chọn cấu hình nào? Điều đó thực sự phụ thuộc vào yêu cầu của bạn.
Nếu bạn muốn phơi bày phụ thuộc sử dụng apihoặc compile.
Nếu bạn không muốn để lộ phụ thuộc (ẩn mô-đun nội bộ của mình) thì hãy sử dụng implementation.
Ghi chú:
Đây chỉ là ý chính của cấu hình Gradle, tham khảo Bảng 49.1. Plugin Thư viện Java - các cấu hình được sử dụng để khai báo các phụ thuộc để giải thích chi tiết hơn.
Dự án mẫu cho câu trả lời này có sẵn trên https://github.com/aldoKelvianto/ImcellenceationVsCompile