Т.к. в сети информации толком нет (ну или я просто не умею её искать), то решил написать эту статью, чтоб исправить это.
Введение
Речь пойдёт про установку конкретно 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
или он может называться как-то иначе, поэтому вам следует по косвенным признакам понимать, что и где должно располагаться.