b. 搭建anbox运行环境(x100笔记本和d2000pc机)

目的

anbox可以利用宿主机的硬件资源,对容器内的安卓系统图形进行硬件加速渲染并在宿主机上显示。用于测试验证anbox硬件加速渲染方案在x100笔记本和d2000pc机上是否可行以及其兼容性。

一、在飞腾笔记本(x100显卡)搭建anbox

拿到飞腾笔记本后,发现上面已经安装了binder和ashmem驱动,所以此步骤省略。如果没有安装,笔记本的内核是5.4版本,可参考下面链接进行安装。

https://github.com/anbox/anbox-moduleshttps://github.com/choff/anbox-modules

1、下载anbox宿主机源码

git clone https://github.com/anbox/anbox.git --recurse-submodules

2、安装编译依赖

sudo apt install build-essential cmake cmake-extras 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 libexpat1-dev libsystemd-dev libegl1-mesa-dev libgles2-mesa-dev libglm-dev libgtest-dev liblxc1 libproperties-cpp-dev \ libprotobuf-dev libsdl2-dev libsdl2-image-dev lxc-dev pkg-config protobuf-compiler python3-minimal

相关安装依赖报错解决办法,见下面的编译报错问题集。

3、编译

cd anbox mkdir build cd build/ cmake .. make -j8
3.1 编译报错问题集
  • 问题1

/home/phytium/ptg/anbox/src/anbox/cmds/launch.h:24:10: fatal error: systemd/sd-bus.h: 没有那个文件或目录
   24 | #include <systemd/sd-bus.h>

  • 解决办法

需要安装libsystemd-dev包,sudo apt install libsystemd-dev

下列软件包有未满足的依赖关系:
 libsystemd-dev : 依赖: libsystemd0 (= 245.4-4kylin3.11k14) 但是 245.4-4kylin3.11k30 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

phytium@phytium-d2000:~/ptg/download_debs$ apt search libsystemd0
正在排序... 完成
全文搜索... 完成  
libsystemd-dev/10.1 245.4-4kylin3.11k14 arm64
  systemd utility library - development files

libsystemd0/now 245.4-4kylin3.11k30 arm64 [已安装,本地]
  systemd utility library

麒麟系统的包管理存在缺陷,libsystemd0和libsystemd-dev包版本不一致(两者同属一个项目出来的包,理应一致的)导致安装依赖冲突,apt install方式安装不上。

这里采用dpkg -i 强制安装,apt download libsystemd-dev  && sudo dpkg -i libsystemd-dev_245.4-4kylin3.11k14_arm64.deb

  • 问题2

/home/phytium/ptg/anbox/src/anbox/ui/splash_screen.h:23:10: fatal error: SDL2/SDL.h: 没有那个文件或目录
   23 | #include <SDL2/SDL.h>

  • 解决办法

需要安装libsdl2-dev

phytium@phytium-d2000:~/ptg/download_debs$ sudo apt install libsdl2-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
您也许需要运行“apt --fix-broken install”来修正上面的错误。
下列软件包有未满足的依赖关系:
 libsdl2-dev : 依赖: libasound2-dev 但是它将不会被安装
               依赖: libglu1-mesa-dev 但是它将不会被安装
               依赖: libibus-1.0-dev 但是它将不会被安装
               依赖: libpulse-dev 但是它将不会被安装
               依赖: libsndio-dev 但是它将不会被安装
               依赖: libxss-dev 但是它将不会被安装
               依赖: libxt-dev 但是它将不会被安装
               依赖: libxv-dev 但是它将不会被安装
               依赖: libxxf86vm-dev 但是它将不会被安装
 libsystemd-dev : 依赖: libsystemd0 (= 245.4-4kylin3.11k14) 但是 245.4-4kylin3.11k30 正要被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)。
phytium@phytium-d2000:~/ptg/download_debs$ sudo apt install libpulse-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
您也许需要运行“apt --fix-broken install”来修正上面的错误。
下列软件包有未满足的依赖关系:
 libpulse-dev : 依赖: libpulse0 (= 1:13.99.1-1kylin32) 但是 1:13.99.1-1kylin90 正要被安装
                依赖: libpulse-mainloop-glib0 (= 1:13.99.1-1kylin32) 但是 1:13.99.1-1kylin90 正要被安装
 libsystemd-dev : 依赖: libsystemd0 (= 245.4-4kylin3.11k14) 但是 245.4-4kylin3.11k30 正要被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以指定一个解决办法)。
phytium@phytium-d2000:~/ptg/download_debs$ apt search libpulse0
正在排序... 完成
全文搜索... 完成  
libpulse0/now 1:13.99.1-1kylin90 arm64 [已安装,本地]
  PulseAudio client libraries

phytium@phytium-d2000:~/ptg/download_debs$ apt search libpulse-dev
正在排序... 完成
全文搜索... 完成  
libpulse-dev/10.1 1:13.99.1-1kylin32 arm64
  PulseAudio client development headers and libraries

麒麟系统的包管理存在缺陷,libpulse0和libpulse-dev包版本不一致(两者同属一个项目出来的包,理应一致的)导致安装libpulse-dev依赖冲突,

而libsdl2-dev又依赖了libpulse-dev等各个开发包,从而导致libsdl2-dev也apt install方式安装不上。

这里采用dpkg -i 强制安装,apt download libsdl2-dev  && sudo dpkg -i libsdl2-dev_2.0.10+dfsg1-3_arm64.deb

  • 问题3

/home/phytium/ptg/anbox/src/anbox/ui/splash_screen.cpp:23:10: fatal error: SDL2/SDL_image.h: 没有那个文件或目录
   23 | #include <SDL2/SDL_image.h>

  • 解决办法

需要安装libsdl2-image-dev,采取同上的方式进行安装,apt download libsdl2-image-dev  && sudo dpkg -i libsdl2-image-dev_2.0.5+dfsg1-2_arm64.deb

4、安装

5、配置容器启动服务,使用anbox运行自己编译好的Android镜像

(1)创建好挂载目录:

(2)将之前编译好的arm64版本的安卓系统镜像android.img 放在 /home/phytium/目录下。

(3)编写服务启动配置文件anbox-container-manager.service,文件内容如下:

(4)将service文件放置系统目录

(5)enable服务

(6)启动anbox容器

后面重启系统时会自动启动anbox容器

6、配置appmanager主界面启动快捷方式 appmgr.desktop

文件内容如下:

将文件放置系统applications目录

7、启动anbox应用管理界面

在启动栏点击Anbox Application Manager快捷图标,即可拉起anbox应用管理主界面。

image-20240219-093607.png

二、在d2000 PC机上搭建anbox

在d2000 PC上安装anbox的流程与笔记本上是类似的。

问题1、d2000 PC机上没有安装binder和ashmem驱动,由于内核是5.15版本的,anbox-modules没有做好此内核版本的适配。这里安装了一下xdroid,将xdroid的binder驱动软链接过来,暂时先绕过了binder驱动问题。

问题2、d2000 PC机上安装anbox后,启动会报错:phytium anbox[10940]: Failed to start container: Failed to start container: Failed to set config item lxc.group.devices.deny

这是由于lxc容器版本太高(5.0.0)导致,将lxc版本降到4.0.2后,重新编译安装anbox,容器启动失败问题解决。

d2000 PC上anbox启动后画面

image-20240219-093622.png

运行anbox内置应用‘Clock’时,amd显卡资源使用情况。

最终运行结果,在x100笔记本和d2000pc机上,anbox硬件加速渲染方案均跑通了,正常显示画面。