找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 28|回复: 0

在docker容器中运行安卓系统redroid

[复制链接]

1

主题

10

回帖

146

积分

管理员

积分
146
发表于 2025-10-15 00:48:51 | 显示全部楼层 |阅读模式

前言

在Linux中运行安卓系统有各种各样的方案
重量级一点就是直接拿虚拟机跑一个,轻量级一点就是用应用框架直接跑apk
但综合来说性能与兼容性最佳的方案应该是以redroid为代表的容器化运行安卓系统的方案

塞驱动

redroid运行前需要加载几个驱动

ashmem

这个驱动在高版本Linux内核已经被废弃,移植成本较高,可以直接放弃
改用androidboot.use_memfd=memfd替代即可

binder_linux

在编译这个驱动之前,先修改一下源码避免后续权限不对造成的麻烦

我们需要新增一行binder_device->miscdev.mode = 0777;
代码节选大概就是这个样子
https://github.com/torvalds/linux/blob/v6.12/drivers/android/binder.c
上面这个链接就是原始代码,下面的是改完的样子,可以自行对比init_binder_device

static int __init init_binder_device(const char *name){	int ret;	struct binder_device *binder_device;	binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL);	if (!binder_device)		return -ENOMEM;	binder_device->miscdev.fops = &binder_fops;	binder_device->miscdev.minor = MISC_DYNAMIC_MINOR;	binder_device->miscdev.name = name;	binder_device->miscdev.mode  = 0777;	refcount_set(&binder_device->ref, 1);	binder_device->context.binder_context_mgr_uid = INVALID_UID;	binder_device->context.name = name;	mutex_init(&binder_device->context.context_mgr_node_lock);	ret = misc_register(&binder_device->miscdev);	if (ret < 0) {		kfree(binder_device);		return ret;	}	hlist_add_head(&binder_device->hlist, &binder_devices);	return ret;}

新建如下文件夹

mkdir -p /lib/modules/6.12.18-trim/updates/dkms/android

编译完成后,将构建产物 binder_linux.ko 丢进去

cp ./binder_linux.ko /lib/modules/6.12.18-trim/updates/dkms/android/depmodmodprobe -D binder_linux

如果没有异常,会返回驱动模块的目录

root@fnnas:~# modprobe -D binder_linux insmod /lib/modules/6.12.18-trim/updates/dkms/android/binder_linux.ko

随后就可以加载模块了

modprobe -v binder_linux devices="binder,hwbinder,vndbinder"lsmod |grep bin

回显大概是这样的

root@fnnas:~# modprobe -v binder_linux devices="binder,hwbinder,vndbinder"insmod /lib/modules/6.12.18-trim/updates/dkms/android/binder_linux.ko devices=binder,hwbinder,vndbinderroot@fnnas:~# lsmod |grep binbinder_linux          229376  0binfmt_misc            28672  1

拉容器

redroid有非常多的衍生版本,你可以自己选择喜欢的
这里以 https://hub.docker.com/r/erstt/redroid 为例

docker pull erstt/redroid:12.0.0_houdini_WSA

回显如下

root@fnnas:~# docker pull erstt/redroid:12.0.0_houdini_WSA12.0.0_houdini_WSA: Pulling from erstt/redroid88f77cbe3f40: Pull complete 68544e4d7ea6: Pull complete Digest: sha256:7c1f4355fa245e55cc15fa46ff3be8c347cee73c3eeb5c8b7a6def93013eb54dStatus: Downloaded newer image for erstt/redroid:12.0.0_houdini_WSAdocker.io/erstt/redroid:12.0.0_houdini_WSA

创建docker-compose

可以参考以下的文件,并自行修改
如果不明白以下选项的作用建议直接抄作业
反馈问题前,请使用该compose先进行验证

services:  redroid:    image: erstt/redroid:12.0.0_houdini_WSA    tty: true    stdin_open: true    privileged: true    devices:      - /dev/dri      - /dev/binder    networks:      - main    ports:      - 5555:5555    volumes:      - /root/erstt_redroid_12/data:/data    command:      - androidboot.redroid_gpu_mode=host      - androidboot.use_memfd=1      - ro.enable.native.bridge.exec64=1      - ro.dalvik.vm.native.bridge=libhoudini.sonetworks:  main:    driver: bridge    name: main

redroid_gpu_mode需要根据你机器上是否有支持GPU选择guest或host
ro.enable.native.bridge.exec64与ro.dalvik.vm.native.bridge需要根据兼容转换层调整
详细信息可以查看文档https://github.com/remote-android/redroid-doc

使用docker-compose创建容器后,就可以去连接容器了

安卓,启动!

接下来简单介绍如何访问这个安卓容器

远程连接

开启安卓容器后,我们可以使用远程工具连接
这里以scrcpy为例,连接IP 192.168.9.124
因为我的设备没有接入耳机,因此开启了no-audio
你需要根据你的实际情况,选择合适的工具与命令行参数
该远程工具文档及可执行文件可以在这里找到 https://github.com/Genymobile/scrcpy

scrcpy.exe --tcpip=192.168.9.124:5555  --no-audio  --max-size 1080 --video-bit-rate=2M

e408d79a051a088da7845a23290ae81b.jpg

连接完成后,就可以直接操作容器内的安卓系统

安装应用

安装应用可以使用adb,也可以直接将应用拖入画面中
c7945a8193ac346de47c39176c5abc25.jpg

稍等片刻即可安装完毕,如果安装失败也可以看看日志返回了什么

打打游戏

为了监视GPU性能,可以安装以下软件包
实际使用的时候并不需要这个软件包

apt update & apt install intel-gpu-tools -y

安装完软件后,可以使用命令查看GPU使用情况

intel_gpu_top

8e7a2af1856e0d639516acf8884ad9f4.jpg

如图所示,《崩坏3rd》正常运行

结束语

其实,最适合跑容器安卓的nas,是绿联arm架构的RK3588那款nas,可惜我没钱买
飞牛跑这东西,没有什么实际意义,但可以作为一种特别的玩法

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站由纳斯五零(NAS50.CN),版权所有,保留部分权利。豫ICP备2023035803号-1

Archiver|手机版|小黑屋|Discuz! X

GMT+8, 2025-10-24 04:32 , Processed in 0.100062 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表