编译打包自己的云手机(redroid)镜像

前言

香橙派上跑云手机可以看之前的文章:

  • 香橙派5plus上跑云手机方案一 redroid(带硬件加速)
  • 香橙派5plus上跑云手机方案二 waydroid

还有一个cuttlefish方案没说,后面再研究,cuttlefish的优势在于可以自定义内核且selinux是开启的,缺点是依旧无法调用GPU,操作起来会很卡。

这篇文章先说一下怎么编译redroid的docker镜像,方便后面修改源码定制镜像。不过再怎么定制也过不了大厂的风控,主要是redroid中的selinux无法开启,很容易被检测出来。

除非后面redroid能在selinux开启的情况下运行。不过单共享主机内核这点也是一堆特征,定制系统从实用性来讲还是手机更好些。

待更新

目前还有三个我感兴趣的东西值得研究下:

  • 修补内核在手机上运行docker和lxc,应该能在手机上运行Ubuntu的docker镜像吧
  • 手机刷原生的linux,这个可以刷的项目还挺多的,我看上的是droidian
  • 通过magisk模块刷linux,项目名叫Lindroid,支持的手机更多,而且刷的方法也最简单,不过目前刚出不是很成熟

droidian牛逼的在于大部分硬件驱动都能正常运行,甚至能在手机上运行的linux系统上运行waydroid(支持调用手机的GPU),再运行安卓APP,目前支持的所有功能如下:

我想知道的是能不能通过接口来控制这些功能,比如通过编程收发短信,开关数据等,因为我最先想到的是用它做4G代理。

折腾的意义

人总是很奇怪的,有了Windows,就想在Windows上运行linux和安卓;有了手机,又想在手机上运行linux和Windows;有了linux,又想在linux上运行安卓和Windows。

因为这么想的不止是一个人,所以现在这些想法都可以实现:

  • Windows运行安卓:某某模拟器
  • Windows运行linux:WSL、VMware等
  • 手机运行linux:droidian、Ubuntu Touch、postmarketOS、Sailfish OS、Mobian等
  • 手机运行Windows:这个只有特定的手机才支持,主要是驱动很难适配,目前支持最好的是一加6t这个手机
  • linux运行安卓:redroid、waydroid、Android studio自带的模拟器avd、cuttlefish等
  • linux运行Windows:有个在docker里运行Windows的项目: https://github.com/dockur/windows

那么问题来了,之前说了安卓修补内核是可以支持docker,那么能不能在安卓的docker里运行arm Windows呢?

准备工作

回到正题编译redroid镜像,编译需要的东西如下:

  • 300G左右的磁盘空间
  • 一个世界可及的网络
  • 一台性能还算过得去的x86电脑
下载源码

mkdir ~/redroid && cd ~/redroid

repo init -u https://github.com/redroid-rockchip/platform_manifests.git -b redroid-12.0.0 --depth=1 --git-lfs repo sync -c sudo apt install git-lfs repo forall -g lfs -c git lfs pull

网络需要稳定,如果不稳定的话,同步下来会有一些奇奇怪怪的bug,我试过解决这些bug不如换个稳定的网络重新同步一遍。接着就是漫长的等待时间,可以去做其他事了。

构建编译的docker镜像(可选)

安装docker:

sudo apt install docker.io -y
sudo usermod -aG docker $USER
sudo chmod a+rw /var/run/docker.sock

redroid官方给了一个用来编译的docker镜像,可以避免很多环境问题,推荐使用这个来编译。首先下载github仓库:

cd ~/ && git clone https://github.com/remote-android/redroid-doc.git
cd redroid-doc/android-builder-docker/

然后编辑Dockerfile文件,删除第九行# COPY sources.list etc/apt/sources.list前面的注释,sources.list里面是163的apt源,你也可以改成其他源。另外,还需要修改docker源,复制下面的名字粘贴回车:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

然后开始构建docker镜像: docker build --build-arg userid=$(id -u) --build-arg groupid=$(id -g) --build-arg username=$(id -un) -t redroid-builder .

构建的时候有一条警告:debconf: delaying package configuration, since apt-utils is not installed,搜索了一下,说这个无关紧要,不会影响正常使用,那就不用管它了。

启动容器并映射源码目录:docker run -it --rm --hostname redroid-builder --name redroid-builder -v ~/redroid:/src redroid-builder

