使用 Waydroid 在 Linux 上运行 Tachiyomi

使用 Waydroid 在 Linux 上运行 Tachiyomi

RayAlto OP

引入

我个人最喜欢的漫画阅读器是 Tachiyomi ,尤其是它的一个 fork : TachiyomiSY 。但这些只能在手机上运行,没有原生的桌面版本,社区移植的 Suwayomi 的各个版本都有一些缺点,比如网页版显示漫画时周围会有停机坪一样宽的边框不能取消,桌面端大屏的优势没有了,移动端小屏更没法看、再比如 JUI 版本是 Kotlin 写的,猛吃资源且卡的一批。感觉不如运行一个 Android 虚拟机来的性价比高,至少 Android 虚拟机还能运行别的 Android App 。咕咕噜了一圈,没有一个非常好用的开源 Android 虚拟机,各种 X86 Android 发行版比如 Bliss OS 之类的也不怎么好用。最后发现了 Waydroid ,我觉得这个解决方案是最简单而且性价比最高的了。

Waydroid

Waydroid 是一个基于 LXC 容器来运行 Lineage Android 的工具,因为基于容器,所以理论上可以获得比虚拟机更接近物理机的性能和更低的资源占用,而且社区维护有 Waydroid Extras Script 可以方便地安装比如 libhoudini 之类的好东西。而且我还可以把它装在我之前配置好的路由器上。

1. 安装

Waydroid 有官方的文档 ,比如我使用 ArchLinux ,对应的文档在 Waydroid - ArchWiki 。 Waydroid 需要内核 binder 模块,而 ArchLinux 下的 linuxlinux-lts 是没有的,最简单的方法是换成 linux-zen ,正巧我的路由器本身就用了 linux-zen 。安装 Waydroid 非常简单, ArchLinux 有社区维护的 AUR ,使用你喜欢的 AUR Helper 可以更方便地安装和更新,比如我使用 paru ,只需要:

1
paru -S waydroid

然后无脑按 ENTER 就能装好了,装好后需要使用 waydroid 安装实际的 Android 容器,我在使用 GAPPS 版本:

1
waydroid init -s GAPPS

然后需要保证 waydroid-container systemd unit 是正在运行的,可以:

1
systemctl enable waydroid-container --now

设置为自动启动(这里不需要担心不使用 Waydroid 时 waydroid-container 占用资源,因为这个 systemd unit 不会占用很多资源,只有实际启动了 waydroid session 后,才会真正运行 Android 容器)。启动 waydroid session :

1
waydroid session start

这句指令并不是 fork&exit 类型的,它会占用你的 shell ,可以包装成 systemd user unit ,或者我借助 sway 来执行这句指令:

1
2
3
# ~/.config/sway/config

exec --no-startup-id waydroid session start

然后就可以呼出整个界面了:

1
waydroid show-full-ui

Waydroid 截图

这句是 fork&exit 类型的,不会占用你的 shell 。

2. 网络自由

如果用了透明代理, Waydroid 的网络应该直接是自由的,如果没有使用透明代理的话可以让 Waydroid 走 HTTP Proxy ,使用 waydroid shelladb 执行:

1
2
3
settings put global http_proxy "IP:PORT"
settings put global global_http_proxy_host "IP"
settings put global global_http_proxy_port "PORT"

3. 向 Google 注册这台设备

Google Play 会提示你的设备没有被认证,可以借助 Waydroid Extras Script 拿到 Google 服务框架的 Android ID :

1
./main.py certified

把这段数字放到 Google 的注册页面 里进行注册,过几分钟后重启 waydroid session :

1
2
waydroid session stop
waydroid session start

就可以解决这个问题

4. Arm 支持

Waydroid 是 AMD64 的,不支持 Arm 应用,但可以借助 Waydroid Extras Script 安装 libhoudini

1
./main install libhoudini

重启之后就可以发现 Google Play 向你推荐 Genshin Impact 和 Honkai: Star Rail 了。

Scrcpy

因为我的 Waydroid 装在路由器上,而我的路由器没接显示器,所以需要远程控制,而 VNC 因为设计上的原因不能有很高的帧率,所以我觉得最好用 scrcpy 实现远程控制。

1. Waydroid 的网络问题

Waydroid 默认会配置一个 nat bridge ,然后把自己桥接进去,这就导致了它只能被宿主机访问, Waydroid 的 LXC 配置文件在 /var/lib/waydroid/lxc/waydroid/config ,但我不建议修改这个文件,虽然理论上可以修改 lxc.net.0.link, lxc.net.0.ipv4.address 之类的手动配置它的网络,但不知道为什么,我只要改了这些配置, waydroid session 就会卡在初始化界面,不能正常进入桌面,而且 CPU 会有很高的占用,而且每次更新系统后这个配置文件都会被重置,我还去翻了翻 Waydroid 的源码,很大概率 Waydroid 没有一个 user-friendly 的配置文件,所以我觉得最好不要修改这个文件。

那应该怎么使 Waydroid 在宿主所在的局域网内也能访问呢?可以借助 Nginx 反向代理:

1
2
3
4
5
6
7
8
9
stream {
upstream waydroid {
server <Waydroid 的 IP>:5555;
}
server {
listen 5555;
proxy_pass waydroid;
}
}

Waydroid 的 IP 可以去设置里看,这个 IP 一般不会变(因为 Waydroid 创建的 nat bridge 一般只有 Waydroid 自己用),这样就把 Waydroid 的 5555 端口反向代理到宿主机的 5555 端口了。

2. 启动参数

Waydroid 的 Lineage Android 貌似只有一个视频编码器,也就是 OMX.google.h264.encoder ,所以没办法用更好的 H.265 之类的编码、音频因为不是需要特别高清,所以选择 AAC 编码就可以、因为是局域网,所以可以用一个比较高的码率,比如我使用 16M ,启动时可以像这样:

1
scrcpy --max-fps=30 -b 16M --audio-codec=aac --require-audio --tcpip=<宿主机 IP>

还可以用 window-width, window-height 指定启动时窗口尺寸,比如设置成 1280x720 : --window-width=1280 --window-height=720

Scrcpy 截图

Q&A

  • 为啥不用XX模拟器?
    • 广告、资源占用高、不开源
  • 为啥不用 QtScrcpy ?
    • GUI 花里胡哨、华而不实,作者另起炉灶在社区开源的基础上,面向大陆人开发售卖闭源版,而且这个闭源版一看就是给刷评论、抢票之类的龌龊的人用的
  • 兼容性怎么样?
    • 原生支持 x86 的应用大概率是开箱即用的,用 libhoudini 支持的 Arm 应用大部分都能用,但亲测 Blue Archive 国际服是运行不了的(但 JP 服可以),据说是因为采用了一个很另类的反作弊。

总结

除了在修改它的 LXC 配置文件上浪费了很多时间以外, Waydroid 的使用体验还是很好的,也算是不浪费我的路由器的性能了。

看漫画时的截图