Как сделать Android-приложения, поддерживающие как 32-битную, так и 64-битную архитектуру?

Я только что получил и прочитал новостную рассылку из Google Play, в которой говорится, что со следующего года магазин "потребует, чтобы новые приложения и обновления приложений с собственными библиотеками предоставляли 64-разрядные версии в дополнение к их 32-разрядным версиям".

Для тех, кто еще не читал это, говорится:

Требование поддержки 64-разрядных в 2019 году

Поддержка платформы для 64-битных архитектур была представлена в Android 5.0. Сегодня более 40% устройств Android, подключенных к сети, поддерживают 64-разрядную версию, но при этом поддерживают 32-разрядную совместимость. Для приложений, использующих собственные библиотеки, 64-битный код обычно предлагает значительно лучшую производительность с дополнительными регистрами и новыми инструкциями.

В ожидании будущих устройств Android, которые будут поддерживать только 64-битный код, для консоли Play потребуется, чтобы новые приложения и обновления приложений с собственными библиотеками предоставляли 64-битные версии в дополнение к их 32-битным версиям. Это может быть один APK или один из нескольких опубликованных APK.

Мы не удаляем 32-битную поддержку. Google Play продолжит поддерживать 32-битные приложения и устройства. Приложения, которые не содержат нативный код, остаются без изменений.

Это изменение вступит в силу в августе 2019 года. Сегодня мы предоставляем предварительное уведомление, чтобы предоставить разработчикам, которые еще не поддерживают 64-разрядную версию, достаточно времени для планирования перехода. Следите за будущими публикациями, в которых мы подробно рассмотрим преимущества производительности 64-битных собственных библиотек на Android и ознакомимся с руководством по процессорам и архитектурам NDK для получения дополнительной информации.

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

Ответ 1

Согласно официальному электронному письму, отправленному командой Google Play, необходимо выполнить следующие действия:

Если вы еще этого не сделали, рекомендуем начать работу на 64-битной версии. Требование как можно скорее. Многие приложения полностью написаны на не родной код (например, язык программирования Java или Kotlin) и не нужно менять код.

Обратите внимание, что мы не вносим изменения в нашу политику на 32-разрядных служба поддержки. Google Play продолжит поставлять приложения с 32-битной нативной код для 32-битных устройств. Требование означает, что эти приложения будут нужно иметь 64-битную версию.

Чтобы помочь вам осуществить переход, мы подготовили документацию о том, как чтобы проверить, поддерживает ли ваше приложение 64-битные и как стать 64-разрядный.

We're also providing a high-level timeline below.

Итак, связанная документация объясняет:

Если ваше приложение использует только код, написанный на языке программирования Java или Kotlin, включая любые библиотеки или SDK, ваше приложение уже готово для 64-битные устройства. Если ваше приложение использует какой-либо нативный код, или вы не уверены, что это так, вам нужно будет оценить свое приложение и принять меры.

[...]

Самый простой способ проверить наличие 64-битных библиотек - это проверить структура вашего APK файла. После сборки APK будет упакован с любые собственные библиотеки, необходимые для приложения. Собственные библиотеки хранятся в различные папки на основе ABI. Не требуется поддерживать каждого 64-битная архитектура, но для каждой собственной 32-битной архитектуры вы Поддержка, вы должны включить соответствующую 64-разрядную архитектуру.

Для архитектуры ARM 32-битные библиотеки расположены в armeabi-v7a. 64-битный эквивалент - arm64-v8a.

For the x86 architecture, look for x86 for 32-bit и x86_64 for 64-bit.

Первое, что нужно сделать, это убедиться, что у вас есть собственные библиотеки в обоих из этих папок. [...]

Кроме того, для создания 64-битных библиотек необходимо выполнить следующие инструкции:

Большинство проектов Android Studio используют Gradle в качестве основной сборки система, так что этот раздел относится к обоим случаям. Включение сборок для Ваш нативный код так же прост, как добавление arm64-v8a и/или x86_64, в зависимости от архитектуры, которую вы хотите поддерживать, Настройка ndk.abiFilters в файле приложения build.gradle:

