Waydroid - Linux 容器化 Android 完全手册
七月末,赶在 mac mini m4 换代之前,将 Mac mini m4 卖了,3300 买入 4400 卖出,用了一年还赚了 1100, 可谓年度最佳理财产品。
卖掉 mac mini m4 后,开始继续用 Linux,于我用 Linux 首先要解决的问题是访问公司内部网络,公司提供了合法的 VPN,但 Linux 客户端已不再提供,在 Linux 下要访问公司内部网络,比如 Golang proxy 代理、sumdb 以及各个内部系统,要么在 Mac 上开启一个代理,两台电脑同时用,要么 root Android 手机并共享给 Linux,于是看上了 waydroid
waydroid 实际是 Linux + Android
首先需要明确一点,Waydroid 的 shell 可不是纯 Android,而是 Android + Linux,我的意思是:waydroid 的 shell 可直接运行静态链接编译的 Linux 二进制包,毕竟 Android 的二进制包可不多,尤其是 x86 架构,Waydroid 运行 Android APK 通常需要转译,运行 arm64 的 Android 二进制也需要转译,但运行 x86_64 的 Linux 二进制则不需要转译,这不是性能问题,而是兼容和生态,尤其是转译对不同 app 的兼容。
libhoudini vs libndk
很多教程都推荐 libndk, 实际上,在加解密类应用上,libhoudini 更稳定,我使用 libhoudini 时运行正常,libndk 在最后一步会 crash,但需要注意,libhoudini 有使用期限的限制,实际测试发现,Android 11 的 libhoudini 库在 Android 13 也能用,且没有使用期限的限制。
gost + smartdns
我还遇到一个问题,Waydroid 没有监听 53 端口,这可能导致软件运行异常,为此,我使用了 smartdns,另外,Linux 下访问公司的 goproxy 以及 gosumdb 网络不通,但 Waydroid 可以,于是又引入了 gost,gost 有 sni 代理,另外也支持 socks5, 完整的脚本如下:
| |
smartdns.conf 内容如下:
waydroid 开机自启
vim ~/.config/systemd/user/waydroid-session.service输入内容如下:
| |
罪魁祸首 http3
firefox 在已开启全局代理,流量链路为:firefox —socks5—> waydroid —vpn—> 外部网络的情况下,依然被检测到真实的 ip,具体错误信息:
Sign-in could not be completed
Token exchange failed: token endpoint returned status 403 Forbidden: Country, region, or territory not supported
Error code token_exchange_failed
Details Token exchange failed: token endpoint returned status 403 Forbidden: Country, region, or territory not supported经过排查发现,流量居然走 http3, 那么问题就简单了,禁用掉 firefox 的 http 3 即可:
about:config
network.http.http3.enable将所有的 true 改为 false,另外可以再上点工具:redsocks 代理所有流量
socks5 vs socks5h
另外还有一个小插曲,发现 curl -x 'socks5://192.168.240.112:1082' 'https://xxx.xxx.xxx' 返回正常,而如果用curl -x 'socks5h://192.168.240.112:1082' 'https://xxx.xxx.xxx' 则返回异常,这就是最开始提到的,Waydroid 没有监听 53 端口,无法域名解析。
非 Wayland 运行 Waydroid
先安装 weston,然后运行,脚本如下:
sudo apt install weston运行时:
libhoudini 期限问题解决
相关 issue 为:https://github.com/casualsnek/waydroid_script/issues/285 ,解决方案为:
https://github.com/waydroid-helper/waydroid-helper/issues/127#issuecomment-5506441807
修补命令:
printf '\x90\x90\x90\x90\x90\x90' | sudo dd of=/var/lib/waydroid/overlay/system/lib64/libhoudini.so bs=1 seek=$((0xe6085)) conv=notrunc status=none修补前 /var/lib/waydroid/overlay/system/lib64/libhoudini.so 的 sha256 值为 b321439df5a64ff29a62bb168303e58f800e94113c399f52795c42793f7f5f1e
修补后为:847be255d03886974ff0cff09d09b7530301d24671ce0f80172ab3a0629d23b8
可通过下面命令来确认,修补前先检查 sha256 是否符合,且记得备份
sha256sum /var/lib/waydroid/overlay/system/lib64/libhoudini.so