安卓生产力探索 - 安卓运行 Windows/Linux, 视频输出, 内核编译, KVM 虚拟化以及更多

本文主要记录我这两天关于如何将安卓手机/平板改造成生产力设备的一些探索和发现, 包含了软件/硬件相关的众多内容.

劝退

首先先要说明, 研究这些方法的主要目的不是真的把安卓当电脑用或者是拿安卓当主力开发工具. 本文最终的结论也是, 最理想的情况下, 将安卓当作程序员的主力开发工具也会带来明显的生产力下降.

如果你确实有便携性的要求, 在此推荐购买体积 0.5L 左右迷你主机或者 LG Gram 之类的笔记本电脑.
1k-2k 元的迷你主机基本能与常见轻薄本性能持平, 并且也很方便在不同地点间携带(办公地点配显示器+键鼠即可).
如果有移动办公和续航的需求, 可以买 LG Gram / Dell XPS / Thinkpad X1 等轻薄本. 虽然性能释放不佳, 但(特别是 LG Gram)能做到很不错的电池续航表现, 同时拥有完整的 Windows 体验. 买最新一代的全新机价格可能会偏贵(1w+), 如果没钱的话也可以考虑买一到两年前的新机(5k-8k), 还可以去咸鱼捡更久以前的二手机, 回来换个电池也是完全可以用的.(1k-2k)
当然我们也可以期待一波即将发售的 Snapdragon X Elite.

我写本篇博客的目的更多的是在探索现在安卓设备能力的边界 (aka 瞎折腾) , 例如:

  • 能不能重利用旧安卓手机当 Linux 服务器?
  • 能不能在安卓上运行 Docker / LXC 容器?
  • 能不能在安卓上运行一些 Windows 应用或者体验 Windows On Arm?
  • 极端情况下 (例如高中) 不能携带电脑, 安卓究竟能不能完成生产力任务?
  • 你不信任你使用的电脑, 安卓手机能不能作为随身携带且自己可控的”可信”计算设备?

安卓视频输出

安卓要充当生产力设备, 一个必要条件是有一块能看的清字的屏幕. 安卓平板天生的满足了这一点, 但安卓手机想要输出视频到显示器就比较麻烦了. 如果你有台电脑的话, scrcpy 是不错的选择, 但是我们这里希望安卓能主动的输出视频信号到显示器, 不经过中间媒介.

目前, 只有少数的手机原生支持了 Type-C 接口的视频输出, 这些手机的机主就不用担心这个问题, 买个常见的支持 Type-C 转 HDMI 的拓展坞即可. 不过华为和 OPPO 都不能 Root, 不能 Root 狗都不买.(不)

对于没有支持视频输出的大多数安卓手机, 问题就比较棘手了. 不过经过了一番搜索, 我发现了个比较古老的 DisplayLink 技术.

使用 DisplayLink 需要在安卓手机上安装 DisplayLink Presenter 软件, 并购买支持 DisplayLink 的拓展坞. 原理就是安卓端的软件采集屏幕显示的画面, 编码压缩后通过 USB 协议发送给拓展坞, 拓展坞再将数据解码输出成 HDMI 信号.

由于支持 DisplayLink 的拓展坞并不是很多且相对都是比较旧的产品(新的都换 Type-C 了), 上鱼搜了一圈价格都在 100 出头(关键词可以搜 DisplayLink), 买了一个 HP 的 TPA-i502, 顺便再买了一个比较小巧的支持 PD 充电的拓展坞, 可以边充电边连接显示器.

叠buff:PD拓展坞和DisplayLink拓展坞连着鼠标键盘充电线和显示器

实测输出的延迟并不高, 大概在 10-20ms 的样子, 输出的画质算是还不错的 1080p60hz.

远程桌面 / 串流

上面研究了如何让安卓输出视频信号, 如果你有自己的台式机或者服务器的话, 使用远程桌面直接连回去使用 Windows 似乎是个不错的方案. 事实上, 拿安卓平板配个键盘鼠标远程 Windows 办公也确实是现在比较常见的一种做法.

远程桌面的协议也有不少, 忽略掉一些可疑的国产厂商商业方案, 主要分为 RDP 和串流两种. 前者比较适合远程操作电脑, 后者原本是为游戏设计, 也可以用来远程桌面. 我自己尝试了 RDP, Moonlight, Parsec 这三个. 最后我自己的综合体验还是觉得 RDP 最好用. (我的服务器需要通过互联网访问, 串流带宽要求更高容易卡顿, 内网/同城的话可能串流会更适合些, 建议大家自行测试.)

在这过程中, 遇到的最头疼的问题就是: 安卓系统默认的一些快捷键不能被应用覆盖, 远程桌面时很多按键(比如 Windows, Alt+Tab)不能正常使用, 会触发安卓系统内的 Google Assistant 和切换应用功能.

经过一番检索, 我发现可以使用安卓的无障碍功能强行捕获系统的所有按键, 实现基本完美的远程桌面体验, 为 aRDP 和 Moonlight Android 实现了一下 (我也向上游提了 issue [1][2], 不过因为无障碍功能上架 Google Play 存在较为严格的审核要求, 上游不一定接纳):

aRDP: https://github.com/lyc8503/remote-desktop-clients
Moonlight: https://github.com/lyc8503/moonlight-android-no-keyboard-shortcut

