0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Robox安卓容器的构建编译过程和使用方法

安芯教育科技 来源:极术社区 作者:Martin_Mar 2022-06-23 15:51 次阅读

随着云计算相关产业蓬勃发展,用户对移动设备的弹性需求推动出云手机、云游戏等概念,云手机和云游戏就是将云计算技术运用于网络终端服务,通过云服务器实现云服务的手机,支持弹性适配用户个性化需求,释放手机本身硬件资源。

安卓系统在Arm平台上有着广泛部署的历史,Arm同时提供了高性能的云计算平台,既完全兼容安卓生态,无指令翻译环节,海量应用无需迁移,又支持虚拟化和容器技术,CPU、内存、存储和网络等资源可按需弹性分配,可以完美地为终端用户提供安卓云服务。终端用户可以通过手机、电脑等设备远程访问Arm服务器上的安卓实例,并运行标准的安卓应用程序和游戏。

本文主要介绍在Arm服务器上,Robox安卓容器方案的构建编译过程和使用方法。

Robox简介


Robox容器方案是基于Docker容器使能安卓系统的虚拟化方案。容器的实现是基于一个anbox的基本框架,基本架构如下图所示。

36121078-f203-11ec-ba43-dac502259ad0.png

环境要求


服务器:Arm服务器1台
显卡:AMD Radeon Pro WX 7100 或 Nvidia Tesla T4

配置编译环境


系统要求

OS: Ubuntu 20.04.2
Kernel: 5.4.0

安装依赖库和基础组件

1. 基础依赖库


	

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 libsystemd-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 libboost-filesystem1.62.0 libboost-system1.62.0 docker.io dkms libboost-iostreams1.62.0 apt install build-essential apt install mesa-common-dev

2. 下载依赖库并安装

  • 下载: libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb:https://launchpad.net/ubuntu/zesty/arm64/libprocess-cpp3/3.0.1-0ubuntu5 libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb:https://launchpad.net/ubuntu/zesty/arm64/libdbus-cpp5/5.0.0+16.10.20160809-0ubuntu2 libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb:https://launchpad.net/ubuntu/bionic/arm64/libdbus-cpp-dev/5.0.0+16.10.20160809-0ubuntu2

  • 安装


	dpkg -i libprocess-cpp3_3.0.1-0ubuntu5_arm64.deb dpkg -i libdbus-cpp5_5.0.0+16.10.20160809-0ubuntu2_arm64.deb dpkg -i libdbus-cpp-dev_5.0.0+16.10.20160809-0ubuntu2_arm64.deb

3. 更换docker storage driver

  • 登录到服务器,查看docker信息 3623a964-f203-11ec-ba43-dac502259ad0.png
  • 修改storage driver的版本 如果“storage driver”的版本为“overlay”或者“overlay2”,则不需要进行调整;如果“storage driver”的版本为“aufs”,则需要把“storage driver”从“aufs”修改为“overlay”,步骤如下:
    • 打开“/etc/default/docker”文件
      
      					vim /etc/default/docker
    • 添加如下脚本
      
      					DOCKER_OPTS= -s overlay
    • 重启docker让修改生效
      
      					/etc/init.d/docker restart
    • 查看docker的storage driver版本 36314402-f203-11ec-ba43-dac502259ad0.png

安装远程桌面

  • 安装xfce4

    apt install xfce4  xfce4-* xrdp
  • 打开.xsession文件夹

    cd /home/ubuntu
    vi .xsession

    注意 “/home/ubuntu”为用户文件夹。

  • 在.xsession中添加如下内容

    xfce4-session
  • 重启xrdp远程桌面

    /etc/init.d/xrdp restart
此后,可以通过远程桌面访问服务器图形桌面,使用root帐号登录。

Robox 安装和配置


1. 下载Robox源码并解压到/home/目录下

