[折腾] Mac M芯片上搭建Docker云手机
本篇文章讲解了如何在MacBook M芯片上部署Redroid安卓云手机,有一定的技术难度,适合有一定计算机基础和动手能力的朋友,其实思路是相通的,如果你手上有香橙派5 plus一类的开发板或是Arm云服务器也可以尝试部署一下,小白慎入。
起因:
最近了解到不少云手机相关的文章,云手机嘛大家应该有所了解,玩过手游挂机的朋友应该比较熟悉,就是在云端服务器虚拟一个手机,使用服务器端的硬件资源运行这个手机,可以做到24小时不停机,就是类似于我们本地电脑安装的安卓手机模拟器,只不过是部署在了云端,理想情况下除了不能打电话其他方面跟正常手机一样使用,有许多的使用场景。
刷视频
使用微信
跑游戏
网上说可以香橙派上运行原神,我这里没有实现,包太大10GB…(会自动横屏)有些游戏会自动闪退不是到是硬件原因还是软件原因
手机ROOT + Magisk
不过一般云手机都是服务器厂商提供的服务,基本上都是安卓系统还需要额外收费,好在在全球最大的开源社区GitHub上有开源的云手机实现,我们使用Docker可以一键进行部署属于我们自己的云手机,当然要想真正的远程使用需要花费一些功夫。
因为安卓手机的芯片是Arm架构的,所以虚拟的云手机也需要Arm架构的服务器上,网上大部分教程都是基于arm云服务器或是香橙派rk3588这种Arm架构的服务器或是单片机教程,我自己手上有个树莓派也是Arm架构试了运行了下cpu打满 100%跑不通,根本不可用
转机
自己也想捣腾捣腾捣腾,想着没有香橙派,但自己手里有Macbook Pro M3 36GB,苹果的M芯片也是arm架构的芯片,按理说应该也能跑吧,经过一番搜索还真找到了有篇文章提到了这种Mac M芯片的解决方案,但是内容不够具体,就像我上面截图展示的一样,我已经成功部署了,并且安装了Magisk + Lsposed,然而游戏还是没能运行起来,闪退😂
基本思路:使用Mac上的虚拟机Parallels Desktop上安装Ubuntu的Arm版本Linux系统,然后在Ubuntu上安装Docker运行云手机,然后在Mac上使用Scrcpy这款开源免费的安卓投屏工具进行连接Ubuntu上的云手机,就是多了一层PD虚拟机的虚拟,当然别的虚拟机软件安装Ubuntu应该也行,我这边没有尝试
开始
准备工作:
- 科学上网环境,方便下载镜像
- PD虚拟机,可以找找某宝你懂的
- Ubuntu 20.04 arm Server版本镜像
- ADB
- Scrcpy
- Docker
Mac上并不能直接运行redroid云手机镜像,需要在ubuntu的arm环境上运行,据说也有x86架构的转换方案,这里不涉及大家可以自行研究下
Redroid介绍
主要使用的项目:Redroid这个开源项目
目前支持:
- 安卓 14 (
redroid/redroid:14.0.0-latest
) - 仅限 Android 14 64 位 (
redroid/redroid:14.0.0_64only-latest
) - 安卓 13 (
redroid/redroid:13.0.0-latest
) - 仅限 Android 13 64 位 (
redroid/redroid:13.0.0_64only-latest
) - 安卓 12 (
redroid/redroid:12.0.0-latest
) - 仅限 Android 12 64 位 (
redroid/redroid:12.0.0_64only-latest
) - 安卓 11 (
redroid/redroid:11.0.0-latest
) - 安卓 10 (
redroid/redroid:10.0.0-latest
) - 安卓 9 (
redroid/redroid:9.0.0-latest
) - 安卓 8.1 (
redroid/redroid:8.1.0-latest
)
官方提供的入门命令
Ubuntu 20.04 快速入门 此处;检查其他发行版的部署部分。
## install docker https://docs.docker.com/engine/install/#server
## install required kernel modules
apt install linux-modules-extra-`uname -r`
modprobe binder_linux devices="binder,hwbinder,vndbinder"
modprobe ashmem_linux
## running redroid
docker run -itd --rm --privileged \
--pull always \
-v ~/data:/data \
-p 5555:5555 \
redroid/redroid:11.0.0-latest
### Explanation:
### --pull always -- use latest image
### -v ~/data:/data -- mount data partition
### -p 5555:5555 -- expose adb port
### DISCLAIMER
### Should NOT expose adb port on public network
### otherwise, redroid container (even host OS) may get compromised
## install adb https://developer.android.com/studio#downloads
adb connect localhost:5555
### NOTE: change localhost to IP if running redroid remotely
## view redroid screen
## install scrcpy https://github.com/Genymobile/scrcpy/blob/master/README.md#get-the-app
scrcpy -s localhost:5555
### NOTE: change localhost to IP if running redroid remotely
### typically running scrcpy on your local PC
1. Ubuntu镜像下载安装
首先在Ubuntu官网找到arm 64的Ubuntu Server镜像(貌似Desktop也行,我用的Server,区别是Desktop版本是图形化界面)
打开官网下载:
Ubuntu 20.04.5 LTS (Focal Fossa)
选择arm 64的镜像下载
大小是1.3GB
在PD虚拟机上通过镜像加载安装
镜像下载好后,在PD新建虚拟机
这里用到官网下载的Ubuntu镜像
镜像推荐不要太新,24.04、22.04以及20.04这三个版本我都试过,推荐使用20.04版本,其他的版本我没有启动成功,至少24.04版本不行
PD也可以使用官方自带的在线下载,应该也可以
选择一下安装的位置和名称就进入具体的启动镜像安装了
这里创建20.04系统的时候没来得及截图用的是24.04的截图,可以忽略
Ubunut系统安装
具体安装过程,空格用来确认,上下键用来选择,这里只罗列重要的操作,其他的都是默认想
语言选择:没有中文只好选英文
键盘布局:也是默认英文
安装类型:选择server然后Done
网络配置:默认就行直接选Done,默认PD会分配网络共享,跟Mac主机共享网络上网,这个IP地址可以记录一下,方便后面Mac终端上shh进行连接虚拟机
代理设置:不设置,保持默认
软件镜像设置:我这里保持默认
存储设置:保持默认
选择继续Continue:
设置Ubuntu的用户名密码:这个重要,后面ssh登录需要这个用户密码,username、password
选择跳过系统更新:空格选择skip for now,然后继续
额外的环境安装选择:这里不选择,默认继续
等待安装进度:
选择立即重启:reboot now
完成后有一段错误提示,回车后信息滚动,系统启动
登录系统:系统启动完成后,输入我们设定的账号密码,看到用户名出现就成功了
登录成功后的展示:
恭喜你,走到这此时我们的Ubuntu系统已经安装成功了,这里截图可能是24.04的其实安装过程基本一样。
设置一下虚拟机内存和CPU
我们这是一下虚拟机的内存和CPU,顺便看一下网络配置
先输入命令关机:因为关机才能修改设置,修改设置这一步其实应该在安装前进行
shutdown now
选择PD虚拟机控制中心的Ubuntu 20.04的配置
设置内存和处理器核数,大家根据配置选一下,我这里36GB内存,给它分配了16GB内存、4核cpu,你可以根据自身电脑配置下
网络配置:这块默认是共享网络模式,共享宿主机就是Mac的网络,意思是如果你的Mac此时是连着网的,PD虚拟机上的Ubuntu系统也是能够访问公共网络的,如果你的Mac魔法上网,你的Ubuntu也能魔法上网,这样能解决很多网络包下载问题,包括最近的Docker镜像无法下载的问题,需要你具备网络环境,这样会方便些
网络信息查看:
关闭Ubuntu虚拟机后,可在PD的控制中心上启动Ubuntu 20.04,我们可以通过ip addr命令查看虚拟机的ip地址,这个地址安装Ubuntu的时候我们也见过,我这里分配是 10.211.55.4 ,这个地址在Mac上是能ping通的,就是网络互通,也是我们ssh连接的地址
测试网络连通性:
ping一下我的局域网中的mac的ip地址,看着是通的,使用ctrl + c终止ping
Mac上SSH登录Ubuntu虚拟机
为了方便操作我们并不直接在PD虚拟机软件上登录Ubuntu执行命令,主要原因是PD上面的命令无法复制粘贴,总不能一个个手敲,那样容易出错,使用Mac的终端SSH连接就挺方便,也能够复制粘贴命令
唤醒终端: 快捷键 「Command 」+ 「空格」唤醒聚焦搜索,输入terminal选择终端打开
输入如下命令:
ssh 用户名@ip
#例子 ssh glen@10.211.55.5
用户名是之前设置的Ubuntu用户名,ip是刚才ip addr命令查看的虚拟机ip,第一次登录会让选择是否记录指纹,选择y,然后会让输入密码,密码正确后就能连接到Ubuntu系统了,后面执行的命令都是在这个基础上
输入密码后,如上就是SSH登录成功了。
2. 安装Docker和内核环境
参考了网友Stapx Steve的文章:在 Silicon macOS 上运行安卓虚拟机
安装Docker
在当前终端执行如下命令,在线安装Docker
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
检查安装情况
安装完成之后 Docker 会启动并注册为启动服务。输出容器列表查看 Docker 的运行状态:
sudo docker ps
安装需要的内核
这个是Redroid需要的一些内核功能,如果安装报错的话需要查找原因解决,否则Redroid将无法运行
# 安装 linux 内核工具
apt install linux-modules-extra-`uname -r`
# 启用内核功能
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux
这是一般教程提供的步骤,但是不一定都能成功,原因我们接下来说
报错的情况:提示找不到模块
这时候直接执行docker命令创建云手机镜像是会失败的
GitHub看到redroid项目有这样的issue议题,找到了答案,原来是内核版本问题:
英文内容,可以用浏览器翻译
在鲲鹏arm 设备上运行闪退 系统为 ubuntu 20.04 · Issue #308 · remote-android/redroid-doc · GitHub
如何解决内核版本问题:
问题就在于当前内核怎么查看,以及如何升级内核,为了了解这个问题我特意问了问AI,这里用的谷歌的Gemini,其他的AI应该是类似的
Gemini回复的情况来看,uname -r 可以看当前版本内核,Ubuntu 20.04支持内核范围是5.4-。5.18的版本,而我们装的Ubuntu 20.04默认应该是5.4的内核版本
查看内核版本
uname -r
我更新后的是这个版本
更新 Ubuntu 内核版本的方法
那么如何升级内核到5.10+版本呢,AI告诉我有两种方法,一种需要编译安装挺麻烦,这里使用推荐的一种使用apt命令升级的方式
1. 使用 APT 包管理器:
这是更新 Ubuntu 中内核的最常见和最推荐的方法。它利用 apt
命令来管理软件包,包括内核。
步骤:
更新软件包列表:
sudo apt update
列出可用内核版本:
sudo apt-cache search linux-image
这将显示所有可用内核包的列表,包括它们的版本。
这里有很多选择,generic应该是通用版本,这里选这个
选择要安装的内核版本:
从列表中选择所需的内核版本。例如,如果您要安装内核 5.19,您需要记下它的包名称(例如,
linux-image-5.19.0-0ubuntu22.04.1
)。安装选定的内核:
Bash
sudo apt install <kernel-package-name>
用您在步骤 3 中记下的实际包名称替换
<kernel-package-name>
。重启系统:
安装完成后,您需要重新启动系统才能使新内核生效。
sudo reboot
我上面选择了这个版本内核:linux-image-unsigned-5.13.0-52-generic
然后按照命令更新,再重新系统就行了
sudo apt install linux-image-unsigned-5.13.0-52-generic
sudo reboot
此时再次查看内核
再次安装Redroid的需要使用的内核依赖
# 安装 linux 内核工具
apt install linux-modules-extra-`uname -r`
# 启用内核功能
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux
这次不出意外就不会报错了,可以进行下一步的Docker镜像安装了
安装Redroid云手机Docker镜像
在ssh连接的ubuntu的终端上执行下面命令安装Docker
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
检查安装情况
安装完成之后 Docker 会启动并注册为启动服务。输出容器列表查看 Docker 的运行状态:sudo docker ps
运行 Redroid云手机
由于 苹果M芯片是纯 64bit 架构,它没法运行带有 32bit 版本的 Redroid;这意味着你只能运行安卓 12 及以后版本的 Redroid(因为在这之前没有 64bit only 的版本)。
直接使用 Docker run 运行 Redroid 容器:
sudo docker run -itd --privileged \
--pull always \
-v ~/droid12/data:/data \
-p 5555:5555 \
redroid/redroid:12.0.0_64only-latest \
redroid.width=720 \
redroid.height=1280 \
redroid.density=320 \
androidboot.redroid_gpu_mode=host \
androidboot.use_memfd=1 \
ro.secure=0 \
ro.ril.oem.imei=861503068361145 \
ro.product.manufacturer=Xiaomi \
ro.build.product=chopin
这里使用的是redroid/redroid:12.0.0_64only-latest这个anrdroid12的64位镜像,最好保证宿主机魔法上网环境,否则镜像可能下载不下来。
上面开启了一个虚拟机ip: 5555端口的虚拟云手机,我们可以通过scrcpy用「虚拟机ip: 5555端口」进行连接
正常没有报错后,我们使用docker ps 可以查看redroid云手机是否启动成功
sudo docker ps
看到如下内容,说明服务正常启动,端口已经开放
相关redroid的具体docker启动参数,可以参考下Redroid官方文档,有些硬件加速的蒜香,比如那个host
Mac 连接 Redroid云手机
云手机启动后,因为在ubuntu虚拟机上后台运行,我们需要使用工具去连接操作,这个操作的地方是在mac上面,所以需要mac安装相关的工具,在哪连接就在哪里安装。
我们在终端菜单上,新建一个终端窗口在上面执行命令:
安装adb
通过homebrew命令快速安装
brew install android-platform-tools
安装完成后,我们使用adb -v查看版本
adb --version
安装scrcpy
brew install scrcpy
连接redorid云手机
连接需要两步,首先需要adb上连接设备,然后需要使用scrcpy控制设备,两个都需要设备的ip+端口,就是我们上面提到的虚拟机的ip和redroid暴露的5555端口
使用adb查看设备
adb devices
如果没有查到我们使用adb connect连接上面的Redroid云手机
adb connect ubuntu的IP:5555
# 例子:adb connect 10.211.55.5:45555
此时再使用adb devices可以看到设备信息,如图这样类似
使用scrcpy连接操作云手机
scrcpy -s ubuntu的IP:5555
#例 scrcpy -s 10.211.55.5:45555
此时会弹出安卓云手机的界面了,可以用鼠标正常操作了,也是能联网使用自带的webView浏览器上网
此时你看到的窗口应该是这个样子:两个终端窗口,一个scrcpy控制的窗口
安装安装APK应用
云手机安装成功后,如果想要安装应用,有两种方式:
- 将电脑下载的apk文件拖拽到窗口上
- 使用adb命令安装应用
拖拽窗口比较简单,推荐这种,提前下载好准备
adb命令安装:
使用adb install + apk文件的路径,如下:
adb install /Users/wxglen/Downloads/weixin8049android2600_0x2800313d_arm64.apk
安装应用软件可以在各大应用分发平台上下载,比如豌豆荚、应用宝一类的,而且可以找到安卓应用的历史版本安装。
最后
至此,你的安卓云手机已经安装正常运行了,目前就是在局域网内连接使用,还有很多值得探索的地方,比如远程操控,手机Root一类的,还比如怎么在香橙派一类的RK3588主板上运行,都是值得摸索的。
恭喜你看到了最后,其实如果你没有使用场景,其实部署云手机来说对你并没有什么用,本篇文章只算是我的一次探索记录吧,希望对你有启发。
作为自己在本地部署的云手机还是有许多问题的,毕竟也不能24小时开机只为使用一个云手机,而且想要做到公网访问云手机还需要费一番功夫,比如要做内网穿透,使用web版本的ws-scrcpy进行远程操控,这样做到真正意义上的云手机,另外还是有很多不足,比如一些游戏闪退等需要解决的问题,并没有商业化的云手机用起来那么舒服。
参考文章:
识别二维码关注:

欢迎点赞、留言和转发~