Windows on Arm

微软之前推出了 Windows on Arm, 高通也推出了一系列桌面端 SoC, 相关的生态也在逐渐建立. 这同时也让在安卓手机上运行 Windows 成为可能.

有些兴趣爱好者就开始把相关的驱动迁移到了安卓端的平台, 其中包括海外的 WOA Project 和国内的Mindows 工具箱.

最典型的示例应该就是小米平板5, 驱动已经基本完善, 达到了一个大致可用的水平, 加之本身就是平板形态, 目前拿来体验 Windows on Arm 确实是个不错的选择.

还有很多 Snapdragon 835 845 855 的手机也在支持行列, 可以参考 Mindows 官方给出的支持机型列表(不过大多机型的支持残缺不全), 刷入 Windows 后配合上面提到的 DisplayLink 拓展坞输出视频, 就可以正常使用 Windows 了~

KVM 虚拟机

在搜索资料的过程中, 我非常火星地发现, 原来从 Pixel6 系列开始, 谷歌就为 Pixel 系列提供了 ARM 上的 KVM 支持. 没错, 你现在可以在安卓上使用硬件支持的虚拟化技术运行虚拟机了, 那么你就可以非常轻松地运行满血版本的 Windows/Linux. (甚至不需要 Root)

被小米反复折磨的我(详见下文)在此立下 Flag: 下一台手机绝对买 Pixel

题外话: 其实 Armv8 架构本身是支持虚拟化的, 不过现在几乎所有手机厂商实现的 Firmware 都将安卓运行在了 EL1 下, 并且没有暴露对应的虚拟化接口. 而固件本身烧录后 Fuse 就熔断了, 用户也无法修改, 不像 PC 的 bios 用户可以自己刷写.

Linux Deploy

上面提到的 Windows/KVM 都需要特定的机型支持, 对于其他大量机型, 其实也有办法运行 Linux.

Linux Deploy 是我最最早就用过的在安卓运行 Linux 的方法. 它需要 Root 权限来运行, 就是使用了 chroot 切换到一个 Linux 发行版的 rootfs, 运行一个 sshd 让你连接进去. 当年的设备还是 32 位 arm, 我就是利用了这个软件用旧手机运行 Linux, 踩了不知道多少坑.

最近还有一些无需 Root 权限的 Proot, 在用户态实现了类似 chroot 类似的功能, 真的实现了任何一个手机无需 root 都能跑任意 Linux 发行版.

小彩蛋: 本篇博客就是在 LinuxDeploy 中安装了 LinuxArchArm, 并安装了 i3 + chromium + 输入法, 在 GitHub codespaces 中写出的.

本篇博客的创作现场, 有笔记本也不用(x)

Docker / LXC

LinuxDeploy 只使用了 chroot 隔离了文件系统, 其他所有资源都没有进行隔离. 这直接导致 systemd 在容器中拒绝启动(因为 pid != 1), 然后所有 systemctl 服务都无法使用了. 只能自己手动启动一些 daemon. 桌面环境中依赖的 dbus 也要自己启动.

安卓作为广义上的 “Linux”, 绝大部分厂商发布的内核中虽然没有启用 LXC 需要的诸多特性, 但我们可以自己重新编译内核, 开启相关的属性. (前提是厂商遵守 GPL 开源了内核, 然而我的小米只开源了第一个版本, 从没有更新过, 导致开源的 kernel 只能跑安卓 11)

如果你想尝试编译包含相关支持的内核, 可以参考这个 gist.

BTW, 谷歌新推出的 GKI 也终结了安卓内核混乱的年代, 解决了内核碎片化问题, 甚至让大家可以随意魔改内核(如 KernelSU). 如果你使用的机型内核较新 (5.5+), 你应该可以直接编译使用通用内核, 不再依赖厂商及时更新开源源码.

小结

其实开头就写了, 并不是真的要用安卓做生产力工具, 小结就写一些题外话吧.

与 x86 平台的统一标准和自由开放不同, Arm 和安卓平台本身就处于割据争霸的混乱状态.
一方面谷歌推出 GSI 和 GKI 有望部分解决碎片化严重的问题, 谷歌本身在安卓领域也有着不小的号召力(and强制力), 亲儿子 Pixel 也有很多黑科技新功能开放.
另一方面, 安卓设备的高度集成和定制化让谷歌作恶更加容易, Play Integrity 已经使用 SoC 的 TrustZone 进行设备完整性检查, 这直接意味着厂商绑定与垄断, 现在的可信计算一旦被”滥用”, 我们只会离自由开放的互联网越来越远.

我认为, 既然消费者花钱购买了自己的设备, 我们应得修改我们设备的自由, DRM 不能是厂商控制属于我的设备的理由.
小米最近收紧了 Bootloader 解锁的规则, 如果我不能轻易地解锁, 我将来就不会再考虑购买小米设备. 安卓将来的发展如何, 仍掌握在各个 OEM 厂商手中. 不过, 似乎少数人的需求得到漠视, 就是一件如此天经地义的事.


打赏支持
“请我吃糖果~o(*^ω^*)o”
安卓生产力探索 - 安卓运行 Windows/Linux, 视频输出, 内核编译, KVM 虚拟化以及更多
https://blog.lyc8503.site/post/android-productivity-and-more/
作者
lyc8503
发布于
2024年4月19日
许可协议