Intereting Posts
Как обновить файлы с файлами (js css images) в приложении Android-телефона Android без обновления моего приложения в магазине Play / App Store Как программировать тему, чтобы быть похожим на диалог? Почему так много приложений для Android Studio Launcher? GoogleApiClient имеет дополнительный файл Plus.API и не подключен к Plus с новым знаком Google, представленным в Play Services 8.3 Предварительный просмотр резервной копии виджетов КлассNotFoundException после обновления ADT Пакет сталкивается с типом кода Java Как заставить Android-эмулятор работать быстро Ориентация на Android – проблемы с намерениями (камера) Сбой карты Google с помощью ресурсов $ NotFoundException при замене в FrameLayout Android – очистить список последних приложений (после длительного нажатия кнопки HOME) Затухание внизу прокручиваемого списка на Android? Volley onErrorResponse Дайте NullPointerException Продолжайте запускать приложение после автоматического блокировки экрана – Phonegap (Android / iOS) IndexOutOfBoundsException в TabLayout в дизайне поддержки Android

Как настроить таргетинг на различные архитектуры Android?

В настоящее время я использую библиотеку OpenCV (OpenCV4Android), которая не использует NDK (код C или C ++ отсутствует). Однако есть файлы .so для armeabi, armeabi-v7a, mips и x86. Если я включу все это в проект, размер приложения составляет 30 МБ, тогда как если бы я включил только 1, размер приложения – всего 9 МБ. Если я попытаюсь запустить приложение на устройстве, в котором не включен этот файл .so, он сработает, тогда как если у меня есть его .so-файл, он работает.

Поэтому я хочу выпустить несколько APK для разных архитектур устройств, чтобы уменьшить размеры файлов. Из того, что я видел, это можно сделать только в файле Application.mk, но в моей библиотеке нет. Есть ли другой способ настроить таргетинг на различные архитектуры Android?

В настоящее время я использую библиотеку OpenCV (OpenCV4Android), которая не использует NDK (код C или C ++ отсутствует). Однако есть файлы .so для armeabi, armeabi-v7a, mips и x86.

Как полагает immibis, если есть .so файлы, то он использует NDK.

Если я попытаюсь запустить приложение на устройстве, в котором не включен этот файл .so, он сработает, тогда как если у меня есть его .so-файл, он работает.

Это зависит от устройства. Многие устройства x86 имеют libhoudini , которые могут запускать двоичные файлы ARM NDK, хотя и медленнее, чем запускать собственные двоичные файлы x86. Аналогично, устройство armeabi-v7 может запускать двоичные файлы NDK из armeabi , хотя, возможно, медленнее, особенно если используется обработка с плавающей запятой.

Поэтому я хочу выпустить несколько APK для разных архитектур устройств, чтобы уменьшить размеры файлов. Из того, что я видел, это можно сделать только в файле Application.mk, но в моей библиотеке нет.

Файл Application.mk управляет только тем, что компилируется, а не тем, что распространяется.

Есть ли другой способ настроить таргетинг на различные архитектуры Android?

Используйте Gradle для Android, возможно, в сочетании с Android Studio и abi :

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

Закрытие abi закрытии splits :

  • Выбирает разные файлы APK на архитектуру процессора

  • Настраивает белый список архитектур, которые вы хотите

  • Также запрашивает «универсальный APK», который содержит все архитектуры, для использования с каналами распространения, которые не поддерживают отдельные APK по архитектуре

Результатом вашей сборки будет отдельный APK по архитектуре процессора, а также универсальный.

Каждый apk для приложения должен иметь уникальный код версии, указанный android:versionCode . Некоторые устройства x86 могут запускать двоичные файлы ARMv7. Поэтому, чтобы избежать использования ARKv7 apk для загрузки / использования на устройстве x86 (и подобных сценариев для других архитектур), вы должны заказать коды версий . Например, закажите коды версий так, чтобы x86 APK имел более высокий код версии, чем ARMv7. Подробнее о версировании по этой ссылке .

Образец build.gradle для создания уникальной версии кодированных apks для каждой архитектуры по вашему выбору разделяет ph0b в github . Копирование же ниже.

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

Предложение: документация по поддержке нескольких приложений для Android предлагает не использовать несколько apks, если размер apk меньше 50 МБ.

Обычно вы должны использовать несколько APK для поддержки различных конфигураций устройств только тогда, когда ваш APK слишком велик (более 50 МБ) из-за альтернативных ресурсов, необходимых для разных конфигураций устройств. Использование одного APK для поддержки различных конфигураций всегда является лучшей практикой, поскольку это упрощает и упрощает путь для обновлений приложений для пользователей (а также упрощает вашу жизнь, избегая сложностей разработки и публикации).

Я не рекомендую использовать этот шаблон для создания вашего номера сборки. ARCH – BUILD, потому что если в один прекрасный день вы захотите вернуться к одному APK, вам придется значительно увеличить свой код версии. Вместо этого вы можете следовать этому шаблону: BUILD – ARCH

 android.defaultConfig.versionCode * 100 + project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) 

Пример для сборки 74 номер сборки будет: 7402 – armeabi-v7a 7408 – x86