Thuộc tính phiên bản SDK Android

Ứng dụng Android có thể đặt một số thuộc tính phiên bản SDK trong tệp build.gradle của ứng dụng. Tài liệu về Android build.gradle giải thích ý nghĩa của các thuộc tính đó đối với ứng dụng nói chung. Tài liệu này giải thích ảnh hưởng của các thuộc tính đó đối với bản dựng NDK.

compileSdkVersion

Thuộc tính này không ảnh hưởng đến các bản dựng NDK. Thay vào đó, khả năng sử dụng API của NDK sẽ chịu sự điều chỉnh của minSdkVersion. Điều này là do các ký hiệu C++ được giải quyết sớm tại thời điểm tải thư viện thay vì được giải quyết muộn khi được gọi lần đầu (như trong Java). Việc sử dụng ký hiệu không có trong minSdkVersion sẽ khiến thư viện không tải được trên những phiên bản hệ điều hành không có API mới, bất kể các API đó có được gọi hay không.

Đối với ứng dụng mới, hãy chọn phiên bản mới nhất hiện có. Đối với ứng dụng hiện có, hãy cập nhật thuộc tính này lên phiên bản mới nhất khi thuận tiện.

targetSdkVersion

Tương tự như Java, targetSdkVersion của ứng dụng có thể thay đổi hành vi trong thời gian chạy của mã gốc. Các thay đổi về hành vi trong hệ thống, nếu có thể xảy ra, chỉ áp dụng cho ứng dụng có targetSdkVersion lớn hơn hoặc bằng phiên bản hệ điều hành đưa ra thay đổi này.

Đối với ứng dụng mới, hãy chọn phiên bản mới nhất hiện có. Đối với ứng dụng hiện có, hãy cập nhật thuộc tính này lên phiên bản mới nhất khi thuận tiện (sau khi cập nhật compileSdkVersion).

Mặc dù thường thì nhà phát triển ứng dụng sẽ biết phiên bản SDK mục tiêu (targetSdkVersion) của ứng dụng của họ, nhưng API này rất hữu ích cho nhà phát triển thư viện vì họ không biết được người dùng sẽ chọn targetSdkVersion nào.

Tại thời gian chạy, bạn có thể biết targetSdkVersion mà một ứng dụng sử dụng bằng cách gọi android_get_application_target_sdk_version(). API này có trong API cấp 24 trở lên. Hàm này có chữ ký sau:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

Các thay đổi khác về hành vi có thể phụ thuộc vào cấp độ API của thiết bị. Bạn có thể biết cấp độ API của thiết bị đang chạy ứng dụng bằng cách gọi android_get_device_api_level(). Hàm này có chữ ký sau:

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

Thuộc tính này không ảnh hưởng đến các bản dựng NDK.

minSdkVersion

minSdkVersion đặt trong tệp build.gradle sẽ xác định những API có sẵn tại thời điểm xây dựng (xem phần compileSdkVersion để hiểu lý do khiến bản dựng này khác với các bản dựng Java) và xác định phiên bản hệ điều hành tối thiểu mà mã sẽ tương thích.

minSdkVersion được NDK sử dụng để xác định những tính năng có thể sử dụng khi biên dịch mã. Ví dụ: Thuộc tính này xác định tính năng FORTIFY được sử dụng trong libc và cũng có thể cho phép cải thiện hiệu suất hoặc kích thước (chẳng hạn như hàm băm GNU hoặc RELR) cho các tệp nhị phân không tương thích với các phiên bản Android cũ hơn. Ngay cả khi bạn không sử dụng API mới, thuộc tính này vẫn chi phối phiên bản hệ điều hành tối thiểu được hỗ trợ của mã.

Đối với ứng dụng mới, hãy xem dữ liệu phân phối của người dùng trong Trình hướng dẫn dự án mới của Android Studio hoặc trên apilevels.com. Bạn nên đảm bảo cân bằng giữa thị phần tiềm năng và chi phí bảo trì. minSdkVersion càng thấp, thì bạn càng mất nhiều thời gian để giải quyết các lỗi cũ và thêm các hành vi dự phòng cho những tính năng chưa được triển khai.

Đối với ứng dụng hiện có, hãy tăng cấp độ minSdkVersion bất cứ khi nào cấp độ API cũ không còn đáng chi phí bảo trì. Ngược lại, hãy giảm cấp độ mã này nếu người dùng yêu cầu và việc giảm mã xứng đáng với chi phí bảo trì mới. Play Console có các chỉ số dành riêng cho hoạt động phân phối người dùng của ứng dụng.

minSdkVersion của ứng dụng được cung cấp cho bộ tiền xử lý thông qua macro __ANDROID_MIN_SDK_VERSION__ (__ANDROID_API__ cũ tương tự, nhưng ưu tiên macro kia hơn vì ý nghĩa của phiên bản này rõ ràng hơn). Clang tự động định nghĩa macro này, nên bạn có thể sử dụng mà không cần thêm tiêu đề. Đối với các bản dựng NDK, macro này luôn được định nghĩa.