编译适用于RK3588的Redroid镜像

2024-03-04 17:20

本文主要是介绍编译适用于RK3588的Redroid镜像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编译适用于RK3588的Redroid镜像

不想编译的话可以用笔者的镜像:
GitHub链接

引言

Redroid是什么,不想多说,一个词总结: 云手机

准备工作

AOSP代码一堆,编译起来要命,所以租个高配服务器,笔者用的是Vultr的云服务器,6c 16G 320G配置,五个小时才编译出来

装docker,装repo,装git-lfs:

sudo apt install docker.io repo git-lfs

创用户,自己拿adduser创个,教程一堆,创完给root权限,然后切到这个用户下。

同步代码:

# 这里使用了ice-black-tea大佬的仓库,在此对他表示感谢。
mkdir ~/redroid && cd ~/redroid
sudo repo init -u https://github.com/redroid-rockchip/platform_manifests.git -b redroid-12.0.0 --depth=1 --git-lfs
sudo repo sync -c

同步webview:

sudo apt install git-lfs
sudo repo forall -g lfs -c git lfs pull

修改build/soong/cc/config/global.go,向commonGlobalCflags数组添加全局cflags "-DANDROID_12"

代码同步完成后将源码的所有者改为当前用户:

sudo chown -R `whoami`:`whoami` ~/redroid

编译

构建编译镜像:

cd ~/ && git clone https://github.com/remote-android/redroid-doc.git
cd redroid-doc/android-builder-docker/
docker build --build-arg userid=$(id -u) --build-arg groupid=$(id -g) --build-arg username=$(id -un) -t redroid-builder .

启动镜像:

# 建议丢到screen里面
docker run -it --rm --hostname redroid-builder --name redroid-builder -v ~/redroid:/src redroid-builder

在镜像命令行中输入:

cd /src
. build/envsetup.sh
lunch redroid_arm64-userdebug
export TARGET_BOARD_PLATFORM_GPU=mali-G52 TARGET_RK_GRALLOC_VERSION=4

开始编译:

m

打包

回到主机命令行:

cd ~/redroid/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

导入

打完包把镜像推开发板上,然后导入:

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

运行

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

自定义

Android 12有个secure flag机制,有些app在输入用户名密码界面会用到这个flag,导致scrcpy串流的时候会黑屏。这里通过修改surfaceflinger的方式来去掉这个限制:
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:

sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName, bool secure,float requestedRefreshRate) {// onTransact already checks for some permissions, but adding an additional check here.// This is to ensure that only system and graphics can request to create a secure// display. Secure displays can show secure content so we add an additional restriction on it.const int uid = IPCThreadState::self()->getCallingUid();if (secure && uid != AID_GRAPHICS && uid != AID_SYSTEM) {ALOGE("Only privileged processes can create a secure display");return nullptr;}class DisplayToken : public BBinder {sp<SurfaceFlinger> flinger;virtual ~DisplayToken() {// no more references, this display must be terminatedMutex::Autolock _l(flinger->mStateLock);flinger->mCurrentState.displays.removeItem(wp<IBinder>::fromExisting(this));flinger->setTransactionFlags(eDisplayTransactionNeeded);}public:explicit DisplayToken(const sp<SurfaceFlinger>& flinger): flinger(flinger) {}};sp<BBinder> token = sp<DisplayToken>::make(sp<SurfaceFlinger>::fromExisting(this));Mutex::Autolock _l(mStateLock);// Display ID is assigned when virtual display is allocated by HWC.DisplayDeviceState state;// 默认创建安全显示器 secure = true;state.isSecure = secure;state.displayName = displayName;state.requestedRefreshRate = Fps::fromValue(requestedRefreshRate);mCurrentState.displays.add(token, state);return token;
}

搞出来之后可以编译成镜像,或者cdframeworks/native/services/surfaceflingermmsurfaceflinger可执行文件之后丢到已有的容器里面。

个人blog: cnflysky.com,欢迎访问。

这篇关于编译适用于RK3588的Redroid镜像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773891

相关文章

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