LWN:在Linux上用Waydroid运行安卓应用!
关注了就能看到更多这么棒的文章哦~
Android apps on Linux with Waydroid
July 19, 2022
This article was contributed by Sam Sloniker
DeepL assisted translation
https://lwn.net/Articles/901459/
用户经常会想在某种类型的系统上运行针对另一种操作系统的程序,这并不罕见。随着智能手机的日益普及,安卓已经成为世界上使用最广泛的操作系统。因此,用户可能想在 Linux 系统上运行安卓应用程序,以便获得 Linux 中原本不存在的游戏或其他应用程序,或者在他们自己的 Desktop 系统上开发移动应用程序。Waydroid 项目提供了一种在 Linux 上运行这些应用程序的方法,这意味着它们可以在各种设备上运行,甚至包括像 PinePhone 这样基于 Linux 的智能手机。
Waydroid 在概念上类似于 Windows 的兼容层工具 Wine。安卓在 Linux 内核上运行的这个事实,使得在其他 Linux 系统上正确运行安卓应用比在 Windows 上运行要简单得多。不过,还是不可能简单直接地在普通的 Linux 操作系统上运行安卓应用,因为它们依赖于不同的用户空间环境(user-space environment)。然而,通过使用如 namespace 等内核功能,有可能在 Linux 系统的容器中运行整个 Android 用户空间。这就是 Waydroid 使用的技术;它在一个容器中运行一个完整的 Android 系统,其方式与在 Fedora 上的容器中运行 Debian 一样。这使得 Waydroid 拥有比在虚拟机或模拟器中运行更好的性能。
[PinePhone 上的主屏幕]
Waydroid 上运行的是 LineageOS Android 发行版的定制版。它拥有 LineageOS 的所有软件功能,尽管它并不模拟所有的设备功能。例如不支持摄像头和电话功能;WiFi 和蓝牙也不能在 Waydroid 内部来进行配置。然而,网络仍是支持的;Waydroid 总是显示具有一个以太网连接,它实际上是通过主机路由这些网络传输。音频输入和输出都使用了 host 配置的 audio path。除了诸如此类的小差异之外,Waydroid 基本上类似于没有谷歌应用(Google apps)的普通安卓设备。
Hardware support
Waydroid 支持 32 位和 64 位 x86 和 Arm。64 位 Arm 支持最多的应用,因为它是绝大多数常规 Android 设备使用的架构,但许多应用也可以在 64 位 x86 上运行。不过,我没有测试过 32 位设备。许多应用程序完全是用 Java 和/或 Kotlin 编写的,这两种语言都可以编译成与架构无关的 Java 虚拟机(JVM)字节码;这些应用程序可以在所有架构上运行,不需要开发者做任何额外工作。其他应用程序中就包含由 C 或 C++ 等语言编译的本地代码;这些应用程序必须为每个平台单独进行编译,但许多开发人员仍然会针对 X86 编译,因为大多数 Chromebook(其中许多是 X86 处理器)也支持 Android 应用程序。
英特尔和 AMD 的 GPU,以及集成在大多数 Arm SoC 的 GPU,都是支持硬件图形加速的。NVIDIA GPU 尚未支持(除了 Tegra Arm SoC 中的 GPU),但 Waydroid 确实支持使用软件渲染(software rendering)作为一种变通方法。
我在我的 PinePhone(64 位 Arm,运行 DanctNIX 和 Phosh)、两台笔记本电脑(Dell Inspiron 和 Lenovo IdeaPad 3,都是 x86-64 且运行 Arch Linux)和我的平板电脑(Microsoft Surface Go 2,也是 x86-64 且运行 Arch Linux)上测试了 Waydroid;所有的设备都有触摸屏。我在所有四个设备上都使用了 Wayland,因为 Waydroid 依赖 Wayland。
不出所料,手机上的整体体验是最好的。在 PinePhone 上使用 Waydroid 的体验与使用普通的安卓手机没有太大区别,除了 Waydroid 的那些限制在普通安卓设备上不存在,比如电话和摄像头无法工作的问题。由于 PinePhone 的硬件比大多数其他安卓设备都要慢,我禁用了用户界面的动画。但这是硬件的问题,而不是 Waydroid 的问题。在禁用动画后,Waydroid 的响应速度几乎与真正的 Android 手机一样。
[笔记本上的 2048 游戏]
Waydroid 在笔记本电脑上的表现也相当不错。因为大多数应用程序没有针对使用键盘和鼠标进行优化,我在 Waydroid 中更多地在使用笔记本电脑的触摸屏,这是跟使用普通的 Linux 软件不一样的地方。相当多的应用程序都被设计为支持键盘和鼠标输入,以便与 Chromebooks 兼容,所以这些应用程序的效果体验甚至更加好。在台式机或非触控笔记本电脑上的体验会差很多,但经过 Chromebook 优化的应用程序仍然可以很好地工作。
在 tablet 平板电脑上,触摸手势不能正常工作(swipe 操作被注册为在某个点的长按),尽管它们在 Linux 本身是可以正常工作的;这使得 Waydroid 在平板电脑上几乎无法使用。由于这个问题,我没有做很多测试。不过,Surface 设备在使用 Linux 时经常出现问题,所以这很可能是一个此设备所特有的问题(甚至可能是我的软件配置下特有的问题),而不是 Waydroid 在平板电脑上的普遍问题。
Waydroid 不能直接在一些发行版所提供的默认内核下正常工作,因为它需要 binder 和 ashmem 模块。看起来 Ubuntu 和 Debian 都默认提供了这些模块,而 Fedora 和 Arch 则没有。我没有检查过其他的发行版。在笔记本电脑和平板电脑上,我安装了 linux-zen,这是一个可用于 Arch 的可选内核,其中确实提供了这些模块。PinePhone 上的 DanctNIX 的默认内核就提供了这些模块,所以我不需要替换它的内核了。
安装和运行 Waydroid 的过程,在不同的发行版上是不同的。我遵循 Arch wiki 上关于笔记本电脑的说明,所以在安装完 Zen 内核后,我从 Arch 用户仓库(AUR)安装了 waydroid 和 waydroid-image。之后,Waydroid 需要用 "sudo waydroid init" 进行初始化,并且需要为 systemd 来启用和启动 waydroid-container 服务。Waydroid 文档中有关于在其他发行版上安装它的说明。
Waydroid 有两种模式,多窗口模式和全用户界面(full UI)模式。在使用多窗口模式时,安卓应用被整合到桌面上,就像它们是 Linux 桌面应用一样。然而,在所有四台设备上,多窗口模式都出现了几个 bug,使其难以使用,所以我只使用全用户界面模式。也就是在同一个窗口中运行整个 Android UI。
Waydroid 为每个安装上来的应用程序创建了 .desktop 文件,包括默认的系统中的应用程序,这不能被禁用。这些 desktop 文件会以多窗口模式来启动应用程序。然而,如果你只使用全 UI 模式,它们只会给你在菜单中引发不必要的误解。这些图标可以通过在~/.local/share/applications 中的每个 waydroid.*.desktop 文件末尾添加 Hidden=true 来隐藏。删除.desktop 文件是没有用的,因为 Waydroid 会在下次启动时再次创建它们。
App support
正如预期的那样,PinePhone 上的应用支持是最好的,这是因为它是一个 Arm 设备,而且大多数 Android 应用主要是为手机设计的。在笔记本电脑上,大多数应用程序都是可用的,尽管许多应用程序对鼠标的支持是不完整的;触摸屏工作挺正常的。
[F-Droid]
Waydroid 和典型的安卓设备之间最显著的区别之一就是它缺乏谷歌应用程序。这当然有利于保护隐私,但它确实有一些缺点。如果没有谷歌应用和服务,许多应用就无法安装或无法正常工作。
谷歌游戏商店不可用,大大限制了可安装的应用程序的数量。许多在 Waydroid 中能良好运行的应用程序,特别是专有的应用程序,不能很容易地进行安装,因为它们只通过 Play 商店分发。
F-Droid 在 Waydroid 中运行良好,而且确实有良好的鼠标支持。绝大多数列出的没有 "anti-features" 的应用程序都能工作,许多有 anti-feature 的也能工作。最有可能导致问题的 anti-feature 是 "non-free dependencies":通常,这个 anti-feature 所指的非自由软件就是 Google Play 服务。这可能导致出现没有推送通知或丢失地图甚至到无法打开应用程序等问题。当然,依赖不支持的硬件功能的应用程序也是无法正常工作的,无论它们是否有任何 anti-feature。
似乎可以通过安装 microG 使其中一些应用能正常工作,但由于担心使用它可能会违反 Google Play 的服务条款,我就没有进行测试了。Aurora Store 是一个替代性的 Play 商店客户端,很可能可以在 Waydroid 中工作,用来安装许多只在 Play 商店中使用的应用程序;由于同样的原因,我也没有对它进行测试。
Waydroid 的一个限制是,当在 Android 应用中点击链接时,没有选项用来在不安装额外软件的情况下在主机浏览器中打开该链接。在 Waydroid repository 中,有一个关于这个问题的 issue 还是 open 状态,但在这个功能实现之前有一个变通办法,我写了一个 Python 脚本和 Android 应用程序来添加这个功能。Android 应用程序安装在 Waydroid 容器中,并被设置为默认浏览器(虽然它不是真正的浏览器,但它被配置为出现在可用的浏览器列表中),而 Python 脚本在主机操作系统上运行。当点击 Android 应用程序中的链接时,"浏览器" 会跟 Python 脚本通讯,然后在主机上打开真正的浏览器。
Waydroid 的开发工作是在 GitHub 仓库进行的。该项目的网站列出了开发团队的三名成员,而 GitHub 目前显示在 main repository 中有 25 名贡献者。最新的版本是 V1.2.1,是在 4 月发布,但从那时起已经有相当多的开发。总的来说,发布时间点有些随意;GitHub 上列出的第一个版本 V1.1.0 是在 2021 年 9 月发布的,两天后是 V1.1.1。下一个版本,v1.2.0,在那之后一个月发布,然后在 10 月到 4 月之间没有 release 过了。
Conclusion
总的来说,尽管有一些问题和缺点,Waydroid 仍是一种在 Linux 上运行 Android 应用程序的有效方法,特别是在非 Android 的 Linux 手机上。像任何软件一样,它也有一些 bug,但它的大部分问题是由只运行或几乎只运行 FOSS 的电脑和拥有大量专利软件的智能手机之间的固有差异所造成的;在大多数 Android 设备上被认为是必不可少的服务在 Waydroid 中是缺失的。而且,当它在台式机或笔记本电脑上使用时,输入设备(键盘和鼠标)与安卓(及其大多数应用程序)主要针对的触摸屏有根本差异。安卓用户界面和许多应用程序已经有很好的键盘和鼠标支持,与 Chromebook 兼容,但很明显,安卓主要还是为智能手机设计的。
不幸的是,没有 Google Play 服务和 Play Store 的设备非常罕见,以至于开发者没有什么动力来避免 Play 服务或在其他渠道上发布他们的应用;主要的例外就是 FOSS 和/或那些注重隐私的应用的开发者。当然,一些 Linux 用户反正也不会想使用其他这些非 FOSS 的应用程序,所以这对很多 Waydroid 用户来说可能不是一个问题。
即使有这些限制,Waydroid 也大大扩展了 Linux 用户可用的软件范围,特别是那些拥有 Linux 智能手机的用户。当然,它不是一个理想的解决方案,就像 Wine 不是解决 Linux 桌面软件缺乏的理想方案一样;如果能有更多的原生 mobile-Linux 应用程序,那当然更好。然而,总的来说,Waydroid 对那些不想局限于为 Linux 手机设计的少数原生应用的 Linux 手机用户来说相当有用。Waydroid 绝对值得在任何希望运行 Android 应用程序的设备上尝试。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~