https://github.com/kunpengcompute/robox/tree/master2. binder.ko和ashmem.ko模块编译安装
  • 下载内核源码,供内核模块编译

    apt search linux-source
    apt install linux-source-5.4.0
  • 拷贝ashmem和binder源码

    cd /home/robox-master/kernel/robox-modules
    cp anbox.conf /etc/modules-load.d/
    cp 99-anbox.rules /lib/udev/rules.d/
    cp -rT ashmem /usr/src/anbox-ashmem-1
    cp -rT binder /usr/src/anbox-binder-1
  • 使用dkms进行编译和安装

    dkms install anbox-ashmem/1
    dkms install anbox-binder/1
  • 将ko模块安装到内核,binder_linux模块需要带参数

    modprobe ashmem_linux
    modprobe binder_linux num_devices=254
    lsmod | grep -e ashmem_linux -e binder_linux
    chmod 777 /dev/ashmem /dev/binder*

    注意:每次服务器重启后,需要将binder_linux模块移除之后,再重新安装。

  • 若ashmem和binder的属性权限不是下列命令显示的,需要使用chmod添加权限

    ls -alh /dev/binder* /dev/ashmem
    crwxrwxrwx 1 root root  10, 55 Oct 22 10:47 /dev/ashmem
    crwxrwxrwx 1 root root 511,  0 Oct 22 10:47 /dev/binder0
    crwxrwxrwx 1 root root 511,  0 Oct 22 10:47 /dev/binder1
    ...

3. 注册安卓镜像并存储在docker中

  • 下载安卓镜像包:android.imghttps://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/native/android.img

  • 将android镜像挂载到“/mnt”目录

    cd /home
    mount /home/android.img /mnt
  • 进入/mnt目录,注册镜像

    cd /mnt
    tar --numeric-owner -cf- . | docker import - android:robox_with_exagear
  • 查看系统容器
    回显信息如下,则确认android容器存在

    36413d58-f203-11ec-ba43-dac502259ad0.png

4. 编译Robox源码

  • 创建编译目录

    cd /home/robox-master
    mkdir build
    cd build
  • 配置编译,在“/home/robox-master/build”目录执行命令

    cmake ..
  • 在“/usr/include/glm/gtx/transform.hpp”文件中在第21行添加以下内容

    364f7c2e-f203-11ec-ba43-dac502259ad0.png

  • 编译安装

    make -j
    make install

5. 使能显卡

