Skip to content

Waydroid 折腾记录(安卓兼容环境)

🕒 Published at:

Waydroid 折腾记录(安卓兼容环境) ​

日期: 2026-08-11 机器: ryzen5-5500u · Debian 13 (trixie) · 14GiB 内存 目的: 不用模拟器(太重),用容器方案跑 Android,让 Flutter 直接调试 APK


方案选型 ​

方案内存占用CPU 架构说明
Android 模拟器预分配 2-4G全太重,放弃
Waydroid(LXC 容器)与宿主机共享内存池,不预分配x86_64 原生已采用,唯一要求内核有 binder 模块
ARM 应用兼容——Waydroid 只跑 x86_64 原生;ARM-only 闭源应用(微信/手游)需 libndk/houdini 翻译层,模拟器才通吃

Waydroid 是 LXC 容器,Android 进程和主机共用内存(类似普通进程),不像模拟器固定圈走几 GB。桌面空置时几乎不占内存,跑 Flutter 调试 APK 也就多几百 MB。


安装过程 ​

1. 添加 USTC backports 源 ​

binder 内核模块内核自带(binder_linux.ko.xz,零编译),但 Debian 13 正式源里没有 waydroid,要加 backports:

bash
# /etc/apt/sources.list 追加一行
deb http://mirrors.ustc.edu.cn/debian/ trixie-backports main

sudo apt update
sudo apt install waydroid
# 版本: 1.6.3+ds-2~bpo13+1

2. 加载 binder 模块(anbox 命名) ​

waydroid init 时 LXC 会挂载 binder 节点,设备名不对会失败,所以用 anbox 命名加载:

bash
# /etc/modules-load.d/binder_linux.conf
binder_linux

# /etc/modprobe.d/binder_linux.conf
options binder_linux devices=anbox-binder,anbox-vndbinder,anbox-hwbinder

# 立即生效
sudo modprobe -v binder_linux

3. waydroid init — 镜像下载(最大坑) ​

waydroid init 下载官方镜像,SourceForge 巨慢(~35KB/s),镜像站基本没有。两条关键经验:

  1. SourceForge 拦浏览器 UA(403),但对 Python urllib 默认 UA 放行。用 Python 拿真实签名 URL(resp.geturl(),带 e/st 时间戳参数),再丢给下载器。
  2. aria2 挂代理实测 9.3MB/s(代理 http://192.168.31.82:7890;curl 走该代理 TLS 会握手失败,aria2 反而正常)。
bash
# 用 Python 拿真实 URL → aria2 -x16 --all-proxy 下载
python3 - <<'PY'
import urllib.request
url = "https://sourceforge.net/projects/waydroid/files/images/lineage/20260403/system.zip/download"
resp = urllib.request.urlopen(url)
print(resp.geturl())  # 真实带签名的 zip 地址
PY

aria2c -x16 -s16 --all-proxy=http://192.168.31.82:7890 '上面拿到的真实URL'
  • system zip: 838MB → system.img 1.8G
  • vendor zip: 189MB → vendor.img 536M
  • 放到 /etc/waydroid-extra/images/,再跑 sudo waydroid init 即秒过

下载中途失败先清残留再重来(坏文件会导致 init 校验失败):

bash
sudo rm -rf /var/lib/waydroid /etc/waydroid-extra/images/*
sudo waydroid init  # 重新来

4. 启动 + adb 授权(免 RSA) ​

bash
sudo systemctl enable --now waydroid-container
waydroid session start   # 注意: bash 命令超时会被杀, 用 setsid 保活

Waydroid 默认 ro.adb.secure=1(adb 要求 RSA 授权,命令行授权麻烦),改成 0 直接免授:

toml
# /var/lib/waydroid/waydroid.cfg
[properties]
ro.adb.secure = 0
persist.service.adb.enable = 1

# 同时开自动 adb 输出
auto_adb = True

之后:

bash
adb devices
# 192.168.240.112:5555	device   ← 直接用, 无需 authorize

flutter devices
# WayDroid x86 64 Device (mobile) • 192.168.240.112:5555 • android-x64 • Android 13 (API 33)

5. 开机自启 + 桌面快捷方式 ​

会话自启(容器 service 已开机自启,这是用户态部分):

  • /home/a1/bin/waydroid-autostart.sh:轮询等容器 RUNNING → 若会话没跑则 setsid waydroid session start
  • ~/.config/autostart/waydroid-session.desktop 指向它

桌面快捷方式:

  • /home/a1/桌面/安卓桌面.desktop → /home/a1/bin/waydroid-desktop.sh
  • 脚本逻辑:会话没跑就 setsid waydroid session start 并等 5s → waydroid show-full-ui 全屏

APK 双击安装:系统自带 waydroid.app.install.desktop,已是 .apk 默认处理器,双击即装。


内存实测(开机后) ​

项数值
主机物理内存14GiB
空闲 / 可用1.9-3.2G / 8.3-8.8G(随桌面活动浮动)
Waydroid 容器服务约 21M(+ dnsmasq 极小)
容器内 AndroidMemTotal 15G(共享而非独占),MemAvailable ~8.7G

结论:Waydroid 不预分配内存,Android 进程视负载在主机池里动态取用,桌面空置时基本不占。


注意事项 ​

  1. 会话生命周期:bash/终端命令超时被 kill 会导致容器 FROZEN 或会话偶发停止,恢复用 sudo waydroid container stop/start + setsid waydroid session start。重启机器后自启用不上就手动跑一次 waydroid-desktop.sh。
  2. 镜像源:waydroid 镜像只有官方 SourceForge,无国内镜像站;只能挂代理 + Python 拿真实 URL 加速。
  3. Flutter debug 版构件(未解决):mirrors.huaweicloud.com/flutter 缺 io.flutter debug 构件,flutter run -d waydroid 的 debug 构建会失败;release 构建无碍。已装 APK 是 release 版。
  4. 系统镜像版本:lineage-20.0 VANILLA(无 GMS),Android 13 API 33。