Android в QubesOS. Waydroid template.
Это руководство предназначено для создания шаблона Waydroid, который можно использовать для создания AppVM на его основе. Образ Android и устанавливается в шаблон, а приложения и их конфигурация будет установлена в AppVMs. Это руководство предназначено для настройки минимального шаблона Waydroid.
Создём шаблон Waydroid qube.
Устанавливаем шаблон debian-12-minimal
с помощью инструмента «Qubes Template Manager», если у вас его еще нет.
https://gekkk.co/i/acf7fc32c1ab6ae2f51e175f9ee19c0a

https://gekkk.co/i/4b8e81cb3680d76cc6459ce76651246c

https://gekkk.co/i/53c3c472ab5ddf68777c3a0611eb2fd0

https://gekkk.co/i/11a2183f1ea521f563ca28caa3c5f135

Обновляем шаблон debian-12-minimal
с помощью инструмента "Qubes Update".
https://gekkk.co/i/047de0667452aef6a645eed31112b6bd

Клонируем шаблон debian-12-minimal
и называем его d12m-waydroid
.
https://gekkk.co/i/40a31c6f661e0e37df93521910167d01

Добавляем ярлык меню по умолчанию приложения Waydroid к созданным кубам.
Чтобы добавить ярлык меню приложения Waydroid к вновь созданным кубам, вам необходимо установить функцию default-menu-items
для шаблона Waydroid. Откройте терминал dom0
и выполните эту команду, чтобы установить пункты меню App по умолчанию для qubes на основе этого шаблона:
qvm-features d12m-waydroid default-menu-items "Waydroid-Sway.desktop debian-xterm.desktop"
Настройка шаблона Waydroid.
Запускаем куб d12m-waydroid
и открываем его root терминал с помощью команды в терминале dom0:
qvm-run -u root d12m-waydroid xterm &
Все команды в этом руководстве должны быть выполнены в root терминале d12m-waydroid
, если не указано иное.
https://gekkk.co/i/eb3addaf29b0a0666e40a9ddbc735151

