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:
# /etc/apt/sources.list 追加一行deb http://mirrors.ustc.edu.cn/debian/ trixie-backports mainsudoaptupdatesudoaptinstallwaydroid# 版本: 1.6.3+ds-2~bpo13+12. 加载 binder 模块(anbox 命名)
waydroid init时 LXC 会挂载 binder 节点,设备名不对会失败,所以用 anbox 命名加载:
# /etc/modules-load.d/binder_linux.confbinder_linux# /etc/modprobe.d/binder_linux.confoptions binder_linuxdevices=anbox-binder,anbox-vndbinder,anbox-hwbinder# 立即生效sudomodprobe-vbinder_linux3. waydroid init — 镜像下载(最大坑)
waydroid init下载官方镜像,SourceForge 巨慢(~35KB/s),镜像站基本没有。两条关键经验:
- SourceForge 拦浏览器 UA(403),但对 Python urllib 默认 UA 放行。用 Python 拿真实签名 URL(
resp.geturl(),带 e/st 时间戳参数),再丢给下载器。 - aria2 挂代理实测 9.3MB/s(代理
http://192.168.31.82:7890;curl 走该代理 TLS 会握手失败,aria2 反而正常)。
# 用 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 地址 PYaria2c-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 校验失败):
sudorm-rf/var/lib/waydroid /etc/waydroid-extra/images/*sudowaydroid init# 重新来4. 启动 + adb 授权(免 RSA)
sudosystemctlenable--nowwaydroid-container waydroid session start# 注意: bash 命令超时会被杀, 用 setsid 保活Waydroid 默认ro.adb.secure=1(adb 要求 RSA 授权,命令行授权麻烦),改成 0 直接免授:
# /var/lib/waydroid/waydroid.cfg [properties] ro.adb.secure = 0 persist.service.adb.enable = 1 # 同时开自动 adb 输出 auto_adb = True之后:
adb devices# 192.168.240.112:5555 device ← 直接用, 无需 authorizeflutter 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 极小) |
| 容器内 Android | MemTotal 15G(共享而非独占),MemAvailable ~8.7G |
结论:Waydroid 不预分配内存,Android 进程视负载在主机池里动态取用,桌面空置时基本不占。
注意事项
- 会话生命周期:bash/终端命令超时被 kill 会导致容器 FROZEN 或会话偶发停止,恢复用
sudo waydroid container stop/start+setsid waydroid session start。重启机器后自启用不上就手动跑一次waydroid-desktop.sh。 - 镜像源:waydroid 镜像只有官方 SourceForge,无国内镜像站;只能挂代理 + Python 拿真实 URL 加速。
- Flutter debug 版构件(未解决):
mirrors.huaweicloud.com/flutter缺 io.flutter debug 构件,flutter run -d waydroid的 debug 构建会失败;release 构建无碍。已装 APK 是 release 版。 - 系统镜像版本:lineage-20.0 VANILLA(无 GMS),Android 13 API 33。