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 phiên bản hệ điều hành không có API mới hơn, bất kể các API đó có được gọi hay không.

targetSdkVersion

Tương tự như Java, targetSdkVersion của ứng dụng có thể thay đổi hành vi 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.

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

Trong 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ủa ứng dụng được cung cấp cho bộ tiền xử lý thông qua macro __ANDROID_API__. Macro này được Clang xác định tự động, vì vậy bạn không cần bao gồm tiêu đề để sử dụng. Đối với các bản dựng NDK, macro này luôn được xác định.

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ã. Mặc dù vậy, thư viện có thể sẽ tải trên phiên bản hệ điều hành cũ hơn. Không nên dựa vào đặc điểm này vì đặc điểm này có thể khác nhau giữa các phiên bản NDK, phiên bản hệ điều hành hoặc khác nhau giữa từng thiết bị.