一、通过docker搭建 cuttlefish 虚拟设备
1.1 构建 cuttlefish 基础镜像,Dockerfile 文件内容如下:
1. 构造传入了 apt 代理 以及 http 代理,构造时,可以传入此变量避免网速访问失败导致问题
2. 使用 /home/cuttlefish 作为工作目录
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
ARG APT_HTTP_PROXY
ARG APT_HTTPS_PROXY
RUN printf 'Acquire::http::Proxy "%s";\n' "${APT_HTTP_PROXY}" \
> /etc/apt/apt.conf.d/99proxy && \
printf 'Acquire::https::Proxy "%s";\n' "${APT_HTTPS_PROXY}" \
>> /etc/apt/apt.conf.d/99proxy
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY
ARG http_proxy
ARG https_proxy
ARG no_proxy
RUN apt-get update && \
apt-get install -y \
ca-certificates \
curl \
gnupg \
sudo \
iproute2 \
iptables \
iputils-ping \
net-tools \
procps \
adb \
jq \
unzip \
rsync \
socat \
openssh-client \
kmod \
acl \
&& rm -rf /var/lib/apt/lists/*
# ------------------------------------------------------------
# Google Cuttlefish Artifact Registry
# ------------------------------------------------------------
RUN curl -v \
--proxy "${HTTPS_PROXY}" \
--connect-timeout 10 \
--max-time 60 \
-fsSL \
https://us-apt.pkg.dev/doc/repo-signing-key.gpg \
-o /etc/apt/trusted.gpg.d/artifact-registry.asc \
&& chmod a+r /etc/apt/trusted.gpg.d/artifact-registry.asc \
&& echo \
"deb https://us-apt.pkg.dev/projects/android-cuttlefish-artifacts android-cuttlefish main" \
> /etc/apt/sources.list.d/android-cuttlefish-artifacts.list
RUN apt-get update && \
apt-get install -y \
cuttlefish-base \
cuttlefish-user \
&& rm -rf /var/lib/apt/lists/*
# Cuttlefish 常用目录
RUN mkdir -p \
/aosp-out \
/cvd-state \
/home/cuttlefish
COPY entrypoint.sh /usr/local/bin/cuttlefish-entrypoint
RUN chmod +x /usr/local/bin/cuttlefish-entrypoint
ENV HOME=/home/cuttlefish
WORKDIR /home/cuttlefish
ENTRYPOINT ["/usr/local/bin/cuttlefish-entrypoint"]
CMD ["sleep", "infinity"]配置完成后,即可通过命令 docker compose build cuttlefish-common 开始构造,也可代代理参数构造,命令如下:
docker build \
-t local/cuttlefish-host:ubuntu24.04 \
--build-arg HTTP_PROXY=http://10.44.0.10:18080 \
--build-arg HTTPS_PROXY=http://10.44.0.10:18080 \
--build-arg NO_PROXY=localhost,127.0.0.1,.local \
--build-arg APT_HTTP_PROXY=http://10.44.0.10:18080 \
--build-arg APT_HTTPS_PROXY=http://10.44.0.10:18080 \
.1.2 配置docker_compose.yml 文件并启动容器
docker-compose.yml的内容如下
需要注意的是,/data/aosp/out 为主机上的 aosp 编译生成产物,如果不是此路径,可按需修改成宿主机上的 aosp 编译生成产物的路径
services:
cuttlefish-common:
build:
context: .
dockerfile: Dockerfile
# 构建时传入代理(仅 build 阶段使用,不会进入最终容器)
args:
HTTP_PROXY: ${http_proxy:-}
HTTPS_PROXY: ${https_proxy:-}
NO_PROXY: ${NO_PROXY:-localhost,127.0.0.1,.local}
image: local/cuttlefish-host:ubuntu24.04
container_name: cuttlefish-common
hostname: cuttlefish-common
privileged: true
ulimits:
nofile:
soft: 1048576
hard: 1048576
devices:
- /dev/kvm:/dev/kvm
- /dev/net/tun:/dev/net/tun
- /dev/vhost-net:/dev/vhost-net
- /dev/vhost-vsock:/dev/vhost-vsock
volumes:
# AOSP 编译产物
- /data/aosp/out:/aosp-out
# user01 独立 HOME / Cuttlefish 状态
- /data/cuttlefish/common/home:/home/cuttlefish
# 独立 runtime
- /data/cuttlefish/common/state:/cvd-state
ports:
# WebRTC
- "8443:8443"
# ADB
- "6520:6520"
# WebRTC media
- "15550-15599:15550-15599/udp"
environment:
HOME: /home/cuttlefish
CUTTLEFISH_INSTANCE: "1"
shm_size: "2gb"
restart: unless-stopped配置完毕后,执行 docker compose up -d 启动容器
二、测试
测试流程如下:
# 1. 首先进入容器中
sudo docker compose exec cuttlefish-common bash
# 2. 配置全局环境变量,按需修改
export CVD_HOST_DIR=/aosp-out/host/linux-x86/cvd-host_package
export PATH=$CVD_HOST_DIR/bin:$PATH
export ANDROID_PRODUCT_OUT=/aosp-out/target/product/vsoc_x86_64_only
# 3. 建立软连接
ln -s /aosp-out/host/linux-x86/cvd-host_package/etc /home/cuttlefish/etc
ln -s /aosp-out/host/linux-x86/cvd-host_package/usr /home/cuttlefish/usr
# 4. 指定 aosp 编译目标程序后,启动项目
launch_cvd --system_image_dir=/aosp-out/target/product/vsoc_x86_64_only
# 5. 启动成功后,即可连接主机进行相关测试
adb connect 127.0.0.1:6520三、调试时,常用命令
待完善
四、带完善内容
为了方便测试,本容器给出的权限还是太多了,后期完善 docker compose 文件