Подтвердить что ты не робот

Как импортировать только выбранные ABI из исходной библиотеки из AAR?

У меня есть немного необычная проблема - мое приложение для Android содержит собственные библиотеки, и я создаю собственные libs для armeabi-v7a и x86. Однако теперь мне нужно интегрировать стороннюю библиотеку в мое приложение, которое также содержит собственные библиотеки (сторонняя библиотека Crashlytics, которую я включил через Maven из моей сборки. Gradle.). Проблема заключается в том, что сторонняя библиотека AAR предоставляет все архитектуры (armeabi, arm64-v8a, armeabi-v7a, mips, mips64, x86 и x86_64), и мое приложение поддерживает только armeabi-v7a и x86 (arm64-v8a запланировано на ближайшее будущее), поэтому, когда окончательный apk построен, он содержит стороннюю библиотеку всех ABI и только x86 и armeabi-v7a ABI моего собственного кода. Это приводит к сбою моего приложения при запуске на устройстве arm64, таком как Galaxy S6.

Мой вопрос: возможно ли включить только выбранный ABI из стороннего AAR?

Обратите внимание, что я знаю APK-расщепление, но это частично решает мою проблему, т.е. работает, только если я распространяю свое приложение через Play Store. Хотя Play Store поддерживает бета-тестирование, распространение обновленного APK довольно медленное, поэтому, прежде чем подталкивать обновление к бета-каналу PlayStore, мы выталкиваем обновление через бета-систему распространения Crashlytics, которая намного быстрее. Проблема в том, что система распределения Crashlytics не поддерживает разделение APK (или я ошибаюсь?). Поэтому мне действительно нужно создать "универсальный" APK, который будет содержать только выбранные ABI. Как достичь этого?

Хотя я был бы удовлетворен даже конкретными ответами Crashlytics (например, как распределять APK-расщепления через их бета-канал), я был бы гораздо более удовлетворен решением для создания "универсального" APK, который содержит только выбранные ABI, потому что в нашей компании мы также предоставляем SDK нашим клиентам в виде архивов AAR, которые содержат только поддерживаемые архитектуры, и мы хотели бы проинструктировать их о том, как обрабатывать случай, когда они интегрируют наш SDK с другими SDK, поддерживающими различные ABI.

Я использую последние стабильные версии Android studio (1.2.1.1), gradle 2.4 и android gradle версии 1.2.3.

4b9b3361

Ответ 1

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'
}

Ответ 2

Это работает для меня:

(например: только armeabi & armeabi-v7a)

build.gradle

android{
    defaultConfig{
        ndk{
            abiFilters "armeabi", "armeabi-v7a"
        }
    }
}

Ответ 3

Майк из Ткань и Crashlytics здесь. С Splits в настоящее время мы не знаем заранее, какую плотность предоставить тестер, поэтому просто добавьте эту строку к вашему конкретному вкусу или варианту, чтобы использовать созданный универсальный APK.

ext.betaDistributionApkFilePath = "путь к универсальному расколу APK"

Кроме того, если вы используете отчет о сбоях NDK, в случае, если он соответствует обнаруженному сбою, проверьте эту ссылку.

Ответ 4

У меня была такая же проблема, как и у вас, но вы на самом деле помогли мне с ссылкой, которую вы разместили об APK Splits ! В вашем случае попробуйте добавить следующее в свой build.gradle внутри закрытия android:

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

Хитрость заключается в том, чтобы установить для universalApk значение true, чтобы генерировать только один APK со всеми определенными архитектурами, а не разбивать их на несколько APK.

Также не забудьте reset() который удаляет все значения по умолчанию.