¿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?

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

  • Objeto global de la aplicación Android
  • Erro de Xalan.jar al crear un proyecto android
  • Mostrando la mañana, la tarde, la noche, la noche mensaje basado en Tiempo en Java
  • Poner ArrayList en param JsonObject
  • Android y Javadoc: @inheritDoc no funciona
  • ¿Usando la cadena del recurso XML en el interruptor?
  • Java.lang.SecurityException: Necesita permiso de BLUETOOTH: Ni el usuario 10065 ni el proceso actual tiene android.permission.BLUETOOTH
  • ¿Cómo agregar una biblioteca dinámica a Android?
  • Servicio de Android Creación de una nueva instancia de clase Singleton
  • "Java.lang.NullPointerException" al intentar instalar Android SDK
  • Java libgdx mover la cámara de perspectiva
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.