orangepi 5 plus ubuntu24.04上安装redroid
orangepi 5 plus 刷了2404的版本,内核也更新了。
GitHub - Joshua-Riek/ubuntu-rockchip: Ubuntu for Rockchip RK35XX Deviceshttps://github.com/Joshua-Riek/ubuntu-rockchip在这个上面安装redroid 时
redroid-modules/README.md at master · remote-android/redroid-modules · GitHubhttps://github.com/remote-android/redroid-modules/blob/master/README.md下面命令就不好用了,因为内核变了
# Ubuntu 20.04+ (kernel 5.0+) sudo modprobe ashmem_linux sudo modprobe binder_linux devices=binder,hwbinder,vndbinder
明白 ✅。你是在 RK3588 + Ubuntu 24.04 上想跑 reDroid (一个 Android in Docker 的实现)。
我帮你梳理一套专门针对 RK3588 / Ubuntu 24.04 的安装流程,顺便解释跟 ashmem/binder 的关系。
1. reDroid 的运行条件
reDroid 本质是一个 Android GSI 内核补丁 + 容器运行环境,依赖以下几点:
-
内核必须支持 Android binder(binderfs/binder_linux)
-
ashmem 以前需要,但新版本可用 memfd 替代(你遇到
ashmem_linux
not found 就是因为内核没带 ashmem,Ubuntu 24.04 默认也不用它了) -
Docker 或 Podman 作为容器运行环境
-
GPU 驱动/硬件加速:RK3588 上要结合 Mali GPU 驱动 + drm/kms 才能硬解码显示
2. 检查内核支持
容器场景通常只需要 binder(binderfs),ashmem 可由 memfd 兼容层替代。先检查 binder:
# 看配置(存在其一就行)
zcat /proc/config.gz 2>/dev/null | grep -E 'BINDER|BINDERFS' || \
grep -E 'BINDER|BINDERFS' /boot/config-$(uname -r)# 看能否加载 binder 模块
sudo modprobe binder_linux 2>/dev/null || true# 尝试挂载 binderfs
sudo mkdir -p /dev/binderfs
sudo mount -t binder none /dev/binderfs 2>/dev/null || sudo mount -t binder binder /dev/binderfs# 验证
ls -l /dev/binderfs
运行下面的脚本,确认 binder 是否启用:
zcat /proc/config.gz | grep BINDER || grep BINDER /boot/config-$(uname -r)ls /dev | grep binder
ls /dev/binderfs
-
如果能看到 binder/binderfs → OK
-
ashmem 不出现没关系,reDroid >= 11 可以直接用 memfd,不会影响
3. 安装依赖
sudo apt update
sudo apt install -y docker.io uidmap curl unzip
sudo systemctl enable docker
sudo systemctl start docker
检查 Docker:
docker run hello-world
4. 拉取 reDroid 镜像
reDroid 官方提供 Android 各版本镜像(arm64 也支持):
# Android 13 示例
docker pull redroid/redroid:13.0.0-arm64
常见版本:12.0.0-arm64
, 13.0.0-arm64
, 14.0.0-arm64
5. 启动 reDroid 容器
运行命令示例:
sudo docker run -d --name redroid-gpu-rk \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/gpu-acc/android12-redroid-data:/data \--device /dev/dri:/dev/dri \--device /dev/mali0:/dev/mali0 \-p 55559:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_gpu_mode=guest \androidboot.redroid_memfd=true \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480
参数说明:
-
--privileged
→ 容器需要访问 binderfs -
-v /dev/binderfs:/dev/binderfs
→ 挂载主机的 binderfs -
androidboot.redroid_gpu_mode=
guest → 使用 RK3588 的 GPU(host 需要 Mali 驱动)guest相当于没有用,另外使用guest时,连adb连不上,还在排查原因 -
androidboot.redroid_memfd=true
→ 告诉 reDroid 用 memfd 替代 ashmem
6. 连接并使用
启动后,你可以通过 ADB 连接:
adb connect localhost:5555
adb shell
你应该能进入 Android 容器的 shell。
7. 显示/图形输出
在 SBC(RK3588)上,reDroid 默认是 headless(无界面)。常见做法有两种:
-
用 scrcpy 或 VNC:在 reDroid 内跑 VNC server,然后用客户端连接
-
直通 GPU:RK3588 内核+Docker 驱动允许时,可以跑
androidboot.redroid_gpu_mode=host
,这样性能更好(但依赖 Mali GPU 驱动是否正确安装)
8. 总结
-
你 不需要 ashmem → reDroid 用
memfd
替代 -
只要保证 binderfs 可用 就能跑
-
GPU 加速在 RK3588 上可能要额外配置(比如装 Rockchip Mali 驱动、修改 Docker 参数) reDroid)?这样你只要运行脚本,就能直接起来一个 Android 容器。
安装Docker + reDroid
以下是基于ubuntu2404的
sudo apt install -y docker.io uidmap curl unzip
sudo systemctl enable docker
sudo systemctl start docker
nano /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.1ms.run"]
}
另外要加上代理才可以下载镜像
终端命令行临时代理(仅当前终端有效):
export http_proxy=http://10.10.10.215:7897
export https_proxy=http://10.10.10.215:7897
终端永久代理设置(适用于所有终端)
打开终端,编辑~/.bashrc文件:nano ~/.bashrc
在文件底部加入:
export http_proxy="http://10.10.10.215:7897"
export https_proxy="http://10.10.10.215:7897"
运行下载
sudo mkdir -p /opt/android12-redroid-datasudo docker run -itd --rm --privileged \--pull always \-v /opt/android12-redroid-data:/data \-p 55556:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 \androidboot.redroid_height=1920 \androidboot.redroid_dpi=480 \
上面这个命令-v /opt/android12-redroid-data:/data 相当于把/opt/android12-redroid-data 映射给 android /data文件夹,在/opt/android12-redroid-data中就可以看到各种Android的文件
apt install adbsnap install scrcpy
这时本机上
adb connect localhost:55556scrcpy -s localhost:55556
就可以远程控制了,
外网时
adb connect 10.10.10.211:55556 scrcpy -s 10.10.10.211:55556
还有其它rom下载参考 redroid:15.0.0-latest 这个版本有问题,我试了12-13-14都可以,但是gpu加速还没有调试通过
redroid/redroid - Docker Image | Docker Hubhttps://hub.docker.com/r/redroid/redroid
目前还不支持gpu加速,要加速参考下面的香橙派5plus上跑云手机方案一 redroid(带硬件加速)https://mp.weixin.qq.com/s/1e8er_amC94DTVCaNbSuUw
sudo docker run -itd --rm --privileged \ --pull always \ -v ~/data:/data \ -p 5555:5555 \ redroid/redroid:12.0.0_64only-latest
上面这个命令-v ~/data:/data 相当于把/root/data/ 映射给 android /data文件夹,在/root/data/中就可以看到各种文件
参考
Redroid running on ROCK 5B | Radxa | Open Innovation · Edge EmpoweredWhat is Redroid ?https://radxa.com/blog/Redroid-running-on-ROCK-5B/?utm_source=chatgpt.com
容器虚拟安卓 — Firefly WikiiCore-3588Q采用Rockchip RK3588新一代旗舰级八核64位处理器,最大可配32GB大内存;支持8K视频编解码;采用了BTB接口,传输能力更强;拥有丰富的接口,支持多硬盘、千兆网、WiFi6、5G/4G扩展和多种视频输入输出;支持多种操作系统;可适用于ARM PC、边缘计算、云服务器、智能NVR等领域https://wiki.t-firefly.com/zh_CN/iCore-3588Q/usage_aic.html
写一个做大做强的脚本,同时安装5 个android12 ,貌似可以同时在线运行
# 用户1
sudo docker run -itd --name redroid-u1 --rm --privileged \-v /dev/binderfs:/dev/binderfs \-v /opt/usr1/android12-redroid-data:/data \-p 55551:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户2
sudo docker run -itd --name redroid-u2 --rm --privileged \-v /dev/binderfs:/dev/binderfs \-v /opt/usr2/android12-redroid-data:/data \-p 55552:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户3
sudo docker run -itd --name redroid-u3 --rm --privileged \-v /dev/binderfs:/dev/binderfs \-v /opt/usr3/android12-redroid-data:/data \-p 55553:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户4
sudo docker run -itd --name redroid-u4 --rm --privileged \-v /dev/binderfs:/dev/binderfs \-v /opt/usr4/android12-redroid-data:/data \-p 55554:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户5
sudo docker run -itd --name redroid-u5 --rm --privileged \-v /dev/binderfs:/dev/binderfs \-v /opt/usr5/android12-redroid-data:/data \-p 55555:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true
上面的代码,随着重启动docker不会自动启动,下面代码执行后,会随着系统启动docker
# 如已有旧容器,先删(忽略不存在的报错)
sudo docker rm -f redroid-u1 2>/dev/nullsudo docker run -d --name redroid-u1 \--privileged \--restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr1/android12-redroid-data:/data \-p 55551:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 \androidboot.redroid_height=1920 \androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true
方案(Docker 重启策略),给 u2 ~ u5 做到“开机自启、数据持久化、binderfs 挂载”。下面整套命令一次搞定(可整段复制执行)。
# 1) 确保 binderfs 开机自动挂载(只需执行一次)
sudo mkdir -p /dev/binderfs
grep -qE '^[^#]*\sbinderfs\s' /etc/fstab || \echo 'binder /dev/binderfs binder defaults,nofail 0 0' | sudo tee -a /etc/fstab
sudo mount -a # 立即生效# 2) 为 u2~u5 准备数据目录
sudo mkdir -p /opt/usr2/android12-redroid-data \/opt/usr3/android12-redroid-data \/opt/usr4/android12-redroid-data \/opt/usr5/android12-redroid-data# 3) 如果之前起过容器,先删掉(忽略不存在的报错)
sudo docker rm -f redroid-u2 redroid-u3 redroid-u4 redroid-u5 2>/dev/null# 4) 以 --restart unless-stopped 方式重建(去掉 --rm,不要 --pull always)
sudo docker run -d --name redroid-u2 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr2/android12-redroid-data:/data \-p 55552:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=truesudo docker run -d --name redroid-u3 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr3/android12-redroid-data:/data \-p 55553:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=truesudo docker run -d --name redroid-u4 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr4/android12-redroid-data:/data \-p 55554:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=truesudo docker run -d --name redroid-u5 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr5/android12-redroid-data:/data \-p 55555:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=truesudo docker run -d --name redroid-u6 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr6/android12-redroid-data:/data \-p 55556:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户7
sudo docker run -d --name redroid-u7 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr7/android12-redroid-data:/data \-p 55557:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true# 用户8
sudo docker run -d --name redroid-u8 \--privileged --restart unless-stopped \-v /dev/binderfs:/dev/binderfs \-v /opt/usr8/android12-redroid-data:/data \-p 55558:5555 \redroid/redroid:12.0.0_64only-latest \androidboot.redroid_width=1080 androidboot.redroid_height=1920 androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true
验证
# 看容器是否在跑
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'# 检查重启策略
docker inspect -f '{{.Name}} => {{.HostConfig.RestartPolicy.Name}}' redroid-u2 redroid-u3 redroid-u4 redroid-u5
# 应显示 unless-stopped
连接(示例)
adb connect 127.0.0.1:55552
adb connect 127.0.0.1:55553
adb connect 127.0.0.1:55554
adb connect 127.0.0.1:55555
小提示
自动启动场景不要加
--pull always
,避免开机网络未就绪导致失败。端口冲突就把
-p
的左边(宿主机端口)改成空闲的。如果你之后也想让 u1 改为同样的策略,做法相同:去掉
--rm
,加--restart unless-stopped
重建即可。
另外测试时可以让路数可控,命令如下
# 保存为 setup_redroid_8.sh;执行示例:
# sudo bash setup_redroid_8.sh
# COUNT=4 sudo bash setup_redroid_8.sh
# COUNT=6 START_IDX=3 BASE_PORT=55600 sudo bash setup_redroid_8.sh#!/usr/bin/env bash
set -euo pipefail# ===== 可配置项(环境变量可覆盖) =====
IMAGE="${IMAGE:-redroid/redroid:12.0.0_64only-latest}"
BASE="${BASE:-/opt}"
BINDERFS="${BINDERFS:-/dev/binderfs}"COUNT="${COUNT:-8}" # 路数(实例个数)
START_IDX="${START_IDX:-1}"# 起始编号(实例名 redroid-u<idx>)
BASE_PORT="${BASE_PORT:-55550}" # 宿主机端口起始(实际从 BASE_PORT+1 起)# ===== 1) 确保 binderfs 开机自动挂载(只需一次) =====
mkdir -p "$BINDERFS"
if ! grep -qE '(^|[[:space:]])binder[[:space:]]+/dev/binderfs[[:space:]]+binder' /etc/fstab; thenecho 'binder /dev/binderfs binder defaults,nofail 0 0' >> /etc/fstab
fi
mount -a# ===== 2) 预创建数据目录 =====
END_IDX=$((START_IDX + COUNT - 1))
for i in $(seq "$START_IDX" "$END_IDX"); domkdir -p "${BASE}/usr${i}/android12-redroid-data"
done# ===== 3) 如已存在同名容器,先清掉避免重名 =====
for i in $(seq "$START_IDX" "$END_IDX"); dodocker rm -f "redroid-u${i}" 2>/dev/null || true
done# ===== 4) 启动 N 路容器 =====
for i in $(seq "$START_IDX" "$END_IDX"); do# 宿主机端口:从 BASE_PORT+1 递增HOSTPORT=$(( BASE_PORT + (i - START_IDX + 1) ))NAME="redroid-u${i}"DATADIR="${BASE}/usr${i}/android12-redroid-data"echo "[*] Starting ${NAME} on host port ${HOSTPORT} ..."docker run -d --name "${NAME}" \--privileged \--restart unless-stopped \-v "${BINDERFS}:${BINDERFS}" \-v "${DATADIR}:/data" \-p "${HOSTPORT}:5555" \"${IMAGE}" \androidboot.redroid_width=1080 \androidboot.redroid_height=1920 \androidboot.redroid_dpi=480 \androidboot.redroid_memfd=true
doneecho "=== Done. Containers ==="
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
你要把这些 Docker 镜像导出,其实有两种常用方法:
方法一:单个镜像导出成 .tar
文件
用 docker save
:
# 导出 redroid/redroid:15.0.0-latest 到本地 tar 文件
docker save -o redroid_15.0.0-latest.tar redroid/redroid:15.0.0-latest# 再比如导出 cnflysky/redroid-rk3588:12.0.0-latest
docker save -o redroid-rk3588_12.0.0-latest.tar cnflysky/redroid-rk3588:12.0.0-latest
导出的 .tar
文件可以拷贝到别的机器,用下面命令导入:
docker load -i redroid_15.0.0-latest.tar
方法二:批量导出所有镜像
你可以用一条命令循环导出:
for img in $(docker images --format "{{.Repository}}:{{.Tag}}"); dofname=$(echo $img | tr '/:' '_')echo "Saving $img to ${fname}.tar"docker save -o ${fname}.tar $img
done
执行后会在当前目录生成一堆 tar 文件,例如:
-
redroid_redroid_15.0.0-latest.tar
-
cnflysky_redroid-rk3588_12.0.0-latest.tar
方法三:打包整个镜像库(不常用)
如果你想一次性导出全部镜像到一个文件,可以:
docker save $(docker images -q) -o all-images.tar
然后另一台机器:
docker load -i all-images.tar
sudo chmod -R 755 /media/orangepi/opi_root/dockerTar
进入容器
出问题调试
docker exec -it redroid-gpu-rk shredroid-gpu-rk是容器名
运行logcat 就有日志
👌 可以的,我帮你写一个完整的 shell 脚本,把所有镜像批量导出到你指定的目录 /media/orangepi/opi_root/dockerTar
:
脚本内容:save_all_images.sh
#!/bin/bash
set -e# 目标目录
DEST="/media/orangepi/opi_root/dockerTar"# 创建目标目录(如果不存在)
mkdir -p "$DEST"# 遍历所有镜像并导出
for img in $(docker images --format "{{.Repository}}:{{.Tag}}"); dofname=$(echo $img | tr '/:' '_')echo "Saving $img to $DEST/${fname}.tar"docker save -o "$DEST/${fname}.tar" "$img"
doneecho "✅ 所有镜像已保存到 $DEST"
使用方法
-
保存脚本:
nano save_all_images.sh
粘贴上面的内容,保存退出。
-
赋予可执行权限:
chmod +x save_all_images.sh
-
执行脚本:
./save_all_images.sh
-
导出结果:
所有镜像会以repository_tag.tar
的形式保存到:/media/orangepi/opi_root/dockerTar
另外昨天突然不能上网上了,ip也是正常,把防火墙重搞一下好了
sudo ufw disablesudo iptables -F
查看npu的占用情况
watch sudo cat /sys/kernel/debug/rknpu/load
参考
香橙派5plus上跑云手机方案一 redroid(带硬件加速)
香橙派5plus从ssd启动Ubuntu
下面再总结一下如何使和gpu加速
redroid-rk3588/README_zh.md at main · CNflysky/redroid-rk3588 · GitHubhttps://github.com/CNflysky/redroid-rk3588/blob/main/README_zh.md
香橙派5plus上跑云手机方案一 redroid(带硬件加速)https://mp.weixin.qq.com/s/1e8er_amC94DTVCaNbSuUwhttps://mp.weixin.qq.com/s/1e8er_amC94DTVCaNbSuUw香橙派5plus从ssd启动Ubuntuhttps://mp.weixin.qq.com/s?__biz=MzU0OTkwODU2MA==&mid=2247484526&idx=1&sn=01a6526b10d0f28ebfc6671c5105f1bc&scene=21&poc_token=HEvYtmij6u_6cUcVxO18MKvVUGV5tL7dfgu0T3eO
https://mp.weixin.qq.com/s?__biz=MzU0OTkwODU2MA==&mid=2247484526&idx=1&sn=01a6526b10d0f28ebfc6671c5105f1bc&scene=21&poc_token=HEvYtmij6u_6cUcVxO18MKvVUGV5tL7dfgu0T3eOUSE Redroid | Radxa DocsHelp you use Redroid cloud mirroringhttps://docs.radxa.com/en/rock5/rock5b/app-development/redroid
https://docs.radxa.com/en/rock5/rock5b/app-development/redroid
探索香橙派5plus的云手机方案及多系统兼容性https://baijiahao.baidu.com/s?id=1833473653129708462&wfr=spider&for=pchttps://baijiahao.baidu.com/s?id=1833473653129708462&wfr=spider&for=pcGitHub - CNflysky/redroid-rk3588: Redroid images for Rockchip RK3588 series SoChttps://github.com/CNflysky/redroid-rk3588
https://github.com/CNflysky/redroid-rk3588