参考链接

  • https://github.com/phusion/baseimage-docker/issues/319
  • DockerHub国内镜像源列表 https://github.com/cmliu/CF-Workers-docker.io/issues/8
开始编译
cd /src
. build/envsetup.sh
lunch redroid_arm64-userdebug
export TARGET_BOARD_PLATFORM_GPU=mali-G52
export TARGET_RK_GRALLOC_VERSION=4
m

我这个之前编译过有缓存,所以几分钟就编译完了,正常来说像i712700h这个CPU编译也得两小时。

打包镜像
cd out/target/product/redroid_arm64
sudo mount system.img system -o ro
sudo mount vendor.img vendor -o ro
sudo tar --xattrs -avcf redroid.tar.xz vendor -C system --exclude="./vendor" . 
sudo umount system vendor

导入镜像

把文件上传到香橙派上,用docker导入文件镜像文件

xz -dcT0 redroid.tar.xz | docker import -c 'ENTRYPOINT ["/init", "androidboot.hardware=redroid"]' - redroid

启动容器

docker run -d -p 5555:5555 -v ~/redroid-build:/data --name redroid-build -v /dev/mali0:/dev/mali0 --privileged redroid androidboot.redroid_height=1920 androidboot.redroid_width=1080 androidboot.redroid_gpu_mode=mali

如果不加-v /dev/mali0:/dev/mali0androidboot.redroid_gpu_mode=mali会出现闪屏的现象

参考文章:
  • https://github.com/redroid-rockchip
  • https://blog.csdn.net/CNflysky/article/details/136452455

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

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

相关文章

vue3下载base64文件

如果后端明确告诉你返回的是base64&#xff0c;那请求头就不用带responseType: “blob”,和普通的接口一样发送就行 await materialsFile({ id: proxy.$route.query.id }).then((res) > {if (res) {// atob先解码base64数据const raw window.atob(res.data);// 获取解码后…

vscode 远程开发

目录 vscode 远程连接 选择 Python 环境 vscode 远程连接 按 CtrlShiftP 打开命令面板。输入并选择 Remote-SSH: Open SSH Configuration File...。选择 ~/.ssh/config 文件&#xff08;如果有多个选项&#xff09;。在打开的文件中添加或修改你的 SSH 配置。 这个可以右键…

Jupyter Notebook基础:用IPython实现动态编程

Jupyter Notebook基础&#xff1a;用IPython实现动态编程 1. 引言 Jupyter Notebook是一个基于Web的交互式计算环境&#xff0c;允许用户创建和共享包含实时代码、方程式、可视化和文本叙述的文档。它广泛应用于数据清洗与转换、数值模拟、统计建模、机器学习以及其他数据科学…

开放开源开先河(一)

2022年7月28日&#xff0c;以“软件定义世界 开源共筑未来”为主题的全球数字经济大会开放原子开源峰会在北京开幕&#xff0c;承办主峰会和为捐赠人进行授牌仪式的开放原子开源基金会再次进入公众视野。基金会秘书长孙文龙从汇聚全球产业链开源力量、核心链接能力、开发者分享…

Aop切面编程(2)--代理模式

1、代理模式的理解&#xff1a;不修改A对象的代码的基础上&#xff0c;对A代码块进行拓展。通过创建ProxyA代理对象&#xff0c;拓展A对象并调用A对象的核心功能&#xff1b; 即&#xff1a;不修改对象的源码基础上&#xff0c;创建代理对象&#xff0c;进行功能的附加和增强&…

端到端拥塞控制的本质

昨天整理了一篇 bbr 的微分方程组建模(参见 bbr 建模)&#xff0c;算是 bbr 算法终极意义上的一个总结&#xff0c;最后也顺带了对 aimd 的描述&#xff0c;算是我最近比较满意的一篇分享了。那么接下来的问题&#xff0c;脱离出具体算法&#xff0c;上升到宏观层面&#xff0c…

git reset hard和soft的使用和区别

在Git中&#xff0c;git reset命令用于撤销提交、回溯版本和调整工作目录或暂存区状态&#xff0c;而不是gitrestore。git reset主要有三种模式&#xff1a;--soft、--mixed&#xff08;默认&#xff09;和--hard。以下是关于--hard和--soft两种模式的使用方法和区别的详细解释…

uniapp微信小程序 TypeError: $refs[ref].push is not a function

