搭建安卓容器 RoBox(鲲鹏920)

非 Y 不嫁゛ 提交于 2020-10-10 02:20:40

环境

操作系统: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 操作系统。网络连接正常,且能够与外网互通。已配置下载源。如果未配置,请按如下方式配置。

  1. 去掉/etc/apt/source.list中的deb-src的注释。

    sed -i "s/# deb-src/ deb-src/g" /etc/apt/sources.list apt update

  2. 安装系统基础依赖库。
    须知:

    如果安装过程中有获取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”目录下。

  1. 通过SSH方式登录到服务器,进入命令行执行入口。
  2. 将android镜像挂载到“/mnt”目录。

    cd /home

    mount /home/android.img /mnt

    说明:

    由于android.img是通过x86环境编译完成的,所以服务器重启后请重新挂载到“/mnt”目录。

  3. 进入“/mnt”目录。

    cd /mnt

  4. 打包。

    sudo tar --numeric-owner -cf- . | sudo docker import - android:robox_with_exagear

  5. 查看系统容器。

    docker images

    回显信息如下,则确认android容器存在。

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    android             robox_with_exagear    xxxxxxxx        x seconds ago         xxxMB

 

在华为鲲鹏920处理器所在服务器上编译robox源码

  1. 确保回退到如下commit。

     

    cd /home

    git clone https://github.com/lag-linaro/robox.git -b release-phase2.3
    如果速度太慢,可以从GitEE的镜像下载。

    cd robox

    git reset --hard 72216399ea8ae588fe9b5cbbc511f9f32f552691

     

  2. 下载后robox目录为“/home/robox”

     

    注意:

    如果源码下载失败,系统提示需要验证,您可以通过执行以下命令跳过验证:

    export GIT_SSL_NO_VERIFY=1

     

  3. 编译安装robox。

     

    cd /home/robox

    mkdir build

    cd /home/robox/build

     

  4. 配置编译,在“/home/robox/build”目录执行命令。

     

    cmake ..

     

  5. “/usr/include/glm/gtx/transform.hpp”文件中添加以下内容。

     

    sudo nano /usr/include/glm/gtx/transform.hpp

    在第21行处添加如下定义

    #define GLM_ENABLE_EXPERIMENTAL
     

    修改完成后如下图:

     

  6. 编译安装。

     

    make -j8 //编译

    make install //安装

 

启动robox安卓系统

  1. 修改“/home/robox/”目录下的robox启动脚本

     

    cp 0003_robox_sh.diff /home/robox/

    cd /home/robox

    patch -p1 < 0003_robox_sh.diff

     

  2. 华为鲲鹏920处理器所在服务器上,执行修改后的robox脚本,启动robox安卓容器

    cd /home/robox

    export DISPLAY=:1

    注意:
    1. robox脚本中设置的DISPLAY号要一致。
    2. 启动robox之前,先查看环境变量XDG_RUNTIME_DIR是否存在,若不存在,需要显示的export改环境变量,可以再robox可执行脚本开始位置中增加 export XDG_RUNTIME_DIR=/run/user/0,同时要确保/run/user/0目录存在。
    3. 启动robox容器时,必须按照顺序来启动,即要先启动instance1、然后才能启动instance2、然后instance3、……,不能跳着启动,否则不能使用宿主机IP连接robox容器。

    ./robox -v start 1 //启动第一个容器

    ./robox -v start 2 //启动第二个容器

     

  3. 查看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为例,使用其他安卓远程连接软件也可以。
    1. 在Windows系统中在cmd窗口中执行\ARDC\utils\目录下的adb.exe程序

      C:\\ARDC\utils> adb connect YOUR_IP:5561

      connected to YOUR_IP:5561

    2. 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上运行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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!