compileSdkVersion, minSdkVersion, và targetSdkVersion trong Android
Bài đăng này đã không được cập nhật trong 7 năm
Tùy thuộc vào thời điểm trong năm, chỉ có thể vài tháng sau khi bạn phát hành một ứng dụng, một phiên bản Android mới được công bố. Điều gì xảy ra với ứng dụng của bạn - phải chăng nó sẽ không còn chạy nữa?
Thật may mắn, nó vẫn sống sót . Khả năng tương thích về phía trước forward compatibility là một điểm mạnh của android
. Các ứng dụng được xây dựng trên nền tảng SDK trước đó sẽ không bị hỏng khi người dụng cập nhật lên phiên bản android
mới hơn. Với compileSdkVersion
, minSdkVersion
, và targetSdkVersion
, chúng sẽ giúp ta chỉ ra API
nào được sẵn sàng, API Level
nào được yêu cầu, và chế độ tương thích nào được áp dụng một cách tương ứng trong ứng dụng.
compileSdkVersion
compileSdkVersion
là cách mà bạn nói với Gradle
rằng Android SDK
nào sẽ là trình biên dịch cho code
của ứng dụng. Sử dụng Android SDK
mới là yêu cầu để ứng dụng có thể sử dụng những APIs
mới được thêm vào trong SDK Level
đó.
Việc thay đổi compileSdkVersion
sẽ không làm thay đổi hành vi lúc chạy app runtime behavior
. Mặc dù lúc biên dịch code
, trình biên dịch (của SDK
mới hơn) có thể sẽ thông báo warnings
hoặc errors
, nhưng compileSdkVersion
sẽ không được thêm vào trong APK
của ứng dụng. Nó chỉ được sử dụng lúc biên dịch compile time
.
NOTE: Bạn nên sửa những
warnings
hoặcerrors
này vì chúng được thêm vào bởi một lý do nào đó mà có thể xảy ra khi ứng dụng của bạn chạy thực sự trên phiên bảnandroid
này.
Vì vậy, nên luôn luôn sử dụng SDK mới nhất, nó sẽ giúp bạn tránh được những APIs
đã bị hạn chế dùng (deprecated APIs
) và sẵn sàng để ứng dụng có thể chạy trên những APIs
mới.
Chú ý rằng, nếu bạn sử dụng Support Library
, biên dich với SDK mới nhất là yêu cầu để sử dụng được Support Library
mới nhất.
Ví dụ, để sử dung Support Library
25.3.1, bạn cần phải dùng compileSdkVersion
ít nhất là version 25.
Nói chung, một hoặc nhiều phiên bản Support Library
sẽ được phát hành cùng với một phiên bản nền tảng (platform version
), điều này để cung cấp khả năng tương thích cho các API
mới được thêm vào cũng như các tính năng mới.
minSdkVersion
Nếu compileSdkVersion
thiết lập các API
mới nhất sẵn sàng cho bạn, minSdkVersion
sẽ là giới hạn thấp nhất mà ứng dụng của bạn sẽ hỗ trợ. minSdkVersion
cũng là một trong những tín hiệu mà Google Play
sử dụng để xác định thiết bị nào của người dùng có thể cài đặt một ứng dụng.
Ngoài ra, nó cũng đóng một vai trò quan trọng trong quá trình phát triển (development
). Lint mặc định sẽ chạy và cảnh báo khi bạn sử dụng bất cứ API
nào cao hơn phiên bản minSdkVersion
(không tồn tại trong minSdkVersion
), điều này giúp tránh các runtime issues
khi cố gọi một API
không tồn tại. Do đó, kiểm tra phiên bản của hệ điều hành lúc runtime
là một kĩ thuật để gọi API
chỉ được hỗ trợ bởi các phiên bản mới hơn.
VD:
private void setUpActionBar() {
// Make sure we're running on Honeycomb or higher to use ActionBar APIs
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
Lưu ý với các library
mà bạn sử dụng, chẳng hạn như bất kỳ Support Library
hoặc Google Play services
nào, có thể có minSdkVersion
của riêng của nó, khi đó minSdkVersion
của ứng dụng của bạn phải ít nhất cao bằng minSdkVersion
cao nhất của các library
. Giả sử nếu các library
của bạn yêu cầu là 4, 7, và 9, khi đó minSdkVersion
của bạn ít nhất phải là 9. Trong trường hợp muốn tiếp tục sử dụng library
với minSdkVersion
cao hơn ứng dụng của bạn (và xử lý tất cả các trường hợp / đảm bảo rằng thư viện chỉ được sử dụng trên các phiên bản nền tảng mới hơn) , Bạn có thể sử dụng tools:overrideLibrary
marker
, nhưng hãy chắc chắn kiểm tra kỹ lưỡng!
Khi quyết định giá trị minSdkVersion
, bạn nên xem xét bản thống kê phiên bản các thiết bị android, nó sẽ giúp bạn có cái nhìn tổng quan dựa trên tất cả các thiết bị đã truy cập vào Google Play Store
trong 7 ngày trước đó - đây là lượng user
tiềm năng của bạn một khi đưa một ứng dụng lên Google Play
. Đây là quyết định kinh doanh cuối cùng về việc hỗ trợ thêm 3% thiết bị có đáng với thời gian cho việc phát triển và những kiểm tra cần thiết để đảm bảo trải nghiệm tốt nhất hay không. Hãy nhớ rằng 0,7% của 1,4 tỷ thiết bị là con số không nhỏ.
targetSdkVersion
Tuy nhiên, targetSdkVersion
mới là thứ thú vị nhất trong cả 3 compileSdkVersion, minSdkVersion, và targetSdkVersion
.
TargetSdkVersion
là cách chính mà Android cung cấp khả năng tương thích về phía trước forward compatibility, bằng cách không áp dụng thay đổi hành vi (behavior
) trừ khi targetSdkVersion
được cập nhật. Điều này cho phép bạn sử dụng các API mới (như việc bạn đã cập nhật compileSdkVersion
?) trước khi làm việc thông qua thay đổi hành vi.
Phần lớn các thay đổi về hành vi mà targetSdkVersion
ngụ ý được ghi lại trực tiếp trong VERSION_CODES
, nhưng tất cả các chi tiết miêu tả cũng được liệt kê trên platform highlight
của từng bản phát hành. Tham khảo tại đây
Ví dụ: Android 6.0 có runtime permissions
, Android 4.4 với Printing framework
...
Với một số thay đổi hành vi rất rõ ràng đối với người dùng (việc không sử dụng nútmenu
, cung cấp cơ chế runtime permission
, v.v.), việc cập nhật SDK
mới nhất phải được ưu tiên cao cho mọi ứng dụng. Điều này không có nghĩa là bạn phải sử dụng mọi tính năng mới được giới thiệu, cũng như bạn không nên cập nhật targetSdkVersion
một cách mù quáng mà không cần kiểm tra. Hãy kiểm tra trước khi cập nhật targetSdkVersion
của bạn.
Gradle and SDK versions
Việc thiết lập chính xác giá trị của compileSdkVersion
, minSdkVersion
, và targetSdkVersion
là rất quan trọng. Với Gradle
và Android Studio
, các giá trị này được tích hợp vào build.gradle
của mô-đun:
android {
compileSdkVersion 25
buildToolsVersion “25.0.2”
defaultConfig {
applicationId "com.example"
minSdkVersion 8
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
}
minSdkVersion
, targetSdkVersion
và compileSdkVersion
khi chúng được đưa vào APK cuối cùng của bạn - trong generated AndroidManifest.xml
(Đường dẫn app/build/intermediates/manifest/.../AndroidManifest.xml
)
<uses-sdk android:targetSdkVersion=”25" android:minSdkVersion=”8" />
NOTE: Nếu bạn đặt chúng trong manifest
, nó sẽ bị bỏ qua khi bạn build
với Gradle
.
Putting it all together
Bạn có thể nhận thấy một mối quan hệ giữa ba giá trị:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
Nó thực sự make sense, compileSdkVersion
là mức API tối đa và minSdkVersion
là tối thiểu , thì tối đa phải ít nhất cao như mức tối thiểu và targetSdkVersion
phải ở đâu đó ở giữa.
Lý tưởng nhất, mối quan hệ sẽ giống như thế này:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
Bạn sẽ có lượng user
lớn nhất với minSdkVersion
thấp. Xem xét và hành động tốt nhất bằng targetSdkVersion
và compileSdkVersion
với SDK mới nhất - là cách tuyệt vời để #BuildBetterApps.
Tham Khảo
https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd?linkId=20147489 https://developer.android.com/guide/topics/manifest/uses-sdk-element.html
All rights reserved