¿Cómo orientar diferentes arquitecturas Android?
Estoy utilizando actualmente la biblioteca de OpenCV (OpenCV4Android) que no utiliza el NDK (no hay código de C o de C ++). Sin embargo, hay archivos .so para armeabi, armeabi-v7a, mips y x86. Si incluyo todos estos en el proyecto, el tamaño de la aplicación es de 30 MB, mientras que si incluyo sólo 1, el tamaño de la aplicación es de sólo 9 MB. Si intento ejecutar la aplicación en un dispositivo que no tiene el archivo .so de arquitectura de ese dispositivo incluido, se bloquea, mientras que si tengo su archivo .so incluido, funciona.
Por lo tanto, estoy deseando liberar varios APK a diferentes arquitecturas de dispositivos para reducir el tamaño de los archivos. Por lo que he visto, esto sólo se puede hacer en el archivo Application.mk, pero mi biblioteca no tiene uno. ¿Hay otra manera de enfocar diferentes arquitecturas de Android?
- Cómo imprimir todas las claves y valores de HashMap en Android?
- Conexión Bluetooth de Android: falla en la detección del servicio
- ¿Cómo es que Android AsyncTask no implementa el futuro?
- Conversión de una cadena en un entero en Android
- Alinear 2 textos, 1 normal, 1 opuesto
- NoClassDefFoundError en Android
- HttpURLConnection - "https: //" frente a "http: //"
- Android obtiene Bitmap Rect (izquierda, arriba, derecha, abajo) en una lona
- No se puede encontrar la clase de símbolo onClickListener
- Enviar notificación a un tema específico en Firebase en Java
- Anuncios Admob nativos en RecyclerView
- Cómo obtener versionCode y VersionName de Google Play
- Java.util.ConcurrentModificationException en las pruebas de JUnit
Estoy utilizando actualmente la biblioteca de OpenCV (OpenCV4Android) que no utiliza el NDK (no hay código de C o de C ++). Sin embargo, hay archivos .so para armeabi, armeabi-v7a, mips y x86.
Como immibis lo puso, si hay archivos .so
, entonces está utilizando el NDK.
Si intento ejecutar la aplicación en un dispositivo que no tiene el archivo .so de arquitectura de ese dispositivo incluido, se bloquea, mientras que si tengo su archivo .so incluido, funciona.
Eso depende del dispositivo. Muchos dispositivos x86 tienen libhoudini
, que puede ejecutar binarios ARM NDK, aunque con más lentitud que ejecutar binarios nativos x86. De manera similar, un dispositivo armeabi-v7
puede ejecutar binarios armeabi
NDK, aunque tal vez más lentamente, en particular si se utiliza el procesamiento de punto flotante.
Por lo tanto, estoy deseando liberar varios APK a diferentes arquitecturas de dispositivos para reducir el tamaño de los archivos. Por lo que he visto, esto sólo se puede hacer en el archivo Application.mk, pero mi biblioteca no tiene uno.
El archivo Application.mk
sólo controla lo que se obtiene compilado, no lo que se distribuye.
¿Hay otra manera de enfocar diferentes arquitecturas de Android?
Usa Gradle para Android, quizás en conjunto con Android Studio, y la división abi
:
android { ... splits { abi { enable true reset() include 'x86', 'armeabi-v7a', 'mips' universalApk true } } }
El cierre del abi
en el cierre de las splits
:
-
Opta por tener diferentes archivos APK por arquitectura de CPU
-
Configura una lista blanca de las arquitecturas que desea
-
También solicita un "APK universal" que contiene todas las arquitecturas, para su uso con canales de distribución que no soportan APKs separados por arquitectura
El resultado de su compilación será APKs separados por la arquitectura de la CPU, más el universal.
Cada apk para la aplicación debe tener código de versión único especificado por android:versionCode
. Algunos dispositivos x86 pueden ejecutar binarios ARMv7. Por lo tanto, para evitar un caso de ARMv7 apk obtener descargado / utilizado en el dispositivo x86 (y escenarios similares para otras arquitecturas), debe pedir los códigos de versión . Por ejemplo, pida los códigos de versión para que el APK x86 tenga un código de versión superior que ARMv7. Más información sobre el control de versiones en este enlace .
Un ejemplo build.gradle
para crear apks codificados con una versión única para cada arquitectura de su elección es compartido por ph0b en github . Copiando lo mismo a continuación.
splits { abi { enable true reset() include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for universalApk true //generate an additional APK that contains all the ABIs } } // map for the version code project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9] android.applicationVariants.all { variant -> // assign different version code for each output variant.outputs.each { output -> output.versionCodeOverride = project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 + android.defaultConfig.versionCode } }
Sugerencia: La documentación de soporte múltiple de Android apk sugiere no usar apks múltiples si el tamaño de apk es menor que 50mb.
Por lo general, debe utilizar APK múltiples para admitir diferentes configuraciones de dispositivos sólo cuando su APK es demasiado grande (superior a 50 MB) debido a los recursos alternativos necesarios para las diferentes configuraciones de dispositivos. El uso de un único APK para admitir diferentes configuraciones es siempre la mejor práctica, ya que facilita y simplifica la ruta para las actualizaciones de aplicaciones para los usuarios (y también simplifica la vida al evitar la complejidad de desarrollo y publicación).
No recomiendo usar este patrón para construir su número de compilación. ARCH – BUILD, porque si un día quieres volver a un APK, tendrás que aumentar tu versionCode mucho. En su lugar puede seguir este patrón: BUILD – ARCH
android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0)
Exemple for build 74 el número de build será: 7402 – armeabi-v7a 7408 – x86
- Iterar a través de un directorio especificado en Android
- Android (3.0) La barra de acción no quiere ir