Esistono diversi modi per verificare la presenza di funzionalità della CPU nel codice, ognuno con un diverso insieme di compromessi.
ABI: utilizza le macro predefinite del preprocessor
Di solito è più comodo determinare l'ABI in fase di compilazione utilizzando #ifdef
in combinazione con:
__arm__per ARM a 32 bit__aarch64__per ARM a 64 bit__i386__per X86 a 32 bit__x86_64__per X86 a 64 bit
Tieni presente che X86 a 32 bit è chiamato __i386__, non __x86__ come potresti aspettarti.
Conteggi dei core CPU: utilizza sysconf(3) di libc
sysconf(3) consente di
interrogare sia _SC_NPROCESSORS_CONF (il numero di core CPU nel sistema)
sia _SC_NPROCESSORS_ONLN (il numero di core CPU attualmente online).
Funzionalità: utilizza getauxval(3) di libc
Nel livello API 18 e versioni successive,
getauxval(3)
è disponibile nella libreria C di Android. Gli argomenti AT_HWCAP e AT_HWCAP2
restituiscono bitmask che elencano le funzionalità specifiche della CPU. Consulta le varie intestazioni hwcap.h
dell'NDK per le costanti da confrontare, ad esempio HWCAP_SHA512
per le istruzioni SHA512 di arm64 o HWCAP_IDIVT per le istruzioni di divisione
di interi Thumb di arm.
La libreria cpu_features di Google
Un problema con AT_HWCAP è che a volte i dispositivi vengono scambiati. Alcuni dispositivi
meno recenti, ad esempio, dichiarano di avere istruzioni di divisione intera, ma non è così.
La libreria cpu_features di Google risolve questi problemi applicando la propria conoscenza di SoC specifici (analizzando /proc/cpuinfo per determinare il SoC specifico in questione).
Questa libreria viene gestita per l'utilizzo da parte dei team di app proprietarie di Google e dispone di soluzioni alternative per ogni dispositivo problematico riscontrato.
Libreria cpufeatures dell'NDK (deprecata)
L'NDK fornisce ancora una libreria ritirata denominata cpufeatures per la compatibilità
dell'origine con le app che la utilizzano già. A differenza della libreria
cpu_features più recente e completa, questa libreria
storica non dispone di soluzioni alternative per altrettanti SoC specifici.