Устанавливаем необходимые пакеты для Waydroid.
Waydroid нужен Wayland, поэтому устанавливаем для него композитор sway
Wayland:
apt install -y sway
Также нужен пакет qubes-core-agent-networking
для обеспечения работы в сети в кубе:
apt install -y qubes-core-agent-networking
Устанавливаем Waydroid.
Выполните следующие команды для установки Waydroid:
apt install -y ca-certificates extrepo
https_proxy=http://127.0.0.1:8082 http_proxy=http://127.0.0.1:8082 extrepo enable waydroid
apt update
apt install -y waydroid
apt install -y --no-install-recommends pipewire-pulse
Для работы Waydroid требуется пакет pulseaudio
или pipewire-pulse
. Установка использует пакет extrepo
вместо загрузки скрипта оболочки из waydro.id и его запуска.
Настраиваем запрет запуска контейнера Waydroid в TemplateVMs:
mkdir -p /etc/systemd/system/waydroid-container.service.d
cat << 'EOF' | tee /etc/systemd/system/waydroid-container.service.d/override.conf >/dev/null
[Unit]
ConditionPathExists=!/run/qubes/this-is-templatevm
EOF
Инициализируем Waydroid.
Эта команда для инициализации Waydroid, загржает образ VANILLA Android:
https_proxy=http://127.0.0.1:8082 http_proxy=http://127.0.0.1:8082 waydroid init
Устанавливаем поддержку буфера обмена Waydroid.
Настройка автоматической передачи содержимого буфера обмена между X11 и Wayland.
Нам нужно собрать и установить инструмент clipnotify из исходников, чтобы использовать его для получения событий изменения буфера обмена X11. Вы можете собрать его в каком-то другом qube на основе того же шаблона и скопировать собранные двоичные файлы в d12m-waydroid qube и установить их там, чтобы шаблон d12m-waydroid был минимальным, или вы можете собрать его в самом d12m-waydroid
qube, но вам потребуется установить дополнительные пакеты для сборки. Этот пример относится ко второму варианту.
Используем для загрузки исходников git:
apt install -y git
git config --global http.proxy http://127.0.0.1:8082
git clone https://github.com/cdown/clipnotify.git
git config --global http.proxy ""
После получения исходников в d12m-waydroid
qube, переходим в каталог источников clipnotify в d12m-waydroid qube:
cd clipnotify
После этого собираем и устанавливаем clipnotify:
apt install -y build-essential libx11-dev libxtst-dev
mkdir -p /opt/bin
sed -i "s|/usr/local|/opt|g" Makefile
make
make install
echo 'export PATH="/opt/bin:$PATH"' >> /etc/profile.d/opt-bin.sh
Устанавливаем инструменты интерфейса доступа X11 и Wayland:
apt install -y xclip wl-clipboard
Настраиваем sway для запуска скрипта, который будет автоматически передавать содержимое буфера обмена между X11 и Wayland при старте sway:
echo "exec /opt/bin/x11-wl-clip.sh" > /etc/sway/config.d/99-x11-wl-clip.conf
mkdir -p /opt/bin
cat << 'EOF' | tee /opt/bin/x11-wl-clip.sh >/dev/null
#!/bin/bash
x11_wl='while DISPLAY=":0" clipnotify -s clipboard; do xclip -d ":0" -selection clipboard -o | wl-copy; done'
wl_x11='wl-paste -nw xclip -d ":0" -selection clipboard'
eval "${x11_wl}" &>/dev/null &
eval "${wl_x11}" &>/dev/null
pstree -A -p $$ | grep -Eow "[0-9]+" | xargs kill &>/dev/null
EOF
Выдаём скрипту права на выполнение.
chmod +x /opt/bin/x11-wl-clip.sh
Устанавливаем pyclip, необходимый для Waydroid.
apt install -y xclip wl-clipboard pip python3-venv
python3 -m venv /opt/venv/pyclip
source /opt/venv/pyclip/bin/activate
pip install --proxy http://127.0.0.1:8082 pyclip
deactivate
echo 'export PATH="$PATH:/opt/venv/pyclip/bin"' >> /etc/profile.d/python-venv.sh
echo 'export PYTHONPATH="$PYTHONPATH:/opt/venv/pyclip/lib/python3.11/site-packages"' >> /etc/profile.d/python-venv.sh
Настраиваем межсетевой экран для Waydroid.
cat << 'EOF' | tee /etc/systemd/system/waydroid-firewall.service >/dev/null
[Unit]
ConditionPathExists=!/run/qubes/this-is-templatevm
PartOf=waydroid-container.service
After=waydroid-container.service
BindsTo=waydroid-container.service
Requires=qubes-iptables.service
After=qubes-iptables.service
BindsTo=qubes-iptables.service
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "if (nft create chain ip qubes waydroid-input) &>/dev/null; then nft add rule ip qubes custom-input jump waydroid-input; fi"
ExecStart=/usr/bin/bash -c "if (nft create chain ip qubes waydroid-forward) &>/dev/null; then nft add rule ip qubes custom-forward jump waydroid-forward; fi"
ExecStart=/usr/sbin/nft add rule ip qubes waydroid-input iifname "waydroid0" meta l4proto {tcp, udp} th dport { 53, 67 } accept
ExecStart=/usr/sbin/nft add rule ip qubes waydroid-forward iifname "waydroid0" oifgroup 1 accept
ExecStart=/usr/sbin/nft add rule ip qubes waydroid-forward oifname "waydroid0" iifgroup 1 accept
ExecStop=/usr/sbin/nft flush chain ip qubes waydroid-input
ExecStop=/usr/sbin/nft flush chain ip qubes waydroid-forward
RemainAfterExit=yes
[Install]
WantedBy=waydroid-container.service
EOF
Перезапускам systemd.
systemctl daemon-reload
Включаем автостарт сервиса waydroid-firewall.
systemctl enable waydroid-firewall.service
Отключаем строки заголовка и строки состояния окна sway.
Это заставит Waydroid работать в полноэкранном режиме.
Отключаем строку заголовка окна sway:
echo "default_border none" > /etc/sway/config.d/94-disable-window-titlebar.conf
Чтобы отключить строку состояния sway, нужно отредактировать конфигурацию sway по умолчанию /etc/sway/config
и удалить или закомментировать весь раздел bar. Выполняем команду, чтобы удалить блок bar{} из конфигурации sway:
perl -0777 -i -pe 's/(^\h*bar\s*|\v\h*bar\s*)(\{(?:(?>[^{}]+)|(?-1))*\})//g' /etc/sway/config
Или можно сделать это вручную:
nano /etc/sway/config
Находим и удаляем/комментируем весь раздел bar{}, например:
#
# Status Bar:
#
# Read `man 5 sway-bar` for more information about this section.
bar {
position top
# When the status_command prints a new line to stdout, swaybar updates.
# The default just shows the current date and time.
status_command while date +'%Y-%m-%d %I:%M:%S %p'; do sleep 1; done
colors {
statusline #ffffff
background #323232
inactive_workspace #32323200 #32323200 #5c5c5c
}
}
Создаём файл .desktop для запуска Waydroid в режиме sway с помощью меню приложения qube.
Когда запускается sway, окно X11 открывается со sway, но если его закрыть, это не вызовет завершение sway. Чтобы не оставить sway с Waydroid, работающим в фоновом режиме после закрытия окна, нужно отслеживать это окно, и когда оно закрыто, нужно остановить процессы sway и Waydroid. Для этого нам нужно устанавливаем утилиту xwininfo:
apt install -y x11-utils
Создаём скрипт для запуска sway и Waydroid:
cat << 'EOF' | tee /opt/bin/sway-waydroid.sh >/dev/null
#!/bin/bash
sway &>/dev/null &
WAYLAND_DISPLAY="wayland-1" XDG_SESSION_TYPE="wayland" DISPLAY=":1" waydroid first-launch &>/dev/null &
for i in $(seq 1 3);
do
if xwininfo -name "wlroots - X11-1" &>/dev/null; then
break
fi
sleep 1
done
while xwininfo -name "wlroots - X11-1" &>/dev/null; do
sleep 2
done
WAYLAND_DISPLAY="wayland-1" XDG_SESSION_TYPE="wayland" DISPLAY=":1" waydroid session stop &>/dev/null
pstree -A -p $$ | grep -Eow "[0-9]+" | xargs kill &>/dev/null
EOF
Выдаём ему права на выполнение.
chmod +x /opt/bin/sway-waydroid.sh
Создаём файл .desktop для запуска Waydroid в sway с помощью меню приложения qube:
cat << 'EOF' | tee /usr/share/applications/Waydroid-Sway.desktop >/dev/null
[Desktop Entry]
Type=Application
Name=Waydroid-Sway
Exec=/opt/bin/sway-waydroid.sh
Icon=waydroid
Categories=X-WayDroid-App;
X-Purism-FormFactor=Workstation;Mobile;
EOF
Выполняем эту команду в терминале dom0
для синхронизации пунктов меню приложения шаблона Waydroid:
qvm-sync-appmenus d12m-waydroid
Создаём скрипт для установки .apk из терминала.
cat << 'EOF' | tee /opt/bin/waydroid-install-apk >/dev/null
#!/bin/sh
WAYLAND_DISPLAY="wayland-1" XDG_SESSION_TYPE="wayland" DISPLAY=":1" waydroid app install $1
EOF
Выдаём ему права на выполнение.
chmod +x /opt/bin/waydroid-install-apk
Создаём скрипт для обновления образа Waydroid в шаблоне из терминала.
cat << 'EOF' | tee /opt/bin/waydroid-upgrade >/dev/null
#!/bin/sh
https_proxy=http://127.0.0.1:8082 http_proxy=http://127.0.0.1:8082 waydroid upgrade
EOF
Выдаём ему права на выполнение.
chmod +x /opt/bin/waydroid-upgrade
Устанавливаем файловый менеджер в Waydroid qube.
Для использования файлового менеджера в Waydroid qube, необходимо установить эти пакеты в шаблон Waydroid qube:
apt install -y thunar qubes-core-agent-thunar
Включаем звук для Waydroid qube.
Устанавливаем пакеты pipewire-qubes и wireplumber в шаблоне Waydroid qube:
apt install -y pipewire-qubes wireplumber
В случае, если вы не хотите, чтобы некоторые кубы Waydroid имели звук, вы можете клонировать шаблон d12m-waydroid
без звука в шаблон d12m-waydroid-sound
и установить пакеты в шаблон d12m-waydroid-sound.
А затем выбрать должен ли иметь звук Waydroid qube, установив для него подходящий шаблон.
После этого шаблон настроен и готов к использованию. Можно создать новый AppVM qube на основе d12m-waydroid и запустить приложение Waydroid-Sway в этом кубе из меню Qubes OS, чтобы запустить Waydroid внутри этого qube.
https://gekkk.co/i/df711182d6f1ae7e5882bb53cf100ffc

