2011-08-16 14 views
120

Nel mio progetto corrente uso più file .so. Questi si trovano nella cartella armeabi e armeabi-v7a. Sfortunatamente uno dei file .so è un 6MB e devo ridurre le dimensioni del file. Invece di avere un file APK grasso, vorrei usare solo i file armeabi e rimuovere la cartella armeabi-v7a.Perché utilizzare il codice armeabi-v7a su codice armeabi?

In base alla documentazione NDK, il codice armeabi-v7a è un codice armeabi esteso che può contenere istruzioni CPU aggiuntive. Tutto ciò va oltre la mia esperienza, ma mi chiedo perché si vorrebbe avere sia il codice armeabi-v7a che il codice armeabi. Ci deve essere una buona ragione per averli entrambi, giusto?

Sui miei dispositivi di test tutto sembra funzionare correttamente. Questi hanno CPU ARM v7. È sicuro assumere che tutto funzioni ora?

+1

Si consiglia di dare a questo post del blog una lettura ora. È completo e aggiornato: https://androidbycode.wordpress.com/tag/armeabi-v7a/ –

risposta

139

Dipende da ciò che fa il codice nativo, ma v7a ha il supporto per operazioni hardware in virgola mobile, il che fa una grande differenza. armeabi funzionerà correttamente su tutti i dispositivi, ma sarà molto più lento e non sfrutterà le funzionalità della CPU dei nuovi dispositivi. Prendi alcuni punti di riferimento per la tua particolare applicazione, ma la rimozione dei binari armeabi-v7a non è generalmente una buona idea. Se hai bisogno di ridurre le dimensioni, potresti voler avere due apk separati per i dispositivi più vecchi (armeabi) e più recenti (armeabi-v7a).

+0

Grazie per la tua risposta chiara. Sarà una buona idea fare benchmark anche per dividere l'applicazione in 2 file APK. Quest'ultima è in realtà una buona idea! Grazie molto! – PaulT

+1

Dove posso trovare la differenza tra i due ABI? Sono molto istintato per capire le differenze reali ... – webshaker

+7

manuali ARM? http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Cacciced.html –

55

EABI = Interfaccia binario dell'applicazione incorporata. Sono tali specifiche a cui un eseguibile deve conformarsi per poter eseguire in un ambiente di esecuzione specifico. Specifica inoltre vari aspetti della compilazione e del collegamento richiesti per l'interoperabilità tra le toolchain utilizzate per l'architettura ARM. In questo contesto quando parliamo di armeabi parliamo dell'architettura ARM e del sistema operativo GNU/Linux. Android segue il little-endian ARM GNU/Linux ABI.

L'applicazione armeabi verrà eseguita su ARMv5 (ad esempio ARM9) e ARMv6 (ad esempio ARM11). È possibile utilizzare l'hardware Floating Point se si crea l'applicazione utilizzando le opzioni GCC appropriate come -mfpu = vfpv3 -mfloat-abi = softfp che indica al compilatore di generare istruzioni in virgola mobile per l'hardware VFP e abilita le convenzioni di chiamata flottante. armeabi non supporta le convenzioni di chiamata hard-float (significa che i registri FP non sono usati per contenere argomenti per una funzione), ma le operazioni FP in HW sono ancora supportate.

L'applicazione armeabi-v7a verrà eseguita su dispositivi Cortex A # come Cortex A8, A9 e A15. Supporta processori multi-core e supporta -mfloat-abi = hard. Quindi, se costruisci la tua applicazione usando -mfloat-abi = hard, molte delle tue chiamate di funzione saranno più veloci.

+0

Secondo https://developer.android.com/ndk/guides/abis.html : 'L'ABI armeabi-v7a utilizza l'opzione -mfloat-abi = softfp'. Quindi cosa intendi per ** supporta -mfloat-abi = difficile **? –

Problemi correlati