Mac M芯片上搭建Docker云手机


[折腾] Mac M芯片上搭建Docker云手机

封面

本篇文章讲解了如何在MacBook M芯片上部署Redroid安卓云手机,有一定的技术难度,适合有一定计算机基础和动手能力的朋友,其实思路是相通的,如果你手上有香橙派5 plus一类的开发板或是Arm云服务器也可以尝试部署一下,小白慎入。

起因:

最近了解到不少云手机相关的文章,云手机嘛大家应该有所了解,玩过手游挂机的朋友应该比较熟悉,就是在云端服务器虚拟一个手机,使用服务器端的硬件资源运行这个手机,可以做到24小时不停机,就是类似于我们本地电脑安装的安卓手机模拟器,只不过是部署在了云端,理想情况下除了不能打电话其他方面跟正常手机一样使用,有许多的使用场景。

刷视频img

使用微信

img

跑游戏

网上说可以香橙派上运行原神,我这里没有实现,包太大10GB…(会自动横屏)有些游戏会自动闪退不是到是硬件原因还是软件原因

img

手机ROOT + Magisk

image.png

不过一般云手机都是服务器厂商提供的服务,基本上都是安卓系统还需要额外收费,好在在全球最大的开源社区GitHub上有开源的云手机实现,我们使用Docker可以一键进行部署属于我们自己的云手机,当然要想真正的远程使用需要花费一些功夫。

因为安卓手机的芯片是Arm架构的,所以虚拟的云手机也需要Arm架构的服务器上,网上大部分教程都是基于arm云服务器或是香橙派rk3588这种Arm架构的服务器或是单片机教程,我自己手上有个树莓派也是Arm架构试了运行了下cpu打满 100%跑不通,根本不可用

转机

自己也想捣腾捣腾捣腾,想着没有香橙派,但自己手里有Macbook Pro M3 36GB,苹果的M芯片也是arm架构的芯片,按理说应该也能跑吧,经过一番搜索还真找到了有篇文章提到了这种Mac M芯片的解决方案,但是内容不够具体,就像我上面截图展示的一样,我已经成功部署了,并且安装了Magisk + Lsposed,然而游戏还是没能运行起来,闪退😂

使用Mac终端连接云手机

基本思路:使用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这个开源项目

GitHub项目 remote-android

目前支持:

  • 安卓 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的镜像下载

image-20240621065030873

大小是1.3GB

image-20240621065103730

在PD虚拟机上通过镜像加载安装

镜像下载好后,在PD新建虚拟机

image-20240619230514502

这里用到官网下载的Ubuntu镜像

img

镜像推荐不要太新,24.04、22.04以及20.04这三个版本我都试过,推荐使用20.04版本,其他的版本我没有启动成功,至少24.04版本不行

image-20240619230822131

PD也可以使用官方自带的在线下载,应该也可以

image-20240619231051926

image-20240619231108635

选择一下安装的位置和名称就进入具体的启动镜像安装了

img

这里创建20.04系统的时候没来得及截图用的是24.04的截图,可以忽略

Ubunut系统安装

具体安装过程,空格用来确认,上下键用来选择,这里只罗列重要的操作,其他的都是默认想

语言选择:没有中文只好选英文

img

键盘布局:也是默认英文

img

安装类型:选择server然后Done

image-20240619231615625

网络配置:默认就行直接选Done,默认PD会分配网络共享,跟Mac主机共享网络上网,这个IP地址可以记录一下,方便后面Mac终端上shh进行连接虚拟机

img

代理设置:不设置,保持默认

img

软件镜像设置:我这里保持默认

img

存储设置:保持默认

img

选择继续Continue:

img

设置Ubuntu的用户名密码:这个重要,后面ssh登录需要这个用户密码,username、password

img

选择跳过系统更新:空格选择skip for now,然后继续

image-20240619232240647

额外的环境安装选择:这里不选择,默认继续

img

等待安装进度:

img

选择立即重启:reboot now

img

完成后有一段错误提示,回车后信息滚动,系统启动

img

img

登录系统:系统启动完成后,输入我们设定的账号密码,看到用户名出现就成功了

img

登录成功后的展示:

img

恭喜你,走到这此时我们的Ubuntu系统已经安装成功了,这里截图可能是24.04的其实安装过程基本一样。

设置一下虚拟机内存和CPU

我们这是一下虚拟机的内存和CPU,顺便看一下网络配置

先输入命令关机:因为关机才能修改设置,修改设置这一步其实应该在安装前进行

shutdown now

选择PD虚拟机控制中心的Ubuntu 20.04的配置

image-20240619233101675

设置内存和处理器核数,大家根据配置选一下,我这里36GB内存,给它分配了16GB内存、4核cpu,你可以根据自身电脑配置下

img

网络配置:这块默认是共享网络模式,共享宿主机就是Mac的网络,意思是如果你的Mac此时是连着网的,PD虚拟机上的Ubuntu系统也是能够访问公共网络的,如果你的Mac魔法上网,你的Ubuntu也能魔法上网,这样能解决很多网络包下载问题,包括最近的Docker镜像无法下载的问题,需要你具备网络环境,这样会方便些

img

网络信息查看:

关闭Ubuntu虚拟机后,可在PD的控制中心上启动Ubuntu 20.04,我们可以通过ip addr命令查看虚拟机的ip地址,这个地址安装Ubuntu的时候我们也见过,我这里分配是 10.211.55.4 ,这个地址在Mac上是能ping通的,就是网络互通,也是我们ssh连接的地址

img

测试网络连通性:

