记一次在OrangePiZero2(香橙派zero 2)上部署Redroid(云手机)的过程

news2024/12/24 9:47:19

一句废话

这次换一种写作风格,尝试一下轻松的行文方式。

起因

很久以前看见有群友讨论关于docker部署Redroid,拿来挂机玩游戏一类的。当时听了感觉很有意思,后面粗浅地在zero2上部署了一下,容器虽然是跑起来了,但是scrcpy连接总是黑屏,后来我试着帮助一个群友部署,也部署失败了。最近又想起来这回事,所以决定再试一试。下面就说说我的尝试过程。

Step -1: 系统环境说明

我使用的系统是官方的5.16内核的系统。4.9内核的系统是跑不起来的,这点需要注意一下。

Step 0: 我不想读那么多废话,只想能跑起来,怎么办?

这里我把编译好的内核和模块放上来,链接和使用方法如下:
123盘链接
下载之后:

unzip opi_zero2_kernel_redroid.zip 
sudo mv 5.16.17+ /lib/modules
sudo mv uInitrd-5.16.17+ vmlinuz-5.16.17+ /boot
cd boot
sudo rm -rf Image uInitrd
sudo ln -s vmlinuz-5.16.17+ Image
sudo ln -s uInitrd-5.16.17+ uInitrd
reboot

重启完成后:

sudo apt install docker.io
sudo docker pull redroid/redroid:11.0.0-arm64
sudo docker run -itd --privileged -v ~/data11:/data -p 5555:5555 --name redroid11 redroid/redroid:11.0.0-arm64 androidboot.use_memfd=1 androidboot.redroid_gpu_mode=guest

这样就部署好了。连接方法见文末。

Step 1: 当然是好好阅读Readme.md

Redroid(remote android)是一种AIC(Android in Cloud),能够便捷的部署很多个Android容器,非常适合于云游戏等应用…(以上废话,一个词总结:云手机)。
项目地址:GitHub
通过仔细研读这篇readme发现,这个小玩意,需要两个内核模块支持:ashmem(注:主线内核在5.18 drop了这个模块,官方的替代方案是memfd,而且redroid也提供了androidboot.use_memfd=1来启用memfd支持,所以理论上可以不编译这个模块,不过这里稳妥起见,还是编译进去了)binder。虽然作者也提供了redroid_modules库来进行树外模块的安装,但是我的内核版本太高了(5.16.17),编译过不了,于是只能通过自定义内核的方式了。

Step 2: 自定义内核,开搓!

先去香橙派官方搞内核源码:GitHub
打开看了看,我选择了orange-pi-5.16-sunxi64分支。
这个时候,我才想起来,手上没有服务器给我编译,只能在本机上进行编译,又想了想4颗a53孱弱的性能…只能忍忍了。

git clone -b orange-pi-5.16-sunxi64 https://github.com/orangepi-xunlong/linux-orangepi

由于众所周知的原因,克隆过程又花了几十分钟,心里一万只羊驼奔腾而过…
随后,把系统本来就带的config搞过去:

cd linux-orangepi
cp /boot/config-5.16.17-sun50iw9 ./.config

搞好之后,打开内核配置界面:

make menuconfig

打开之后,Device Drivers -> Android -> Android Drivers勾上,弹出来binder ipc driver勾上,binderfs filesystem也勾上,这样binder模块就编译进去了。然后回到上一级,去Staging Drivers里面,进入Android,把Enable the Anonymous Shared Memory Subsystem也勾上,这样ashmem也搞定了。随后开始编译:

make -j8

随后开始漫长的等待…
大概5个小时之后,编译结束了,先把模块安装下,然后搓个initrd镜像出来:

sudo make modules_install -j8
sudo mkinitramfs 5.16.17+ -o initrd.img
mkimage -A arm64 -T ramdisk -C none -n uInitrd -d initrd.img uInitrd

然后把内核和initrd镜像搞到/boot目录下面:

cd /boot
sudo cp ~/linux-orangepi/uInitrd ./uInitrd-5.16.17+
sudo cp ~/linux-orangepi/arch/arm64/boot/Image ./vmlinuz-5.16.17+