Из меню запуска приложений запускаем ⬡
⇒ APPS
⇒ ⬢ WeyDroid
⇒ Weydroid-sway
. Впервые может запускаться довольно долго, нужно подождать.
https://gekkk.co/i/8c6e4d7b076c2d9555f4ea1002238959

Устанавливаем приложения, пользуемся.
https://gekkk.co/i/9a9c4ed7219d501dcd8883b2a2824ebb

https://gekkk.co/i/9f082b77a4fb96c617598c3d1e3bbc7a

Дополнительно:
Обновление образа Waydroid.
Чтобы обновить образ Waydroid нужно вручную запустить эту команду в шаблоне Waydroid d12m-waydroid
:
waydroid-upgrade
Установка приложений в терминале Waydroid.
В одноразовой виртуальной машине скачать apk приложение (например, F-Droid от https://f-droid.org/
) скопируйте его qvm-copy в свой Waydroid AppVM. В Waydroid AppVM запустите waydroid-install-apk с указанием пути к apk-файлу, например:
waydroid-install-apk /home/user/QubesIncoming/disp1629/F-Droid.apk
Изменение раскладки клавиатуры в Waydroid
Настройки
⇒ Система
⇒ Языки и ввод
⇒ Физическая клавиатура
⇒ wayland_keyboard
.
Добавляйте раскладки. Изменяйе раскладку клавиатуры с помощью Ctrl
+ Space
.
Копирование файлов в/из Waydroid.
Внутреннее хранилище Waydroid расположено по пути: /home/user/.local/share/waydroid/data/media/0/
Копировать от пользователя root.
Информация о вашей системе, которую будут знать приложения в Waydroid.
Приложения, установленные в Waydroid, смогут видеть ваш процессор и ядро системы. Поскольку qubes по умолчанию использует ядро, предоставленное dom0, то приложения в Waydroid могут знать, что вы используете Waydroid в ОС Qubes (например, 6.7.3-1.qubes.fc37.x86_64). Чтобы скрыть это, можно использовать ядро в виртуальной машине.
- Выполните
в терминале dom0
, чтобы добавить поддержку ядра в виртуальной машине в PVH qubes:
sudo qubes-dom0-update grub2-xen-pvh
- Выполните в root терминале
d12m-waydroid
, чтобы установить поддержку ядра в виртуальной машине в шаблоне:
apt install -y linux-image-amd64 linux-headers-amd64 grub2 qubes-kernel-vm-support
Выключите шаблон d12m-waydroid
.
- Выполните
в терминале dom0
, чтобы настроить Waydroid qube на использование ядра в VM:
qvm-prefs d12m-waydroid kernel pvgrub2-pvh
.
- После этого потребуется повторно инициализировать Waydroid в шаблоне после переключения ядра. Запустите шаблон Waydroid с новым ядром и выполните эту команду в его root терминале для образа VANILLA Android:
https_proxy=http://127.0.0.1:8082 http_proxy=http://127.0.0.1:8082 waydroid init -f