AIC 方案,指的是在宿主机系统中通过 docker 运行 Android 容器。 利用 docker 的特性,我们可以将宿主机的设备节点映射到 Android 容器中,使容器和宿主机共用一套 kernel,从而实现Android 容器通过直通的方式调用 RK 平台相关的硬件加速单元:GPU、VPU、NPU、RGA 等
2-1): 宿主机 SDK
宿主机系统必须能支持 Docker 运行。当前,RK 验证过的系统主要有 Debian 系统和 Android12 系统
宿主机系统建议使用 Debian 系统。RK 发布的 SDK 支持 Debian 的系统的主要有: Rockchip LinuxSDK、SmartHub SDK
Android 容器 SDK
当前 Android 容器只支持 Android9、 Android10 、Android11 、Android12、Android14 。其中,AIC-Patches 开发包中主要提供了 RK3588 Android10 和 Android12 的补丁、RK3568Android11 的补丁、RK3576 Android9 和 Android14的补丁。客户可以根据需要自己参考开发包中的补丁适配其他芯片和其他 Android 版本
宿主机环境配置
宿主机主要是修改 kernel 的配置,以支持 Docker 运行。根据选用的宿主机 SDK 和需要运行容器的Android 版本选择对应的宿主机补丁包
kernel 6.1 版本开始,RK 的 kernel 会有两个分支,一个是主分支,一个 Android 分支。默认 Linux 的SDK 使用的主分支,Android SDK 使用的 Android 的分支,因为 AIC 方案需要运行 Android 容器,所以需要使用 Android 分支。建议宿主机 Linux SDK 的kernel切换到对应的 Android 分支,否则Android 可能无法正常启动。Linux SDK 没有多分支,建议用 Android SDK kernel 直接进行替换
2-2):Docker 安装
更新支持 docker 的 boot.img 后,安装 docker:
sudo apt install -y docker.io
2-3): 网络环境配置
Docker 支持多种网络模式,本文主要介绍三种模式: bridge、host、macvlan。
bridge
dockerd 启动后会默认生成一个 docker0 的 bridge。当没有指定网络模式时会默认使用 docker0bridge,启动一个容器时就会分配一个 IP 给容器。采用该网络模式,可以通过端口映射的方式将容器的adb 端口暴露出来,方便对容器进行调试。
host
host 模式就是容器和宿主机共用宿主机的网络,容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。另外,容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用
macvlan
为了使每个容器能够获得与宿主机同网段的 IP,可以使用 macvlan 的网络模式,并给每个容器分配一个未使用的 IP 或者让 Android 容器通过 DHCP 自动获取一个 IP。
配置方法如下(如果使用 RK 提供的脚本运行 Demo,以下步骤都已集成在脚本中了):
物理机网卡设置混杂模式
ip link set eth1 promisc on #注意:此处eth1为我的物理机下的网卡名称,您的网卡名称需要具体查询一下,命令:ip addr
创建 macvlan 网络
docker network create -d macvlan --subnet=172.16.21.0/24 --ip-range=172.16.21.0/24 -o macvlan_mode=bridge -o parent=eth1 macvlan
创建成功后,可以通过 "docker network ls " 命令查询
root@linaro-alip:/home/test# docker network lsNETWORK ID NAME DRIVER SCOPE3bdc2c705755 bridge bridge local347f10ae2880 host host local9b7e5d17ce82 macvlan macvlan local //创建的macvlanaffe667d6ac7 my-net bridge local0406a312bcf8 none null local