¿Cómo importar solo ABI de bibliotecas nativas seleccionadas desde AAR?


Tengo un problema poco inusual - mi aplicación para Android contiene libs nativas y construyo libs nativas para armeabi-v7a y x86. Sin embargo, ahora necesito integrar una biblioteca de terceros en mi aplicación que también contiene bibliotecas nativas (la biblioteca de terceros es Crashlytics que incluí a través de Maven desde mi compilación.gradle.). El problema es que el AAR de la biblioteca de terceros proporciona todas las arhitectures (armeabi, arm64-v8a, armeabi-v7a, mips, mips64, x86 y x86_64) y mi aplicación solo admite armeabi-v7a y x86 (arm64-v8a está previsto para un futuro cercano), por lo que cuando se construye el apk final, contiene todas las ABI de la biblioteca de 3rd party y solo las ABI de x86 y armeabi-v7a de mi código nativo. Esto hace que mi aplicación se bloquee cuando se inicia en el dispositivo arm64 como Galaxy S6.

Mi pregunta es: ¿es posible incluir solo ABI seleccionados de 3rd party AAR?

Tenga en cuenta que soy consciente de que APK divide , pero esto solo resuelve mi problema parcialmente, es decir, solo funciona si distribuyo mi aplicación a través de Play Almacenar. Aunque Play Store admite la distribución de pruebas beta, la propagación del APK actualizado es bastante lenta, por lo que antes de empujar una actualización al canal beta de PlayStore de la aplicación, empujamos una actualización a través del sistema de distribución beta de Crashlytics, que es mucho más rápido. El problema es que el sistema de distibution de Crashlytics no admite divisiones APK (¿o me equivoco?). Por lo tanto, realmente necesito construir un APK "universal" que contenga solo ABI seleccionados. Cómo lograr eso?

Aunque sería satisfecho incluso con las respuestas específicas de Crashlytics (como por ejemplo, cómo distribuir las divisiones APK a través de su canal beta), estaría mucho más satisfecho con la solución para construir APK "universal" que contiene solo ABI seleccionados, porque en nuestra empresa también proporcionamos SDK a nuestros clientes como archivos AAR que contienen solo arquitecturas compatibles y nos gustaría instruirles cómo manejar el caso cuando integran nuestro SDK con otros SDK que tienen diferentes ABI compatibles.

Yo soy usando la última versión estable de Android Studio (1.2.1.1), gradle 2.4 y android gradle plugin versión 1.2.3.

Author: DoDo, 2015-06-19

4 answers

packagingOptions {
    exclude 'lib/arm64-v8a/libcrashlytics-envelope.so'
    exclude 'lib/arm64-v8a/libcrashlytics.so'
    exclude 'lib/armeabi/libcrashlytics-envelope.so'
    exclude 'lib/armeabi/libcrashlytics.so'
    exclude 'lib/mips64/libcrashlytics-envelope.so'
    exclude 'lib/mips64/libcrashlytics.so'
    exclude 'lib/mips/libcrashlytics-envelope.so'
    exclude 'lib/mips/libcrashlytics.so'
    exclude 'lib/x86_64/libcrashlytics-envelope.so'
    exclude 'lib/x86_64/libcrashlytics.so'
    }
 19
Author: mksaint13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-11 18:52:09

Esto funciona para mí:

(por ejemplo: solo armeabi & armeabi-v7a )

Construir.gradle

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "armeabi-v7a"
        }
    }
}
 16
Author: Manuel Schmitzberger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-24 18:23:05

Mike de Fabric y Crashlytics aquí. Con Splits, actualmente, no sabemos de antemano qué densidad proporcionar al probador, así que solo agregue esta línea a su sabor o variante específica, para usar el APK universal que se genera.

Ext.betaDistributionApkFilePath = "ruta a la división universal APK"

Además, si estás usando NDK crash reporting, en caso de que coincida con el crash que estás viendo, echa un vistazo a este enlace.

 3
Author: Mike Bonnell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-19 20:14:01

Tuve el mismo problema que tú, pero en realidad me ayudaste con el enlace que publicaste sobre APK Splits! En su caso, intente agregar lo siguiente a su compilación.gradle dentro del cierre android:

    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'x86'
            universalApk true
        }
    }

El truco allí es establecer universalApk a true para generar solo un APK con todas las arquitecturas definidas, en lugar de dividirlas en varios APK.

 -3
Author: Jorge Galvão,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-14 20:25:36