搞好之后,ln一下,让系统重启时使用新编译的内核:

sudo rm -rf Image uInitrd
sudo ln -s vmlinuz-5.16.17+ Image
sudo ln -s uInitrd-5.16.17+ uInitrd

然后重启就行了。

Step 3:没有docker怎么玩?

答案是装一个:

sudo apt install docker.io

随后,搞个Android13的镜像试试水:

sudo docker pull redroid/redroid:13.0.0-arm64

接下来进入下一个环节:Debug(笑)。

Step 3.1: Debug

对照官方文档,跑个容器试下水:

sudo docker run -itd --privileged -v ~/data13:/data -p 5555:5555 --name redroid13 redroid/redroid:13.0.0-arm64 androidboot.use_memfd=1
docker ps -a

OK,容器确实run起来了,但是adb连接提示offline。没辙,只能启动logcat看看What’s happening:

sudo docker exec redroid13 logcat

不看不知道,一看吓一跳啊:

#假装这里有log,但是当时的log我怎么可能还留着嘛!
#反正就是/vendor下面一个什么什么dri的so,报了segmentation fault。
#dri是什么,是drm的东西,那就和GPU有关系了。
#既然知道是GPU的毛病,那看文档就OK了。

根据以上log,可以知道,是GPU的问题(雾)。那怎么办呢,只能启用软件渲染咯:

sudo docker stop redroid13
sudo docker rm redroid13
sudo docker run -itd --pull always -v ~/data13:/data -p 5555:5555 --name redroid13 redroid/redroid:13.0.0-arm64 androidboot.use_memfd=1 androidboot.redroid_gpu_mode=guest

OK,重新搞起容器,连接还是报offline。麻麻的,还得看log:

sudo docker exec redroid13 dmesg
#再次假装有log,大体就是lmkd的问题,可以看见
#lmkd以每分钟30次的速度不断重启(大概每2秒一次)。

根据以上log(逃),可以得出是lmkd问题,去仓库issue搜一下,#293
在这里插入图片描述
tnnd,原来还要PSI支持,为什么不早说!(抓狂)在这里插入图片描述
这里怎么不写上PSI支持…麻了
General Setup -> CPU/Task time and stats accounting -> Pressure stall information tracking,勾上。然后又开始一次漫长的编译过程…
编译好之后,还是一样的步骤安装好内核。
搞定之后,还是一样启动容器,照样offline…掏出log仔细研读,也没研究出来个所以然,只能试试换个版本:

sudo docker pull redroid/redroid:11.0.0-arm64
sudo docker run -itd --privileged -v ~/data11:/data -p 5555:5555 --name redroid11 redroid/redroid:11.0.0-arm64 androidboot.use_memfd=1 androidboot.redroid_gpu_mode=guest

run起来之后,adb连上,提示连接成功。哦豁,有搞头。

Step 4: 连接

装个scrcpy:

sudo apt install scrcpy
adb connect localhost:5555
scrcpy

在这里插入图片描述
Windows下scrcpy参考官方GitHub即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每次启动wsl时自动更新ip】

每次启动wsl时自动更新ip 在windows中使用wsl时,每次启动wsl后发现其ip都会改变,这样的话如果想通过vscode的Remote-SSH插件打开代码编辑器,就需要手动更新ssh配置文件,极为不便,所以考虑使用一种优雅的方式&#xff0…

Linux,Windows或macOS系统的电脑怎样才能投屏到手机?

很多人都知道手机投屏到电脑的方法,但想要反过来的时候,却束手无策。 如果你想要将电脑投屏到手机,无论你的电脑是Windows,Linux还是macOS系统,无论你的手机是安卓、iOS还是鸿蒙,都可以用下面这个方法实现电…

YOLOv8改进 | 2023Neck篇 | 利用RepGFPN改进特征融合层(附yaml文件+添加教程)

