Сборка для 32-битных и 64-битных архитектур.

Система сборки поддерживает сборку двоичных файлов для двух целевых архитектур ЦП: 32- и 64-битной в рамках одной сборки. Такая сборка для двух целевых архитектур называется мультибиблиотечной сборкой .

Для встроенных статических библиотек и общих библиотек система сборки устанавливает правила сборки двоичных файлов для обеих архитектур. Конфигурация продукта ( PRODUCT_PACKAGES ) вместе с графом зависимостей определяет, какие двоичные файлы собираются и устанавливаются в образ системы.

Для исполняемых файлов и приложений система сборки по умолчанию собирает только 64-разрядную версию, но вы можете переопределить этот параметр с помощью глобальной переменной BoardConfig.mk или переменной области действия модуля.

Определите вторую архитектуру ЦП и ABI

BoardConfig.mk включает следующие переменные для настройки архитектуры второго ЦП и двоичного интерфейса приложения (ABI):

  • TARGET_2ND_ARCH
  • TARGET_2ND_ARCH_VARIANT
  • TARGET_2ND_CPU_VARIANT
  • TARGET_2ND_CPU_ABI
  • TARGET_2ND_CPU_ABI2

Пример makefile, использующего эти переменные, см. в build/make/target/board/generic_arm64/BoardConfig.mk .

В многобиблиотечной сборке имена модулей в PRODUCT_PACKAGES охватывают как 32-битные, так и 64-битные двоичные файлы, если они определены системой сборки. Для библиотек, включённых через зависимость, 32-битная или 64-битная библиотека устанавливается только в том случае, если она требуется другой 32-битной или 64-битной библиотеке или исполняемому файлу.

Однако имена модулей в командной строке make относятся только к 64-битной версии. Например, после выполнения lunch aosp_arm64-eng make libc соберёт только 64-битную версию libc. Для сборки 32-битной версии libc необходимо выполнить команду make libc_32 .

Определить архитектуру модуля в Android.mk

Вы можете использовать переменную LOCAL_MULTILIB для настройки сборки для 32- и 64-битной версии и переопределить глобальную переменную TARGET_PREFER_32_BIT .

Чтобы переопределить TARGET_PREFER_32_BIT , установите для LOCAL_MULTILIB одно из следующих значений:

  • both сборки как 32-битные, так и 64-битные.
  • 32 сборки только 32 бит.
  • 64 сборки только 64 бит.
  • first сборки только для первой архитектуры (32-битной на 32-битных устройствах и 64-битной на 64-битных устройствах).

По умолчанию LOCAL_MULTILIB не установлен, и система сборки решает, какую архитектуру собирать, на основе класса модуля и других переменных LOCAL_ * , таких как LOCAL_MODULE_TARGET_ARCH и LOCAL_32_BIT_ONLY .

Если вы хотите создать свой модуль для конкретных архитектур, используйте следующие переменные:

  • LOCAL_MODULE_TARGET_ARCH — задайте для этой переменной список архитектур, например, arm x86 arm64 . Если собираемая архитектура есть в этом списке, текущий модуль включается в систему сборки.

  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH — эта переменная противоположна LOCAL_MODULE_TARGET_ARCH . Если собираемая архитектура not в этом списке, текущий модуль включается системой сборки.

Существуют незначительные вариации этих двух переменных:

  • LOCAL_MODULE_TARGET_ARCH_WARN
  • LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN

Система сборки выдает предупреждение, если текущий модуль пропущен из-за перечисленных архитектур.

Чтобы настроить флаги сборки для конкретной архитектуры, используйте специфичные для архитектуры переменные LOCAL_ * , где * — суффикс, специфичный для архитектуры, например:

  • LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,
  • LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,
  • LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,

Эти переменные применяются только в том случае, если для данной архитектуры собирается двоичный файл.

Иногда проще установить флаги в зависимости от того, собирается ли исполняемый файл для 32- или 64-битной версии. Используйте переменную LOCAL_ * с суффиксом _32 или _64 , например:

  • LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,
  • LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,
  • LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,

Установить путь установки библиотеки

Для сборки без поддержки multilib можно использовать LOCAL_MODULE_PATH для установки библиотеки в папку, отличную от папки по умолчанию. Например, LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw .

Однако в сборке multilib вместо этого используйте LOCAL_MODULE_RELATIVE_PATH :

LOCAL_MODULE_RELATIVE_PATH := hw

При использовании этого формата и 64-битные, и 32-битные библиотеки устанавливаются в правильном месте.

Если вы создаете исполняемый файл как 32-разрядный и 64-разрядный, используйте одну из следующих переменных для различения пути установки:

  • LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64 — указывает имя установленного файла.
  • LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64 — указывает путь установки.

Получить промежуточный каталог для исходных файлов

В многобиблиотечной сборке, если вы генерируете исходные файлы в $(local-intermediates-dir) (или $(intermediates-dir-for) с явными переменными), это работает ненадёжно. Это связано с тем, что промежуточно сгенерированные исходные файлы требуются как для 32-битной, так и для 64-битной сборки, но $(local-intermediates-dir) указывает только на один из двух промежуточных каталогов.

Система сборки предоставляет специальный промежуточный каталог для генерации исходных кодов, совместимый с несколькими библиотеками. Чтобы получить путь к промежуточному каталогу, используйте макрос $(local-generated-sources-dir) или $(generated-sources-dir-for) . Применение этих макросов аналогично $(local-intermediates-dir) и $(intermediates-dir-for) .

Если исходный файл создается в этом выделенном каталоге и выбирается LOCAL_GENERATED_SOURCES , то он собирается как для 32-битной, так и для 64-битной версии в многобиблиотечной сборке.

Укажите архитектуру системы готовых бинарных целей

В сборке с несколькими библиотеками нельзя использовать TARGET_ARCH или TARGET_ARCH в сочетании с TARGET_2ND_ARCH для указания системной архитектуры готовых двоичных целевых объектов. Вместо этого используйте переменные LOCAL_ * LOCAL_MODULE_TARGET_ARCH или LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH .

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

Если вы хотите использовать выбранную архитектуру для вычисления исходного пути для предварительно собранного двоичного файла, вызовите $(get-prebuilt-src-arch) .

Обеспечить генерацию 32- и 64-битных файлов ODEX

Для 64-битных устройств Google по умолчанию генерирует как 32-битные, так и 64-битные ODEX-файлы для загрузочного образа и любых библиотек Java. Для APK-файлов Google по умолчанию генерирует ODEX только для основной 64-битной архитектуры. Если приложение запускается как в 32-битном, так и в 64-битном процессе, используйте LOCAL_MULTILIB := both , чтобы гарантировать создание как 32-битных, так и 64-битных ODEX-файлов. Если в приложении есть 32-битные или 64-битные JNI-библиотеки, этот флаг также указывает системе сборки включить их.