Ứ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.