---
layout: post
title: 如何在Linux容器内运行Android？
tags: [Linux, Android]
---

  原生运行Android肯定比虚拟机好！<!--more-->    

# 起因
  前段时间我在树莓派上安装了[openFyde](/2023/12/10/openfyde.html)，后来发现原来它的ArcHero安卓子系统是基于anbox开发的，和ChromeOS的安卓子系统有一些区别，至于区别在哪我也不是特别清楚。不过既然它的安卓子系统和Linux直接安装的没啥区别，那不如我试试看在普通的Linux上安装容器化的安卓系统效果怎么样？   

# 试用Waydroid
  最开始我测试的是[Waydroid](https://github.com/waydroid/waydroid)，因为听说anbox的升级版就是Waydroid，据说性能比anbox强，所以想试试看，安装挺简单的，执行个脚本之后用apt就能安装。不过我的测试平台是Ubuntu Server 20.04LTS，Waydroid之所以叫这个名字是因为它要基于Wayland显示服务器运行，可我是无界面的系统要怎么用它啊？Waydroid好像没有无头模式这种东西，不过我搜了一下weston实现了Wayland协议而且支持无头模式，用法也很简单，安装好weston之后执行`weston --backend=headless-backend.so`就可以了。   
  不过默认安装好的Waydroid不能运行ARM架构的程序，似乎是因为libhoudini之类的库是有版权的，所以不能直接集成，不过还好有人开发了一个[工具包](https://github.com/casualsnek/waydroid_script)，可以给Waydroid安装包括libhoudini在内的多个因为版权等原因不能直接在项目里使用的程序，而且操作起来也很简单，体验还不错。   
  至于怎么查看界面，因为是无头模式启动的所以没有界面，只能通过adb查看，不过我试了一下scrcpy不知道为什么不能用，但是用Airtest就能看到界面，就挺奇怪的……还有就是分辨率很低，不过这个应该改weston的启动参数就可以改分辨率了吧，但因为后来发现Waydroid不能开多个实例感觉有点废物就没有在继续研究了。   
  不过总的来看，如果是在桌面版的Linux上，而且界面是使用Wayland协议的效果应该会比较好，好像Ubuntu22.04以上的系统默认会使用Wayland，在这个系统上面使用Waydroid效果应该比在Windows上使用WSA的效果还要好。毕竟这可不是虚拟机运行，而是使用容器技术原生运行的，如果有机会的话还是值得一用的。   

# 试用redroid
  因为Waydroid不能开多个实例，所以我搜了一下有没有类似技术而且能开多个实例的，结果就找到了[redroid](https://github.com/remote-android)。安装也很简单，执行几个命令修改下内核模块然后直接用docker pull个镜像就可以用，而且这个切换版本比Waydroid简单，Waydroid想换别的安卓版本要自己整镜像，不然就只能用基于Android 11的LineageOS，redroid可以按镜像的版本号选择希望使用的安卓版本，而且我测试了一下，redroid是可以使用scrcpy连接的，看起来效果还不错。   
  但是我试了一下运行一些ARM的安卓程序会出现闪退的情况，我以为是因为没有ARM兼容库的问题，但是文档上写的镜像里面已经自带了libndk……这么看来可能是因为libndk的兼容性不太行啊，另外libndk好像是给AMD的CPU使用的，我用的CPU是Intel的，Intel应该用libhoudini才对，然而我找了半天也没有找到怎么让redroid使用libhoudini……真是令人失望啊。   

# 总结
  看来在容器内运行Android系统的需求还是太少了，很多问题都没人解决……不过想想也是，那些搞云手机的大多直接拿真机运行Android，用兼容层的性能损耗也很大，而服务器级别的ARM芯片也不便宜……   
  另外就是使用Linux的人也很少，而且像那些在Windows上玩安卓游戏的人都是用的虚拟机，性能也都够用了，毕竟那么高功率的桌面端CPU怎么样都比超低功率的手机CPU强啊，所以容器内运行Android的需求比较少可能也很正常吧……