AMD显卡

  • 安装xfce4桌面和相关工具

    apt install -y xfce4  mesa-utils x11vnc vainf
  • 修改/etc/X11/xorg.conf配置文件
    在xorg.conf文件中添加如下内容,其中BusID项需要根据服务器中显卡pci号修改(BusID都是用英文冒号(:)分隔)

    ection "ServerFlags"         
               Option "DontVTSwitch" "on"         
               Option "AutoAddDevices" "off"         
               Option "AutoEnableDevices" "off"         
               Option "AutoAddGPU" "off"         
               Option "AutoBindGPU" "off" 
    EndSection 
    Section "Device"         
               Identifier "AMD"         
               Driver "amdgpu"         
               BusID "pci00:00" 
    EndSection 
    Section "Monitor"         
               Identifier "monitor0"         
               Modeline "1280x720"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync         
               Option "enable" "true" 
    EndSection 
    Section "Screen"         
               Identifier "screen0"         
               Device "AMD"         
               Monitor "monitor0"         
               DefaultDepth 24         
               SubSection "Display"                 
                            Depth 24                 
                            Modes "1280x720"         
               EndSubSection 
    EndSection
  • 查询显卡的pci号

    #lspci |grep AMD
    05:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon Pro WX 7100]
    05:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590]

    注意:

    • lspci看到的busid是十六进制的,而配置文件中的BusID里面的值是十进制的,所以需要做下转换,例如上面查询到的结果是81:00.0,而配置文件里面应该填入的是pci00:00。
    • 配置文件中的BusID格式是pcixx:xx,都是用“:”分隔的,而lspci看到的busid的信息是xx:xx.x,请勿直接拷贝lspci查到的busid去覆盖配置文件中的BusID。
    • Modeline "1280x720" 字段需要大于等于安卓系统的分辨率。

  • 编译安装mesa-19.0.8版本。重装mesa方法如下
    下载mesa代码, 进入mesa代码目录,切换到19.0.8分支。
    
    			cd /home/ git clone https://anongit.freedesktop.org/git/mesa/mesa.git cd /home/mesa git checkout mesa-19.0.8下载编译依赖包
    
    			apt build-dep mesa apt install libomxil-bellagio-dev libva-dev llvm-7 llvm-7-dev python-mako执行autogen.sh生成Makefile
    
    			./autogen.sh --enable-texture-float --with-gallium-drivers=radeonsi,swrast --with-dri-drivers=radeon,swrast --with-platforms=drm,x11 --enable-glx-tls --enable-shared-glapi --enable-dri3 --enable-lmsensors --enable-gbm --enable-xa --enable-osmesa --enable-vdpau --enable-nine --enable-omx-bellagio --enable-va --with-llvm-prefix=/usr/lib/llvm-7 --enable-llvm --target=aarch64-linux-gnu CFLAGS="-fsigned-char -O2" CPPFLAGS="-fsigned-char -O2" CXXFLAGS="-fsigned-char -O2" --enable-autotools
  • 编译并安装
    
    			make -j make install
  • 修改ldconfig更改库链接顺序,打开/etc/ld.so.conf文件, 添加/usr/local/lib到文件首内容,修改后内容如下
    
    			cat /etc/ld.so.conf /usr/local/lib include /etc/ld.so.conf.d/*.conf
  • 执行如下命令使能
    
    			ldconfig
  • 测试Xorg是否可以正常启动
    
    			Xorg :0 -config /etc/X11/xorg.conf

NVIDIA显卡

  • 安装显卡驱动

    wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda_11.6.2_510.47.03_linux_sbsa.run
    sudo sh cuda_11.6.2_510.47.03_linux_sbsa.run
  • 运行如下命令创建Xconfig文件

    sudo nvidia-xconfig
    Xorg :0 -config /etc/X11/xorg.conf

启动Robox安卓实例


  • 将robox-master源码里中binaryFiles目录下的启动脚本robox拷贝到/home/robox-master下
    
    			cp /home/robox-master/binaryFiles/ /home/robox-master注意:robox脚本里的docker run命令中的镜像名称需要改成本地自己注册的名称
  • 设置环境变量,将容器指定到GPU卡上运行
    
    			export DISPLAY=:0注意:
    • robox脚本中设置的DISPLAY号要与此处设置的DISPLAY号一致。
    • 启动Robox之前,先查看环境变量XDG_RUNTIME_DIR是否存在,若不存在,可以在robox可执行脚本开始位置中增加export XDG_RUNTIME_DIR=/run/user/0,同时要确保“/run/user/0”目录存在。
    • 启动Robox容器时,必须按照顺序来启动,即要先启动instance1,然后才能启动instance2、instance3、……,不能跳着启动,否则不能使用宿主机IP地址连接Robox容器。

  • 启动Robox容器实例,后面的数字代表启动的实例编号,可以同时启动多个实例
    
    			./robox -v start 1
  • 查看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,标识安卓启动完毕

远程访问安卓实例


使用scrcpy远程访问安卓实例。Scrcpy是一款开源免费的安卓投屏控制软件,支持在PC、Mac、linux上运行。可参考下面链接安装: https://github.com/Genymobile/scrcpy/blob/master/README.zh-Hans.md使用方法:
  • adb连接到安卓实例

    adb connect serverip:android_instance_port
  • 使用scrcpy远程访问安卓实例

    scrcpy -s serverip:android_instance_port

总结


基于以上步骤可以在Arm服务器上快速构建安卓云服务,终端用户可以在手机、电脑等设备上远程访问服务器上的安卓实例,并按需求安装、运行标准的安卓应用程序和游戏,运行效果如下图。366e13d2-f203-11ec-ba43-dac502259ad0.png

原文标题:技术分享 | 基于Arm服务器的安卓云容器方案构建方法

文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361776
  • 服务器
    +关注

    关注

    12

    文章

    8116

    浏览量

    82500
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
  • 安卓
    +关注

    关注

    5

    文章

    2081

    浏览量

    54484

原文标题:技术分享 | 基于Arm服务器的安卓云容器方案构建方法

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    鸿蒙开发【编译构建】讲解

    编译构建是将应用/服务的源代码、资源、第三方库等,通过编译工具转换为可直接在硬件设备上运行的二进制机器码,然后再将二进制机器码封装为HAP/APP软件包,并为HAP/APP包进行签名的过程
    发表于 02-27 17:41

    OpenHarmony 移植:build lite 编译构建过程

    的?解决了这些疑惑,会对 build lite 编译构建过程有个更深入的理解。 1、产品解决方案代码是如何被调用编译的 在文件 buildliteBUILD.gn 配置文件中的
    的头像 发表于 02-19 16:19 553次阅读

    容器的作用及原理 电容器使用方法

    容器,又称电容,是一种用于存储电能的装置。它由两个导体电极和介质组成,能够在这两个电极上存储和释放电荷。电容器的作用和原理,以及其使用方法都是电学中基础的概念。下面将详细介绍电容器
    的头像 发表于 01-18 13:47 1483次阅读

    make、make all和make clean的使用方法

    刚接触Linux,认为直接make后就完成了编译,没想到编译出的结果存在很大问题,原来是make、make all和make clean的使用方法不对。
    的头像 发表于 01-05 12:32 479次阅读

    docker exec命令的使用方法

    有用的命令,用于在正在运行的容器中执行命令。 在本文中,我将详细介绍Docker exec命令的使用方法,包括命令格式、参数选项、使用示例等。 Docker exec命令格式 Docker exec命令
    的头像 发表于 11-23 09:33 742次阅读

    C程序的完整编译过程

    本文讨论了C程序的完整编译过程,分别讲述了预处理、编译、汇编、链接各阶段完成的编译任务。然后通过一个编译实例,探讨了各阶段输出的文件。
    的头像 发表于 11-15 17:14 517次阅读
    C程序的完整<b class='flag-5'>编译</b><b class='flag-5'>过程</b>

    DevEco Hvigor高效编译构建过程新秘籍

    包括任务执行的耗时与线程、ArkTS编译中的各环节的细分耗时情况等。开发者可以藉此分析构建过程中的耗时情况、进而改善构建效率。 在DevEco Studio中开启DevEco Hvig
    发表于 10-17 16:54

    【技术视界】DevEco Hvigor高效编译构建过程新秘籍

    的是华为终端BG编译构建技术专家的分享,希望能为您的开发之路带来启发~ 作者:Lewei,华为终端BG编译构建技术专家 DevEcoHvigor是使用TypeScript语言开发的全新
    的头像 发表于 09-26 12:10 641次阅读
    【技术视界】DevEco Hvigor高效<b class='flag-5'>编译</b>,<b class='flag-5'>构建</b><b class='flag-5'>过程</b>新秘籍

    C语言的编译链接过程

      C语言的编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的
    的头像 发表于 08-21 10:06 1614次阅读
    C语言的<b class='flag-5'>编译</b>链接<b class='flag-5'>过程</b>

    Linux内核的编译主要过程

    Linux内核的编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 507次阅读
    Linux内核的<b class='flag-5'>编译</b>主要<b class='flag-5'>过程</b>

    【芒果派MangoPi MQ Quad】10系统体验

    上会已经说过了linux系统镜像的安装 这次来说说系统。 首先准备工具 芒果派MangoPi MQ Quad开发板 PC机 TF卡及读卡器 操作系统镜像https
    发表于 07-07 21:59

    C语言的编译过程

    C语言的编译链接过程要把我们编写的一个C程序源代码,转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。过程图解如下。
    发表于 06-25 10:36 285次阅读
    C语言的<b class='flag-5'>编译</b><b class='flag-5'>过程</b>

    四路无线图传平板控制方案

    深圳市沃丰智能通讯有限公司
    发布于 :2023年06月02日 15:16:50

    Vivado增量编译的基本概念、优点、使用方法以及注意事项

    随着FPGA设计的复杂度不断提高,设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中,Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。
    的头像 发表于 05-25 18:25 3304次阅读
    Vivado增量<b class='flag-5'>编译</b>的基本概念、优点、<b class='flag-5'>使用方法</b>以及注意事项

    安全光栅,光幕的使用方法

    安全光栅的使用方法
    的头像 发表于 05-16 09:51 669次阅读
    安全光栅,光幕的<b class='flag-5'>使用方法</b>