יש כמה דרכים לבדוק את התכונות של המעבד בקוד, ולכל אחת מהן יש יתרונות וחסרונות.
ABI: שימוש בפקודות מאקרו שהוגדרו מראש על ידי מעבד מקדים
בדרך כלל הכי נוח לקבוע את ה-ABI בזמן הבנייה באמצעות #ifdef
בצירוף:
-
__arm__
ל-ARM ב-32 ביט -
__aarch64__
ל-ARM 64 ביט -
__i386__
ל-32 ביט X86 -
__x86_64__
ל-X86 ב-64 ביט
שימו לב ש-32-bit X86 נקרא __i386__
ולא __x86__
, כפי שאולי ציפיתם.
מספר ליבות ה-CPU: משתמשים ב-sysconf(3) של libc
sysconf(3) מאפשרת לכם לשאול גם על _SC_NPROCESSORS_CONF
(מספר ליבות המעבד במערכת) וגם על _SC_NPROCESSORS_ONLN
(מספר ליבות המעבד שמחוברות כרגע).
תכונות: שימוש ב-getauxval(3) של libc
ב-API ברמה 18 ומעלה, הפונקציה getauxval(3) זמינה בספריית C של Android. הארגומנטים AT_HWCAP
ו-AT_HWCAP2
מחזירים מסכות ביטים שמפרטות תכונות ספציפיות למעבד. אפשר לעיין בכותרות השונות ב-NDK כדי לראות את הקבועים להשוואה, כמו HWCAP_SHA512
להוראות SHA512 של arm64, או HWCAP_IDIVT
להוראות חלוקת מספרים של Thumb של arm.hwcap.h
הספרייה cpu_features של Google
בעיה אחת ב-AT_HWCAP
היא שלפעמים יש טעות בזיהוי המכשירים. לדוגמה, חלק מהמכשירים הישנים טוענים שיש להם הוראות חלוקה של מספרים שלמים, אבל בפועל אין להם.
הספרייה cpu_features של Google פותרת בעיות כאלה על ידי שימוש בידע שלה לגבי מערכות SoC ספציפיות (על ידי ניתוח של /proc/cpuinfo
כדי לזהות את מערכת ה-SoC הספציפית הרלוונטית).
הספרייה הזו מתוחזקת לשימוש של צוותי האפליקציות מאינטראקציה ישירה של Google, ויש בה פתרונות לכל מכשיר בעייתי שהם נתקלו בו.
הספרייה cpufeatures של NDK (הוצאה משימוש)
ה-NDK עדיין מספק ספרייה שהוצאה משימוש בשם cpufeatures
לצורך תאימות למקור עם אפליקציות שכבר משתמשות בה. בניגוד לספרייה החדשה והמלאה יותר cpu_features, בספרייה ההיסטורית הזו אין פתרונות עקיפים למספר רב של מערכות SoC ספציפיות.