Câu trả lời này sẽ chứng minh sự khác biệt giữa implementation
, api
và compile
trê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)
app
có myandroidlibrary
phụ thuộc. myandroidlibrary
có myjavalibrary
phụ thuộc.
myjavalibrary
có một MySecret
lớp học
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
có MyAndroidComponent
lớp thao túng giá trị từ MySecret
lớp.
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
Cuối cùng, app
chỉ 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 ...
app
cần phải tiêu thụ :myandroidlibrary
, vì vậy trong app
việ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ĩ myandroidlibrary
build.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 compile
hoặc api
. Ứng dụng Android của chúng tôi hiện có thể truy cập myandroidcomponent
phụ thuộc, đó là một MySecret
lớ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 implementation
cấu hình, MySecret
khô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 api
hoặ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