Tính năng CPU
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
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.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# CPU features\n\nThere are several ways to check for CPU features in your code, each with a\ndifferent set of trade-offs.\n\nABI: Use the preprocessor's pre-defined macros\n----------------------------------------------\n\nIt's usually most convenient to determine the ABI at build time using `#ifdef`\nin conjunction with:\n\n- `__arm__` for 32-bit ARM\n- `__aarch64__` for 64-bit ARM\n- `__i386__` for 32-bit X86\n- `__x86_64__` for 64-bit X86\n\nNote that 32-bit X86 is called `__i386__`, not `__x86__` as you might expect!\n\nCPU core counts: Use libc's sysconf(3)\n--------------------------------------\n\n[sysconf(3)](http://man7.org/linux/man-pages/man3/sysconf.3.html) lets you\nquery both `_SC_NPROCESSORS_CONF` (the number of CPU cores in the system)\nand `_SC_NPROCESSORS_ONLN` (the number of CPU cores currently online).\n\nFeatures: Use libc's getauxval(3)\n---------------------------------\n\nIn API level 18 and newer,\n[getauxval(3)](http://man7.org/linux/man-pages/man3/getauxval.3.html)\nis available in Android's C library. The `AT_HWCAP` and `AT_HWCAP2` arguments\nreturn bitmasks listing CPU-specific features. See the various `hwcap.h`\nheaders in the NDK for the constants to compare against, such as `HWCAP_SHA512`\nfor arm64's SHA512 instructions, or `HWCAP_IDIVT` for arm's Thumb integer\ndivision instructions.\n\nThe Google cpu_features library\n-------------------------------\n\nOne problem with `AT_HWCAP` is that sometimes devices are mistaken. Some old\ndevices, for example, claim to have integer division instructions but do not.\n\n[Google's cpu_features](https://github.com/google/cpu_features) library works\naround such issues by applying its own knowledge of specific SoCs (by parsing\n`/proc/cpuinfo` to work out the specific SoC in question).\n\nThis library is maintained for use by Google's first-party app teams, and\nhas workarounds for every problematic device they've encountered in the wild.\n\nThe NDK cpufeatures library (deprecated)\n----------------------------------------\n\nThe NDK still provides a deprecated library named `cpufeatures` for source\ncompatibility with apps that already use it. Unlike the newer and more complete\n[cpu_features](https://github.com/google/cpu_features) library, this historical\nlibrary does not have workarounds for as many specific SoCs."]]