LINUX.ORG.RU

Waydroid: ручная установка native bridge

 ,


1

2

Т.к. в сети информации толком нет (ну или я просто не умею её искать), то решил написать эту статью, чтоб исправить это.

Введение

Речь пойдёт про установку конкретно houdini. В сети есть скрипты для автоматической установки, которые нужно запускать от рута, но описания что конкретно они делают к ним нет, поэтому у меня не возникло к ним доверия и я решил разобраться что да как.

Многим играм и программам для андроид требуется архитектура arm для работы. Houdini — это набор библиотек-трансляторов, которые позволят запускать их на архитектуре x86 и x86_64. Эти библиотеки были взяты из образов андроид от майкрософт. Есть аналогичный набор библиотек NDK, которые были взяты из образов андроид от гугла.

В данном примере я буду использовать houdini для Android 11, который идёт в штатной поставке waydroid. Там используется образ Lineage OS, но сути это не изменит.

Для начала скачиваем сами библиотеки. Например, отсюда https://github.com/supremegamers/vendor_intel_proprietary_houdini В данном случае нас будет интересовать содержимое каталога prebuilts.

Теория

Для продолжения нам необходимо понимать общие принципы некоторых вещей. Таких, как binfmt_misc и система инициализации андроид.

binfmt_misc

https://docs.kernel.org/admin-guide/binfmt-misc.html

binfmt_misc — это механизм ядра Linux, который, в числе прочего, позволяет упростить запуск программ, скомпилированных для другой архитектуры. Для этого необходимо настроить запуск таких программ через транслятор или эмулятор. Работает это следующим образом. Сначала в /proc/sys/fs/binfmt_misc монтируется специальная файловая система. После этого можно настраивать этот механизм с помощью файла /proc/sys/fs/binfmt_misc/register. Для этого в этот файл записывается специальное «сообщение», которое в нашем случае содержит магическую строку и путь до транслятора. Магическая строка — это последовательность байт, которую ядро ищет в начале исполняемого файла и если она совпадает с одной из зарегистрированных, то для запуска этой программы используется указанный транслятор.

Android init system

https://android.googlesource.com/platform/system/core/+/master/init/README.md

Теперь система инициализации андроид (далее просто «инит»). При запуске инит читает специальные .rc файлы и выполняет действия, которые указаны в этих файлах — монтирование файловых систем, запуск сервисов и ещё много всякого разного. Эти файлы могут располагаться в различных местах, но нас будут интересовать каталоги /system/etc/init/ и /ventor/etc/init/. Мы можем использовать инит в том числе и для настройки binfmt_misc. Вот содержимое файла /prebuilts/etc/init/houdini.rc:

# Enable native bridge for target executables
on early-init
    mount binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc

on property:ro.enable.native.bridge.exec=1
    copy /vendor/etc/binfmt_misc/arm_exe /proc/sys/fs/binfmt_misc/register
    copy /vendor/etc/binfmt_misc/arm_dyn /proc/sys/fs/binfmt_misc/register

on property:ro.enable.native.bridge.exec64=1
    copy /vendor/etc/binfmt_misc/arm64_exe /proc/sys/fs/binfmt_misc/register
    copy /vendor/etc/binfmt_misc/arm64_dyn /proc/sys/fs/binfmt_misc/register

В этом файле прописаны команды для инита для настройки binfmt_misc. На этапе early-init выполняется монтирование /proc/sys/fs/binfmt_misc. А ниже указаны команды для настройки binfmt_misc. Например, если в .prop файле (об этом позже) прописана строчка ro.enable.native.bridge.exec=1, то содержимое файлов arm_exe и arm_dyn будет записано в файл /proc/sys/fs/binfmt_misc/register. Для примера, содержимое файла arm_exe:

:arm_exe:M::\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28::/system/bin/houdini:P

Тут:

  • arm_exe — это имя регистрации,
  • \x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28 — это магическая строка байт
  • /system/bin/houdini — это путь до транслятора.

Таким образом, если сам файл программы начинается с байтов, указанных в магической строке, то запуск такой программы будет выполняться не как обычно напрямую, а с помощью указанного транслятора. Аналогичным образом в системах линукс можно на обычном компьютере настроить запуск программ через qemu и запускать бинарники, которые собраны для другой архитектуры.

build.brop

Ну и файл build.brop. Это такой файл в системах андроид, в котором прописаны различные настройки системы. В нашем случае это будет файл waydroid_base.prop из которого при запуске будет генрироваться waydroid.prop, содержимое которого уже будет иметь значение для запущенной системы.

Waydroid

Теперь немного информации о каталогах самого waydroid. Системные каталоги waydroid расположены в /var/lib/waydroid/. Нас будет интересовать каталог overlay и файл waydroid_base.prop. Содержимое каталога overlay накладывается на корневую файловую систему внутри контейнера waydroid. Это позволит подсунуть всё необходимое, не трогая при этом образы.

Ради интереса можете запустить waydroid (например, командой waydroid show-full-ui), набрать в консоли от рута waydroid shell и поизучать файловую систему внутри самого андроида. Обратите внимание на содержимое каталогов /system и /vendor. Наберите команду mount и посмотрите что и куда монтируется. Когда закончите изучение, остановите waydroid (waydroid session stop) и перейдём к установке.

Установка

Установка сводится к тому, чтоб закинуть содержимое каталога prebuilts в overlay и дописать десяток строчек в waydroid_base.prop. Работайте от рута, иначе вам не хватит прав. Начнём с закидывания файлов.

Сначала создайте каталог /var/lib/waydroid/overlay/system. Теперь копируем содержимое prebuilts:

  • etc копируем в /var/lib/waydroid/overlay/vendor/
  • Остальные каталоги (bin, lib, lib64) копируем в /var/lib/waydroid/overlay/system/

Теперь открываем файл /var/lib/waydroid/waydroid_base.prop и дописываем в конец следующее:

ro.enable.native.bridge.exec=1
ro.enable.native.bridge.exec64=1
ro.product.cpu.abilist=x86_64,x86,arm64-v8a,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=x86_64,arm64-v8a
ro.dalvik.vm.native.bridge=libhoudini.so
ro.dalvik.vm.isa.arm=x86
ro.dalvik.vm.isa.arm64=x86_64

На этом установка завершена. Запустите waydroid и снова изучите файловую систему внутри с помощью waydroid shell. Теперь вы должны увидеть только что скопированные файлы внутри системы. Программы и игры, которые раньше отказывались устанавливаться, теперь должны устаналиваться без проблем. Работать будет не всё, но многое.

Послесловие

Теперь пояснения на тему что и куда копировать. Как писалось выше, вся суть заключается в том, чтоб скопировать всё необходимое в файловую систему внутри waydroid. Обратите внимание, что в файле houdini.rc фигурируют пути /vendor/etc/binfmt_misc/, поэтому etc/binfmt_misc/ следует копировать в /vendor. В файлах arm_exe, arm_dyn и т.д. фигурируют пути /system/bin/, поэтому бинарники и библиотеки следует копировать в /system. Суть в том, что в других репозиториях, которые вы найдёте в сети, может не быть каталога prebuilts или он может называться как-то иначе, поэтому вам следует по косвенным признакам понимать, что и где должно располагаться.

★★

Проверено: maxcom ()
Последнее исправление: maxcom (всего исправлений: 6)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.