Esistono diversi modi per verificare le funzionalità della CPU nel codice, ciascuno con un diverso insieme di compromessi.
ABI: utilizza le macro predefinite del preprocessore
In genere è più pratico determinare l'ABI al momento della creazione 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 lo standard X86 a 32 bit si chiama __i386__
, non __x86__
come previsto.
Conteggi di core della CPU: utilizza il parametro sysconf(3) di libc
sysconf(3) ti consente di eseguire query sia su _SC_NPROCESSORS_CONF
(il numero di core CPU nel sistema) sia su _SC_NPROCESSORS_ONLN
(il numero di core CPU attualmente online).
Caratteristiche: usa getauxval(3) di libc
Nel livello API 18 e successivi,
getauxval(3)
è disponibile nella libreria C di Android. Gli argomenti AT_HWCAP
e AT_HWCAP2
restituiscono maschere di bit che elencano le funzionalità specifiche della CPU. Consulta le varie intestazioni hwcap.h
nell'NDK per le costanti con cui effettuare il confronto, ad esempio HWCAP_SHA512
per le istruzioni SHA512 di arm64 o HWCAP_IDIVT
per le istruzioni per la divisione intera del pollice di leva.
La libreria Google cpu_features
Un problema di AT_HWCAP
è che a volte i dispositivi sbagliano. Alcuni vecchi dispositivi, ad esempio, affermano di avere istruzioni di divisione per numeri interi, ma non lo fanno.
La libreria cpu_features di Google risolve questi problemi applicando le proprie conoscenze di SoC specifici (analizzando /proc/cpuinfo
per individuare il SoC specifico in questione).
Questa libreria è gestita per essere utilizzata dai team proprietari di app di Google e offre soluzioni alternative per ogni dispositivo problematico che hanno incontrato in natura.
Libreria CPU NDK (deprecata)
L'NDK fornisce comunque una libreria deprecata 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 ha soluzioni alternative per altrettanti SoC specifici.