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

2023-11-07

一句废话

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

起因

很久以前看见有群友讨论关于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即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Leptonica PIX 与 Qt QImage 的相互转换

    最近有个项目需要用到 OCR 功能 研究了一下 感觉 Tesseract 还不错 准备在项目中试试 但是发现 Tesseract 底层图像数据用到了 Leptonica 而我的程序准备用 Qt C 来写 这里就涉及一个问题 如何把 QIma
  • 提示Cannot resolve symbol xxx的解决办法

    今天有读者反映在spring boot项目中 已经导入了所有需要的包 但是提示如下错误 Cannot resolve symbol xxx 该错误的解决办法是 1 单击IDEA开发工具的File gt Invalidate Caches R
  • 数据结构视频教程 -《(东南大学 王茜)数据结构 (64讲)》

    整个视频打包下载地址 史上最全的数据结构视频教程系列分享之 东南大学 王茜 数据结构 64讲 转载请保留出处和链接 更多优秀资源请访问 我是码农 数据结构对于从事计算机系统软件和应用软件设计与开发人员非常重要 程序设计语言为数据结构的描述提
  • 基于Spring Boot开发的社区物业管理系统

    文章目录 项目介绍 主要功能截图 登录 车位收费管理 物业收费管理 投诉信息管理 车位管理 保修统计分析 部分代码展示 设计总结 项目获取方式 作者主页 Java韩立 简介 Java领域优质创作者 简历模板 学习资料 面试题库 关注我 都给
  • 【python教程入门学习】学习Python爬虫前的准备工作

    在使用 Python 编写爬虫程序之前 您需要提前做一些准备工作 这样在后续学习过程中才会得心应手 知识准备 1 Python语言 Python 爬虫作为 Python 编程的进阶知识 要求学习者具备较好的 Python 编程基础 对于没有
  • 浏览器输入url后发生了什么?

    在浏览器输入url后会发生的过程 1 DNS对域名进行解析 2 建立TCP连接 三次握手 3 发送HTTP请求 4 服务器处理请求 5 返回响应结果 6 关闭TCP连接 四次挥手 7 浏览器解析HTML 8 浏览器布局渲染 1 浏览器对输入
  • Flink流和表的转换

    流 表的转换 1 这种方式后续要进行tableSql的操作 推荐 tableEnv createTemporaryView tableName dataStream 2 这种方式后续要进行tableApi的操作不常用 Table table
  • Linux文件权限管理 chmod 读、写、可执行

    使用 ls l 查看文件权限 左侧第一列 rw r r 这些就是文件的权限信息 文件的权限分为三种 三种权限可相互叠加 最高权限为7 权限 字母 对应的二进制 对应的八进制 读 r 100 4 写 w 010 2 可执行 x 001 1 嗯
  • ajax传参数json对象到后台获取

    var data data name pxxx paramData dataSource a1 table t1 field f1 r name1 01 p name2 02 p 10 100 name2 01 p dataSource a
  • 输入若干个整数,当输入0时表示结束,统计每个输入整数的出现次数。

    描述 输入若干个整数 当输入0时表示结束 统计每个输入整数的出现次数 输入 输入若干个整数 整数之间以空格间隔 当输入0时表示结束 输出 分行输出每个整数出现的次数 行末不能有多余空格 输入示例 11 22 35 68 97 63 22 6
  • 内存分页、进程分页、页表长度

    内存分页 进程分页 页表长度 内存分页 内存空间分成一个个大小相等的分区 页框号或物理块号从0开始 每一个分区称作页框 一般大小为 4KB 进程分页 将用户进程的地址空间分为与页框大小相等的一个个区域 页号一般从0开始 每一个分区称作页 一
  • 设计模式:装饰者模式

    定义 动态给一个对象添加一些额外的职责 就象在墙上刷油漆 使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活 设计初衷 通常可以使用继承来实现功能的拓展 如果这些需要拓展的功能的种类很繁多 那么势必生成很多子类 增加系统
  • Latex写文章时插入单栏图片和双栏图片方法

    环境 WinEdt7 0 前言 使用latex写文章 经常需要插入图片 有时插入的图片需要单栏排版 有时插入的图片需要双栏排版 下面汇总单双栏图片插入方法 1 单栏图片 插入单栏图片很简单 许多文章的latex模板里面都有例子 即以下代码
  • 【09】Nginx之缓存集成

    Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区 称作 Cache 当用户要获取数据的时候 会先从缓存中去查询获取数据 如果缓存中有就会直接返回给用户 如果缓存中没有 则会发请求从服务器重新查询数据 将数据返回给用户的同时将数据放入
  • html5 try upgrading your browser,用html5做flex的离线应用程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 HTML5 草案的前身名为 Web Application 1 0 HTML5 的目标是保持和当前 HTML 标准 HTM L4 01 以及 HTML 的 XML 版本 XHMTL1 0 向后兼
  • Javase学习必备工具,超详细的OneNote安装使用教程

    为什么要记笔记 方便回顾复习 Java的技术体系庞大 并且每天都有新内容 为了防止遗忘 建议制定有规律的复习计划 笔记是回顾复习的依据 课下自己写的练习代码应该是尝试推翻这些课堂上记录的重点结论 笔记是重要结论的集中地 记笔记在学习中起到很
  • flutter入门自定义实现PopupWindow功能

    https blog csdn net email jade article details 87922051 其实就是自定义一个weight 实现 poproute 构建一个子布局传入即可 1功能显示和隐藏 用自定义的view 2 具体操
  • Qt 5.9.6 下载及安装

    1 下载并安装 Qt 5 9 6 官网下载地址 http download qt io archive qt 5 9 5 9 6 qt opensource windows x86 5 9 6 exe 下载后安装 安装路径不能有中文字符及空
  • node读取文件转换json文件

    323 text h323 3gp video 3gpp aab application x authoware bin aam application x authoware map aas application x authoware
  • 记一次在OrangePiZero2(香橙派zero 2)上部署Redroid(云手机)的过程

    一句废话 这次换一种写作风格 尝试一下轻松的行文方式 起因 很久以前看见有群友讨论关于docker部署Redroid 拿来挂机玩游戏一类的 当时听了感觉很有意思 后面粗浅地在zero2上部署了一下 容器虽然是跑起来了 但是scrcpy连接总