Có một số cách để kiểm tra tính năng CPU trong mã, mỗi cách có những ưu nhược điểm khác nhau.
ABI: Dùng macro được xác định trước của bộ tiền xử lý
Thông thường, để thuận tiện nhất, bạn nên xác định ABI tại thời điểm xây dựng bằng cách sử dụng #ifdef
cùng với:
__arm__
cho ARM 32 bit__aarch64__
cho ARM 64 bit__i386__
cho X86 32 bit__x86_64__
cho X86 64 bit
Lưu ý: X86 32 bit được gọi là __i386__
, không phải __x86__
như bạn có thể mong đợi!
Số lượng lõi CPU: Sử dụng sysconf(3) của libc
sysconf(3) cho phép bạn truy vấn cả _SC_NPROCESSORS_CONF
(số lõi CPU trong hệ thống) và _SC_NPROCESSORS_ONLN
(số lõi CPU đang được dùng trực tuyến).
Tính năng: Sử dụng getauxval(3) của libc
Trong API cấp 18 trở lên, getauxval(3) có trong thư viện C của Android. Các đối số AT_HWCAP
và AT_HWCAP2
trả về mặt nạ bit (bitmask) liệt kê các tính năng dành riêng cho CPU. Xem nhiều tiêu đề hwcap.h
khác nhau trong NDK để biết các hằng số là cơ sở so sánh, chẳng hạn như HWCAP_SHA512
đối với hướng dẫn SHA512 của arm64 hoặc HWCAP_IDIVT
đối với hướng dẫn chia số nguyên Thumb của arm.
Thư viện cpu_features của Google
AT_HWCAP
có một vấn đề, đó là đôi khi các thiết bị sẽ bị nhầm lẫn. Ví dụ: Một số thiết bị cũ xác nhận có hướng dẫn phân chia số nguyên nhưng lại không có.
Thư viện cpu_features của Google nỗ lực giải quyết các vấn đề như vậy bằng cách áp dụng kiến thức riêng về các SoC cụ thể (bằng cách phân tích cú pháp /proc/cpuinfo
để tìm ra SoC cụ thể đang được đề cập).
Thư viện này được duy trì cho các nhóm ứng dụng bên thứ nhất của Google sử dụng và có giải pháp cho mọi thiết bị có vấn đề mà họ gặp phải ở môi trường sau khi phát hành.
Thư viện cpufeatures của NDK (không dùng nữa)
NDK vẫn cung cấp một thư viện không dùng nữa tên là cpufeatures
để đảm bảo khả năng tương thích về nguồn với các ứng dụng đã sử dụng thư viện này. Không giống như thư viện cpu_features mới và hoàn chỉnh hơn, thư viện cũ này không có giải pháp cho nhiều SoC cụ thể như vậy.