Разделение Android ABI переносится в пакет приложений

Я планирую перейти с ABI split на функцию App Bundle. В настоящее время я использую этот код:

def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]

    splits {
        abi {
            enable true
            reset()
            include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
            // "armeabi", "mips", "mips64" last three not needed and not supported currently
            universalApk true
        }
    }

    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
            if (abi != null) {
                output.versionCodeOverride =
                        abi * 1000 + variant.versionCode
            }
        }
    }

что дает 4 APK на ABI (+ универсальный). Причиной использования этого кода является уменьшение размера приложения из-за PanoWidget (использует NDK) и

renderscriptTargetApi 28
renderscriptSupportModeEnabled true

После удаления разбивки конфигурации (+4001 к versionCode) и сборка Bundle я получил.aab файл, который конвертируется в.apks (используя bundletool) содержит папку standalones/, Внутри у меня есть четыре "вида" APK для x86, x86_64, armeabi-v7a и arm64-v8a ABI. На данный момент все выглядит хорошо.

Теперь я заметил, что код приложений не использует RenderScript вообще, так что я думаю, что это излишне использовать supportMode а также targetApi, Я удалил эти две строки, протестировал на устройствах / эмуляторе, все работает отлично. Итак, в следующий раз я создаю Bundle, и теперь у него нет версии APK для x86_64 внутри архива.apks... Должен ли он быть пропущен без RenderScript служба поддержки? Я все еще использую VrPanoramaView и он, вероятно, имеет какой-то конкретный код NDK для каждого ABI (не вижу на GitHub)... К сожалению, у меня нет устройства x86 (32 или 64) для тестирования, и я боюсь выпустить этот Bundle... Мне не хватает чего-нибудь, мне вообще нужна версия _64?

1 ответ

Решение

Редактировать:

Удаление этих двух параметров в build.gradle удалит собственные библиотеки, которые использовались RenderScript: librsjni.so а также libRSSupport.so, Эти две библиотеки будут удалены для всех ABI.

Поскольку после отключения RenderScript у вас по-прежнему есть 3 ABI, похоже, что ваше приложение зависит от других библиотек, которые используют собственный код, но не предоставляют библиотеки для архитектуры x86_64, поэтому каталог x86_64 исчезает. Это, вероятно, означает, что ваше приложение никогда не работало должным образом на x86_64 раньше, так как каталог x86_64 будет загружен платформой, но некоторые собственные библиотеки будут отсутствовать.

В конце концов, вы должны определить, какая библиотека содержит эти собственные библиотеки, и посмотреть, могут ли они также создать 64-разрядную версию, но в краткосрочной перспективе ничего не сломается, поскольку устройства x86_64 также поддерживают библиотеки x86 (32-разрядные).

Предыдущий пост:

Если у тебя есть *.bc файлы в вашем APK, 64-битные библиотеки удаляются из APK, потому что эти файлы RenderScript являются только 32-битными и не могут быть загружены в 64-битном процессе.

Если вы перейдете на более новую версию RenderScript, *.bc файлы не будут сгенерированы, и 64-битные собственные библиотеки будут снова присутствовать в APK. Или, если вам вообще не нужен RenderScript, удалите эти файлы полностью.

Другие вопросы по тегам