一、本文介绍 本文给大家带来的改进机制是Damo-YOLO的RepGFPN(重参数化泛化特征金字塔网络),利用其优化YOLOv8的Neck部分,可以在不影响计算量的同时大幅度涨点(亲测在小目标和大目标检测的数据集上效果均表现良好涨点…

PPT插件-超好用的插件-统一尺寸、裁剪、分布-大珩助手

超级对齐-统一尺寸、裁剪、分布 操作方法 先选中1个或多个形状,然后最后选择目标形状,若希望形状的位置也改变,则需要在对齐幻灯下选中对齐对象。 等比缩放 将选中的1个或多个形状的外形尺寸设置为目标形状大小,图像的纵横比可…

Nginx rewrite 参数

目录 常用的Nginx 正则表达式 rewrite 和 location的区别 location location 大致分三类: location 常用的匹配规则: location 优先级: rewrite rewrite跳转实现 rewrite 执行顺序如下 语法格式 flag标记说明 rewrite实际操作 基…

微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的迅速发展,微信小程序已经成为企业、商家以及个人开发者的重要入口。小编给大家分享一款微信小程序万能建站源码系统,并附带完整的搭建教程,帮助用户轻松搭建自己的小程序平台。 以下是部分代码示例: 系统特色功能…

java综合实验-图书管理系统

二、实验项目内容(实验题目) 1. 使用Java编程语言进行实验。 2. 采用面向对象的思想进行系统设计。 3. 实现基本的图书管理功能,包括添加图书、删除图书、查询图书信息等。 4. 要求有良好的用户交互界面。 步骤参考: 步骤一…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类,用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性,优先级高,容易霸占锁,造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

Vue3-18-侦听器watch()、watchEffect() 的基本使用

什么是侦听器 个人理解:当有一个响应式状态(普通变量 or 一个响应式对象)发生改变时,我们希望监听到这个改变,并且能够进行一些逻辑处理。那么侦听器就是来帮助我们实现这个功能的。侦听器 其实就是两个函数&#xff…

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程,这样…

java SSM火车票务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM火车票务管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

51单片机的外部中断的以及相关寄存器的讲解

中断系统 本文主要涉及8051单片机的中断系统的讲解与使用 其中包括中断相关寄存器的介绍与使用以及外部中断初始化的代码分析。 文章目录 中断系统一、 中断的介绍二、 中断结构及相关寄存器2.1 中断源 2.2 中断请求控制器2.2.1 TCON寄存器2.2.2 SCON寄存器2.2.3 中断允许寄存器…

【算法小技巧】如何判断奇偶

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LLM(七)| Mamba:LLM新架构的浅探

目前大型语言模型(LLM)领域发展如火如荼,本文将重点探索在单个消费级GPU上可以有效运行的小型模型(≤7B个参数)。 我们将从以下几个方面重点介绍基于新架构的语言模型:🐍Mamba模型(h…

图-数据结构

图的介绍 如果你有学过《离散数学》,那么对图的概念一定不陌生,在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边连接(结对)。顶点用圆圈表示,边就是这些圆圈之间的连线。注意&a…

webGL开发数字孪生项目的流程

数字孪生是指使用数字模型来模拟和仿真现实世界的实体或系统。WebGL(Web Graphics Library)是一种用于在Web浏览器中进行高性能图形渲染的JavaScript API。将数字孪生与WebGL结合起来,可以实现在Web环境中呈现和交互数字模型的目标。北京木奇…

不完全伽马函数-Incomplete Gamma Function

REFERENCES Abramowitz, M. and Stegun, I. A. (Eds.). Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables, 9th printing. New York: Dover, p. 260, 1972. Arfken, G. “The Incomplete Gamma Function and Related Functions.” 10.5 in…

FRP 内网穿透工具部署

FRP 介绍 frp 是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官方网站:https://gofrp.org/zh-cn/ 项目地…

KylinV10 将项目上传至 Github

KylinV10 将项目上传至 Github 银河麒麟操作系统 V10 是在 Ubuntu 的基础上开发的,所以适用于 Ubuntu 的也适用于 KylinV10 一般上传至 GitHub,有两种方式,一种是 HTTPS,一种是 SSH,但是在 KylinV10 操作系统 HTTPS 的…

Gradio入门详细教程

常用的两款AI可视化交互应用比较: Gradio Gradio的优势在于易用性,代码结构相比Streamlit简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者。便…