我的写法 this.$refs.addPopup.open();报错 打印出来是这样的 解决 参考未整理 原因 在当前页面使用的v-for循环 并且循环体内也有组件使用了ref&#xff08;而我没有把每个ref做区别命名&#xff09; 这样就导致了我有很多同名的ref&#xff0c;然后就报错了 解决办法&a…

AI人工智能作词,为音乐注入未来之力

在当今的音乐世界中&#xff0c;创新的力量不断推动着边界的拓展&#xff0c;而人工智能作词正以其独特的魅力&#xff0c;成为引领音乐走向未来的强大动力。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff09;”无疑是这股浪潮中的璀璨明星。它利用先进的人工智能技术…

记录一次Android推流、录像踩坑过程

背景&#xff1a; 按照需求&#xff0c;需要支持APP在手机息屏时进行推流、录像。 技术要点&#xff1a; 1、手机在息屏时能够打开camera获取预览数据 2、获取预览数据时进行编码以及合成视频 一、息屏时获取camera预览数据&#xff1a; ①Camera.setPreviewDisplay(SurfaceH…

通过 Azure OpenAI 服务使用 GPT-35-Turbo and GPT-4(win版)

官方文档 Azure OpenAI 是微软提供的一项云服务&#xff0c;旨在将 OpenAI 的先进人工智能模型与 Azure 的基础设施和服务相结合。通过 Azure OpenAI&#xff0c;开发者和企业可以访问 OpenAI 的各种模型&#xff0c;如 GPT-3、Codex 和 DALL-E 等&#xff0c;并将其集成到自己…

input上传--upload

1.HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>上传文件</title><link rel"…

《C++并发编程实战》笔记(一、二)

一、简介 抽象损失&#xff1a;对于实现某个功能时&#xff0c;可以使用高级工具&#xff0c;也可以直接使用底层工具。这两种方式运行的开销差异称为抽象损失。 二、线程管控 2.1 线程的基本控制 1. 创建线程 线程相关的管理函数和类在头文件&#xff1a; #include <…

数据结构——线性表(C语言实现)

写在前面&#xff1a; 在前面C语言的结构体学习中&#xff0c;我提及了链表的操作&#xff0c; 学习数据结构我认为还是需要对C语言的数组、函数、指针、结构体有一定的了解&#xff0c;不然对于结构体的代码可能很难理解&#xff0c;特别是一些书籍上面用的还是伪代码&#xf…

OpenGL笔记一之基础窗体搭建以及事件响应

OpenGL笔记一之基础窗体搭建以及事件响应 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记一之基础窗体搭建以及事件响应1.运行2.目录结构3.main.cpp4.CMakeList.txt 1.运行 2.目录结构 01_GLFW_WINDOW/ ├── CMakeLists.txt ├── glad.c ├── main…

Linux基于centos7指令初学3

date指令 作用&#xff1a; date指令可以查看时间 这个指令可以进行格式化 格式&#xff1a;date %想要的内容 Y&#xff1a;年份 m&#xff1a;月份 d&#xff1a;日 H&#xff1a;时 M&#xff1a;分 S&#xff1a;秒 时间分界线可以由…

GIT相关操作,推送本地分支到远程仓库流程记录学习

git流程 切换到源文件夹&#xff1a;cd 源文件夹克隆远程仓库&#xff1a;git clone [ssh]进入项目文件夹&#xff1a;cd .\project\查看本地分支&#xff1a;git branch获取远程仓库更新&#xff0c;使远程同步&#xff1a;git fetch查看所有分支&#xff08;包括远程分支&am…

OJ-0712

示例1&#xff1a; input 8 123 124 125 121 119 122 126 123 output 1 2 6 5 5 6 0 0示例2&#xff1a; input 2 95 100 output 1 0示例3&#xff1a; input 2 100 95 output 0 1package com.wsdcode.od;import java.util.Scanner;public class Main {public static void m…

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…

安装jenkins最新版本初始化配置及使用JDK1.8构建项目详细讲解

导读 1.安装1.1.相关网址1.2.准备环境1.3.下载安装 2. 配置jenkins2.1.安装插件2.2.配置全局工具2.3.系统配置 3. 使用3.1.配置job3.2.构建 提示&#xff1a;如果只想看如何使用jdk1.8构建项目&#xff0c;直接看3.1即可。 1.安装 1.1.相关网址 Jenkins官网&#xff1a;https…