compileSdkVersion, minSdkVersion, và targetSdkVersion trong Android

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ặc errors 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ản android 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 GradleAndroid 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, targetSdkVersioncompileSdkVersion 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 đaminSdkVersiontối thiểu , thì tối đa phải ít nhất cao như mức tối thiểutargetSdkVersion 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 targetSdkVersioncompileSdkVersion 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