¿Por qué usar el código armeabi-v7a sobre el código armeabi?

141

En mi proyecto actual, utilizo múltiples archivos .so. Estos se encuentran en la carpeta armeabi y armeabi-v7a. Lamentablemente, uno de los archivos .so es de 6 MB y necesito reducir el tamaño del archivo. En lugar de tener un archivo APK gordo, me gustaría usar solo los archivos armeabi y eliminar la carpeta armeabi-v7a.

De acuerdo con la documentación del NDK, el código armeabi-v7a es un código armeabi extendido que puede contener instrucciones adicionales de la CPU. Todo esto va más allá de mi experiencia, pero me pregunto por qué a uno le gustaría tener el código armeabi-v7a y armeabi. Debe haber una buena razón para tener ambos, ¿verdad?

En mis dispositivos de prueba, todo esto parece funcionar bien. Estos tienen CPU ARM v7. ¿Es seguro asumir que todo funciona ahora?

PaulT
fuente
2
Es posible que desee leer esta publicación de blog ahora. Es completo y actualizado: androidbycode.wordpress.com/tag/armeabi-v7a
IgorGanapolsky
2
Y ahora el documento dice:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Amir Rezazadeh
1
Para aquellos que vienen más tarde, eche un vistazo aquí .
Amir Rezazadeh

Respuestas:

163

Depende de lo que haga su código nativo, pero v7a tiene soporte para operaciones de punto flotante de hardware, lo que hace una gran diferencia. Armeabi funcionará bien en todos los dispositivos, pero será mucho más lento y no aprovechará las capacidades de CPU de los dispositivos más nuevos. Tome algunos puntos de referencia para su aplicación en particular, pero eliminar los archivos binarios armeabi-v7a generalmente no es una buena idea. Si necesita reducir el tamaño, es posible que desee tener dos aplicaciones separadas para dispositivos más antiguos (armeabi) y más nuevos (armeabi-v7a).

Nikolay Elenkov
fuente
1
¿Dónde puedo encontrar la diferencia entre ambos ABI? Estoy muy interesado en comprender las diferencias reales ...
webshaker
1
¿Alguna idea sobre una solución elegante para conseguir que Google Play le permita cargar estos dos APK diferentes? No hay forma de diferenciar en el manifiesto que son diferentes, por lo que Google Play solo quiere reemplazar uno por otro (tienen códigos de versión diferentes)
Dean Wild
11
@DeanWild Google ahora ha agregado soporte para apuntar a diferentes arquitecturas de CPU en la función APK múltiple de Play Store: developer.android.com/guide/google/play/publishing/…
Charles Harley
1
@IgorGanapolsky, gracias por señalarlo. Este es ahora el enlace correcto: developer.android.com/google/play/publishing/…
Charles Harley
60

EABI = Interfaz binaria de aplicación integrada. Es en esas especificaciones que un ejecutable debe cumplir para poder ejecutarse en un entorno de ejecución específico. También especifica varios aspectos de compilación y vinculación necesarios para la interoperación entre cadenas de herramientas utilizadas para la arquitectura ARM. En este contexto, cuando hablamos de armeabi , hablamos de arquitectura ARM y sistema operativo GNU / Linux. Android sigue el little endian ARM GNU / Linux ABI.

La aplicación armeabi se ejecutará en ARMv5 (por ejemplo, ARM9) y ARMv6 (por ejemplo, ARM11). Puede usar el hardware de punto flotante si crea su aplicación utilizando las opciones adecuadas de GCC como -mfpu = vfpv3 -mfloat-abi = softfp que le dice al compilador que genere instrucciones de punto flotante para el hardware VFP y habilita las convenciones de llamada de flotación suave. armeabi no admite convenciones de llamada de flotación dura (significa que los registros FP no se utilizan para contener argumentos para una función), pero las operaciones FP en HW aún son compatibles.

La aplicación armeabi-v7a se ejecutará en dispositivos Cortex A # como Cortex A8, A9 y A15. Es compatible con procesadores multi-core y es compatible con -mfloat-abi = hard . Entonces, si construye su aplicación usando -mfloat-abi = hard , muchas de sus llamadas a funciones serán más rápidas.

psihodelia
fuente
1
De acuerdo con developer.android.com/ndk/guides/abis.html : The armeabi-v7a ABI uses the -mfloat-abi=softfp switch. Entonces, ¿qué quieres decir con soportes -mfloat-abi = hard ?
IgorGanapolsky
8

En lugar de tener un archivo APK gordo, me gustaría usar solo los archivos armeabi y eliminar la carpeta armeabi-v7a.

Lo contrario es una estrategia mucho mejor. Si tiene minSdkVersionque 14 y sube su apk a la Play Store, notará que admitirá la misma cantidad de dispositivos, ya sea que lo admita armeabio no. Por lo tanto, no hay dispositivos con Android 4 o superior que se beneficiarían armeabien absoluto.

Esta es probablemente la razón por la que Android NDK ya ni siquiera es compatible armeabisegún la revisión r17b. [ fuente ]

Cristan
fuente