ping一下我的局域网中的mac的ip地址,看着是通的,使用ctrl + c终止ping

img

Mac上SSH登录Ubuntu虚拟机

为了方便操作我们并不直接在PD虚拟机软件上登录Ubuntu执行命令,主要原因是PD上面的命令无法复制粘贴,总不能一个个手敲,那样容易出错,使用Mac的终端SSH连接就挺方便,也能够复制粘贴命令

唤醒终端: 快捷键 「Command 」+ 「空格」唤醒聚焦搜索,输入terminal选择终端打开

image-20240619235056630

输入如下命令:

ssh 用户名@ip
#例子 ssh glen@10.211.55.5

用户名是之前设置的Ubuntu用户名,ip是刚才ip addr命令查看的虚拟机ip,第一次登录会让选择是否记录指纹,选择y,然后会让输入密码,密码正确后就能连接到Ubuntu系统了,后面执行的命令都是在这个基础上

img

输入密码后,如上就是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

img

安装需要的内核

这个是Redroid需要的一些内核功能,如果安装报错的话需要查找原因解决,否则Redroid将无法运行

# 安装 linux 内核工具
apt install linux-modules-extra-`uname -r`
# 启用内核功能
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux

这是一般教程提供的步骤,但是不一定都能成功,原因我们接下来说

报错的情况:提示找不到模块

img

这时候直接执行docker命令创建云手机镜像是会失败的

img

GitHub看到redroid项目有这样的issue议题,找到了答案,原来是内核版本问题:

英文内容,可以用浏览器翻译

在鲲鹏arm 设备上运行闪退 系统为 ubuntu 20.04 · Issue #308 · remote-android/redroid-doc · GitHub

image-20240620005349753

如何解决内核版本问题:

问题就在于当前内核怎么查看,以及如何升级内核,为了了解这个问题我特意问了问AI,这里用的谷歌的Gemini,其他的AI应该是类似的

image-20240620221748970

Gemini回复的情况来看,uname -r 可以看当前版本内核,Ubuntu 20.04支持内核范围是5.4-。5.18的版本,而我们装的Ubuntu 20.04默认应该是5.4的内核版本

查看内核版本

uname -r 

我更新后的是这个版本

image-20240620222546323

更新 Ubuntu 内核版本的方法

那么如何升级内核到5.10+版本呢,AI告诉我有两种方法,一种需要编译安装挺麻烦,这里使用推荐的一种使用apt命令升级的方式

1. 使用 APT 包管理器:

这是更新 Ubuntu 中内核的最常见和最推荐的方法。它利用 apt 命令来管理软件包,包括内核。

步骤:

  1. 更新软件包列表:

    sudo apt update
  2. 列出可用内核版本:

    sudo apt-cache search linux-image

    这将显示所有可用内核包的列表,包括它们的版本。

    这里有很多选择,generic应该是通用版本,这里选这个

image-20240620223509849

  1. 选择要安装的内核版本:

    从列表中选择所需的内核版本。例如,如果您要安装内核 5.19,您需要记下它的包名称(例如,linux-image-5.19.0-0ubuntu22.04.1)。

  2. 安装选定的内核:

    Bash

    sudo apt install <kernel-package-name>

    用您在步骤 3 中记下的实际包名称替换 <kernel-package-name>

  3. 重启系统:

    安装完成后,您需要重新启动系统才能使新内核生效。

    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

看到如下内容,说明服务正常启动,端口已经开放

image-20240620225608643

相关redroid的具体docker启动参数,可以参考下Redroid官方文档,有些硬件加速的蒜香,比如那个host

image-20240620225920229

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可以看到设备信息,如图这样类似

image-20240620231511338

使用scrcpy连接操作云手机

scrcpy -s  ubuntu的IP:5555
#例 scrcpy -s 10.211.55.5:45555  

此时会弹出安卓云手机的界面了,可以用鼠标正常操作了,也是能联网使用自带的webView浏览器上网

此时你看到的窗口应该是这个样子:两个终端窗口,一个scrcpy控制的窗口

img

安装安装APK应用

云手机安装成功后,如果想要安装应用,有两种方式:

  • 将电脑下载的apk文件拖拽到窗口上
  • 使用adb命令安装应用

拖拽窗口比较简单,推荐这种,提前下载好准备

adb命令安装:

使用adb install + apk文件的路径,如下:

adb install /Users/wxglen/Downloads/weixin8049android2600_0x2800313d_arm64.apk 

安装应用软件可以在各大应用分发平台上下载,比如豌豆荚、应用宝一类的,而且可以找到安卓应用的历史版本安装。

最后

至此,你的安卓云手机已经安装正常运行了,目前就是在局域网内连接使用,还有很多值得探索的地方,比如远程操控,手机Root一类的,还比如怎么在香橙派一类的RK3588主板上运行,都是值得摸索的。

恭喜你看到了最后,其实如果你没有使用场景,其实部署云手机来说对你并没有什么用,本篇文章只算是我的一次探索记录吧,希望对你有启发。

作为自己在本地部署的云手机还是有许多问题的,毕竟也不能24小时开机只为使用一个云手机,而且想要做到公网访问云手机还需要费一番功夫,比如要做内网穿透,使用web版本的ws-scrcpy进行远程操控,这样做到真正意义上的云手机,另外还是有很多不足,比如一些游戏闪退等需要解决的问题,并没有商业化的云手机用起来那么舒服。

参考文章:

识别二维码关注:

qrcode_for_gh_a7455fb62844_344

欢迎点赞、留言和转发~


文章作者: 大章鱼
版权声明: 本站点所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 大章鱼 !
  目录