环境
操作系统:Ubuntu Kylin 优麒麟 20.04 LTS
适用架构:ARM64(鲲鹏 920)
操作系统iso下载链接:https://mirrors.cloud.tencent.com/ubuntu-cdimage/ubuntukylin/focal/daily-live/current/
本文尚未完成。还有需要华为工程师确认的地方。
介绍
本文档针对robox安卓容器环境的构建编译和使用进行说明。介绍环境配置、代码的下载构建编译以及如何使用。
本文档主要适用于robox容器安卓仿真构建编译的使用者。
容器的实现是基于一个anbox的基本框架,在容器启动前需要在主机上启动session-manager来启动X,input,adb等相关的服务,然后启动容器。基本架构如图1所示。
图1 容器的基本架构
系统配置
前提条件
已安装Ubuntu 20.04 操作系统。网络连接正常,且能够与外网互通。已配置下载源。如果未配置,请按如下方式配置。
- 去掉/etc/apt/source.list中的deb-src的注释。
sed -i "s/# deb-src/ deb-src/g" /etc/apt/sources.list apt update
- 安装系统基础依赖库。
须知:
如果安装过程中有获取deb包失败的情况,请根据提示中的网址,手动下载安装,然后重新安装没成功的包。
sudo apt install dpkg libncurses5-dev libncursesw5-dev libssl-dev cmake cmake-data debhelper dbus google-mock libboost-dev libboost-filesystem-dev libboost-log-dev libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-test-dev libboost-thread-dev libcap-dev libdbus-1-dev libegl1-mesa-dev libgles2-mesa-dev libglib2.0-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev libprotobuf-dev libsdl2-dev libsdl2-image-dev lxc-dev pkg-config protobuf-compiler docker.io dkms build-essential mesa-common-dev
sudo apt install libprocess-cpp3 libdbus-cpp5 libdbus-cpp-dev
sudo apt install libboost-filesystem1.67.0 libboost-system1.67.0 libboost-iostreams1.67.0
您可以自行手动编译构建安卓镜像,可以参考《 安卓镜像编译构建指南(基于x86环境)》。
本节提供仅供测试使用的安卓镜像包,获取链接:android_920.img
更换 docker storage driver
打开新的窗口执行以下操作。
查看 docker 的信息。
sudo docker info
如果“storage driver”的版本为“overlay”,则不需要进行调整。
修改storage driver的版本。
如果“storage driver”的版本为“aufs”,则需要把“storage driver”从“aufs”换成“overlay”。
打开“/etc/default/docker”文件。
vim /etc/default/docker。
添加如下脚本。
DOCKER_OPTS= -s overlay
重启docker或reboot后生效。
/etc/init.d/docker restart
通过android.img打包并存储在docker中
使用《 安卓镜像编译构建指南(基于x86环境)》编译好的android镜像,或者使用本文提供的打包好的安卓镜像(该安卓镜像的名称可能带有时间戳等信息)实际操作过程中,请以实际名称为准。本文档中以不带时间戳的名称为例进行操作。android.img文件导入,假设安卓镜像已经上传到华为鲲鹏920处理器所在服务器的“/home”目录下。
- 通过SSH方式登录到服务器,进入命令行执行入口。
- 将android镜像挂载到“/mnt”目录。
cd /home
mount /home/android.img /mnt
说明:由于android.img是通过x86环境编译完成的,所以服务器重启后请重新挂载到“/mnt”目录。
- 进入“/mnt”目录。
cd /mnt
- 打包。
sudo tar --numeric-owner -cf- . | sudo docker import - android:robox_with_exagear
- 查看系统容器。
docker images
回显信息如下,则确认android容器存在。
REPOSITORY TAG IMAGE ID CREATED SIZE android robox_with_exagear xxxxxxxx x seconds ago xxxMB
在华为鲲鹏920处理器所在服务器上编译robox源码
- 确保回退到如下commit。
cd /home
git clone https://github.com/lag-linaro/robox.git -b release-phase2.3
如果速度太慢,可以从GitEE的镜像下载。cd robox
git reset --hard 72216399ea8ae588fe9b5cbbc511f9f32f552691
- 下载后robox目录为“/home/robox”。 注意:
如果源码下载失败,系统提示需要验证,您可以通过执行以下命令跳过验证:
export GIT_SSL_NO_VERIFY=1
- 编译安装robox。
cd /home/robox
mkdir build
cd /home/robox/build
- 配置编译,在“/home/robox/build”目录执行命令。
cmake ..
- 在“/usr/include/glm/gtx/transform.hpp”文件中添加以下内容。
sudo nano /usr/include/glm/gtx/transform.hpp
在第21行处添加如下定义
#define GLM_ENABLE_EXPERIMENTAL
修改完成后如下图:
- 编译安装。
make -j8 //编译
make install //安装
启动robox安卓系统
- 修改“/home/robox/”目录下的robox启动脚本。
cp 0003_robox_sh.diff /home/robox/
cd /home/robox
patch -p1 < 0003_robox_sh.diff
- 华为鲲鹏920处理器所在服务器上,执行修改后的robox脚本,启动robox安卓容器。
cd /home/robox
export DISPLAY=:1
注意:- robox脚本中设置的DISPLAY号要一致。
- 启动robox之前,先查看环境变量XDG_RUNTIME_DIR是否存在,若不存在,需要显示的export改环境变量,可以再robox可执行脚本开始位置中增加 export XDG_RUNTIME_DIR=/run/user/0,同时要确保/run/user/0目录存在。
- 启动robox容器时,必须按照顺序来启动,即要先启动instance1、然后才能启动instance2、然后instance3、……,不能跳着启动,否则不能使用宿主机IP连接robox容器。
./robox -v start 1 //启动第一个容器
./robox -v start 2 //启动第二个容器
- 查看docker实例进程。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b77d371b402c android:robox_with_exagear "/anbox-init.sh" 13 seconds ago Up 11 seconds 0.0.0.0:5561->5555/tcp instance2 77b2c041315f android:robox_with_exagear "/anbox-init.sh" 2 hours ago Up 2 hours 0.0.0.0:5559->5555/tcp instance1
-
- 查看主机session进程,主要查看instance1 instance2对应的两个session是否正常运行。
ps -aux | grep session
root 4330 0.0 0.0 9332 6160 ? Ss Oct22 0:01 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile -- systemd-activation --syslog-only root 172678 22.1 0.0 6433328 250472 pts/8 Sl 19:51 25:38 anbox session-manager --run-multiple=instance1 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280 root 215155 1.4 0.0 5196228 185688 pts/8 Sl 21:46 0:01 anbox session-manager --run-multiple=instance2 --standalone -- experimental --single-window --gles-driver=translator --window-size=720,1280
-
- 确认robox实例是否启动成功。
docker exec -it instance1 sh //登录到安卓容器内
77b2c041315f:/ # getprop | grep sys.boot.completed [sys.boot_completed]: [1] //sys.boot.completed显示为1,标识安卓启动完毕
-
- 在Windows系统中连接安卓容器。
以下的步骤以软件ARDC为例,使用其他安卓远程连接软件也可以。
- 在Windows系统中在cmd窗口中执行\ARDC\utils\目录下的adb.exe程序 。
C:\\ARDC\utils> adb connect YOUR_IP:5561
connected to YOUR_IP:5561
- Windows上需要连接的IP地址和端口是华为鲲鹏920处理器所在服务器上的IP地址和容器端口,如下面的5561端口。
在华为鲲鹏920处理器所在服务器上执行#docker ps获取实例的adb端口信息。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b77d371b402c android:robox_with_exagear "/anbox-init.sh" 13 seconds ago Up 11 seconds 0.0.0.0:5561->5555/tcp instance2
- 在Windows系统中在cmd窗口中执行\ARDC\utils\目录下的adb.exe程序 。
-
- 在Windows上运行ARDC目录下的ARDC.exe程序,选择“View > Mode”菜单,并选择“Screenshot”模式。在“Devices”菜单下选择adb已经连接的设备。
注意:
“Key”菜单下“Shutdown”、“Reboot”、“Home”按键不要去使用,存在问题。
关闭启动的robox容器实例方法如下:
cd /home/robox
./robox -v stop 1 //关闭第一个容器
./robox -v stop 2 //关闭第二个容器
参考文献
《 robox安卓容器 移植指南(鲲鹏920)》https://support.huaweicloud.com/prtg-robox-kunpengcps/kunpengrobox920_02_0001.html
来源:oschina
链接:https://my.oschina.net/chipo/blog/4322186