// Your app build.gradle
apply plugin: 'com.android.app'

android {
   compileSdkVersion 27
   defaultConfig {
       appId "com.google.example.64bit"
       minSdkVersion 15
       targetSdkVersion 28
       versionCode 1
       versionName "1.0"
       ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
// ...

Наконец, короткая заметка:

64-битная версия вашего приложения должна предлагать такое же качество и функция установлена как 32-битная версия.

Кстати, это официальное видео немного говорит об этом.

Ответ 2

Если у вас нет собственного (NDK) кода, то есть вы пишете только код Java/Dex, вам не нужно ничего делать.

Если у вас есть нативный код (или библиотеки), вам нужно предоставить их 64-битные версии.

Ответ 3

В соответствии с приведенной здесь документацией, если ваше приложение использует собственный код или внешнюю библиотеку, например, realm (на рисунке ниже), который основан на native, то должна быть обеспечена поддержка 64-битной версии. Если какая-либо из внешних библиотек в вашем приложении, использующая какой-либо C/C++ (нативный), должна иметь поддержку как 32-битной, так и 64-битной архитектуры, в противном случае вам следует связаться с владельцем библиотеки. В Android Studio мы можем проверить, доступны ли версии для обеих архитектур, с помощью Build> Analyze APK и появится следующее окно:

Android Studio tab showing avaiable architectures

Если вы используете NDK и создаете собственный код, вы должны обеспечить поддержку обеих архитектур, включив их в Gradle как:

defaultConfig {  
   ndk.abiFilters = 'armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64'
   }

Ответ 4

Если ваш Android APK не включает 64-битную поддержку, вам не о чем беспокоиться. Зайдите в Build → Analyze APK, в Android Studio. Вы можете увидеть структуру APK. В lib, если вы видите библиотеки armeabi-v7a и если у вас нет библиотек arm64-v8a или x86_64, то ваш APK не поддерживает 64-битную архитектуру.

Просто перейдите на уровень приложения build.gradle и добавьте abiFilters в NDK в defaultConfig как defaultConfig ниже:

ndk {
    abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
}

Ответ 5

Собственный код: относится к исполняемой программе, которая была скомпилирована непосредственно в инструкции процессора компьютера, на котором она запущена.

Не родной код: относится к исполняемой программе, которая была скомпилирована с инструкциями ЦП оригинальной архитектуры Tandem конца 1970-х и 1980-х годов. Когда такая программа запускается, она не может выполняться непосредственно на процессоре компьютера, на котором она запущена. Операционная система NonStop включает интерпретатор для этой оригинальной архитектуры Tandem, который используется для запуска такого не родного кода.

Если ваше приложение использует только код, написанный на языке программирования Java или Kotlin, включая любые библиотеки или SDK, ваше приложение уже готово для 64-разрядных устройств. Если ваше приложение использует какой-либо нативный код, или вы не уверены, что оно используется, вам необходимо оценить его и принять меры.

Использует ли ваше приложение нативный код?

Первое, что нужно сделать, это проверить, использует ли ваше приложение какой-либо нативный код. Ваше приложение использует нативный код, если оно:

  • использует любой код C/C++ (нативный) в вашем приложении.
  • ссылки с любыми сторонними библиотеками.
  • создается сторонним конструктором приложений, который использует собственные библиотеки.

Для получения дополнительной информации посетите документы.

Ответ 6

  • Вариант 1 - удалить lib из APK.
    • Шаг 1 - конвертировать APK в ZIP и найти папку lib; если у вас есть папка lib, смотрите зависимость библиотеки.
    • Шаг 2 - удалите зависимость из сборки Gradle.
  • Вариант 2 - Загрузите 64-разрядный и 32-разрядный файл JAR и добавьте его в папку lib в приложении и сборке.

Ответ 7

Добавление

ndk {
    abiFilters 'armeabi-v7a','arm64-v8a','x86','x86_64'
} 

в файле build.Gradle в разделе DefaultConfig. Обратите внимание, что 64-битное требование для магазина push to play наступает.