deepin 20.2 编译 安装 anbox

目录

  • deepin 20.2 编译 安装 anbox
  • 最低折腾时间: 2 hour
  • 预览:
  • 一、apt 安装失败原因
  • 1. 内核不支持
  • 2. dkms驱动无法安装
  • 二、重新编译安装内核
  • 1. 查看内核版本
  • 2. 安装依赖
  • 3. 下载内核源码[URL]
  • 4. 重要! 复制当前内核 config 配置
  • 5. 配置内核参数
  • 6. 编译内核
  • 7. 安装
  • 8. 重启确认
  • 9. binder 不存在
  • 10. modprobe 错误
  • 三、源码安装 anbox
  • 0. 卸载 apt 安装的 anbox
  • 1. 安装依赖
  • 2. 编译准备
  • 3. cmake 准备
  • 4. make
  • 5. make install
  • 6. 测试
  • 7. 检测 anbox 需求
  • 四、运行 anbox
  • 0. 准备 Android 镜像
  • 1. 命令行运行测试
  • 五、写入 systemctl 服务
  • 1. 写入 service
  • 2. 建立启动链接
  • 3. reload daemon
  • 4. 启动
  • 5. [选择性]开机启动
  • 6. 启动 anbox
  • 小结

最低折腾时间: 2 hour

预览:

anbox 安装 libhoudini anbox-modules-dkms_android

anbox 安装 libhoudini anbox-modules-dkms_anbox 安装 libhoudini_02

anbox 安装 libhoudini anbox-modules-dkms_anbox 安装 libhoudini_03

一、apt 安装失败原因

1. 内核不支持

$ ls -1 /dev/{ashmem,binder}
#显示结果为空
$ sudo modprobe ashmem_linux                             
# Output:
modprobe: FATAL: Module ashmem_linux not found in directory /lib/modules/5.12.0-amd64-desktop-android

$ sudo modprobe binder_linux    
# Output:
modprobe: FATAL: Module binder_linux not found in directory /lib/modules/5.12.0-amd64-desktop-android

2. dkms驱动无法安装

sudo apt install anbox-modules-dkms
# Output:
dpkg: 处理软件包 anbox-modules-dkms (--configure)时出错:
 已安装 anbox-modules-dkms 软件包 post-installation 脚本 子进程返回错误状态 10

二、重新编译安装内核

重新编译内核

参考文章:

https://github.com/anbox/anbox-modules/issues/75#issuecomment-794079944

1. 查看内核版本

$ uname -a
Linux 5.11.6-051106-generic #202103111435 SMP Thu Mar 11 14:42:39 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

2. 安装依赖

sudo apt install git dwarves fakeroot bc kmod kernel-package cpio libncurses5-dev libgtk2.0-dev libglib2.0-dev libglade2-dev libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev dpkg-dev autoconf

3. 下载内核源码[URL]

cd /tmp 
  mkdir kernel
  wget http://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.tar.gz
  • 解压
cd /tmp/kernel
  tar xzvf linux-*
  cd linux-5.12

4. 重要! 复制当前内核 config 配置

cp /boot/config-$(uname -r) ./.config

5. 配置内核参数

链接中使用的是 make gconfig 的图形界面配置, 但是配置项比较难找

vim ./.config
# 查找 Android 并修改如下配置:
CONFIG_ASHMEM=y

CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"

# 保存退出

如果有报证书错误, 编辑 CONFIG_SYSTEM_TRUSTED_KEYS="" 为空

6. 编译内核

-j4 参数代表用几个线程同时跑make, 一般按照CPU逻辑核心数进行设定; 例如我的机器是 4C8T(四核八线程) , 我就使用的是 -j8 参数

sudo time nice make -j8 bindeb-pkg LOCALVERSION=-android

.

.

.

编译内核比较慢, 我这边大约一个小时左右, 耐心等待即可

7. 安装

cd ..
sudo dpkg -i linux-*.deb

8. 重启确认

$ reboot

#之后
$ uname -a
Linux pro 5.12.0-amd64-desktop-android #1 SMP Tue Apr 27 16:48:19 CST 2021 x86_64 GNU/Linux


$ ls -1 /dev/{ashmem,binder}                    
/dev/ashmem

/dev/binder:
binder
binder-control
hwbinder
vndbinder

9. binder 不存在

手动创建并挂载

sudo mkdir /dev/binderfs
sudo mount -t binder binder /dev/binderfs

sudo mkdir /dev/binder
sudo mount -t binder binder /dev/binder

# 检查: $ ls -1 /dev/{ashmem,binder}

10. modprobe 错误

# 内核安装完毕之后, modprobe 依旧会失败, 不用理会, 只需要 /dev/ashmem /dev/binder 的设备存在即可

三、源码安装 anbox

参考链接:

https://community.linuxmint.com/tutorial/view/2501

0. 卸载 apt 安装的 anbox

sudo apt remove anbox -y

1. 安装依赖

$ sudo apt update
$ sudo apt install build-essential 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 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 libgmock-dev git \
    cmake-extras libdw-dev libbfd-dev libdwarf-dev

2. 编译准备

cd /usr/local/src
sudo git clone https://github.com/anbox/anbox.git --recurse-submodules
sudo chown -R $USER:$USER anbox/
mkdir anbox/build/
cd anbox/build/

3. cmake 准备

cmake ..
  • 确保不会出现任何报错信息, 否则 make 会失败
  • 正常输出类似这个样子:
$ cmake ..

-- No build type selected, default to RelWithDebInfo
-- Treat warnings as errors
-- Boost version: 1.67.0
-- Found the following Boost libraries:
--   filesystem
--   log
--   serialization
--   system
--   thread
--   program_options
--   date_time
--   log_setup
--   regex
--   chrono
--   atomic
-- LXC version: 3.0.3
-- Boost version: 1.67.0
-- Found the following Boost libraries:
--   iostreams
--   system
--   regex
-- Boost version: 1.67.0
-- Found the following Boost libraries:
--   filesystem
--   system
--   unit_test_framework
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/src/anbox/build

4. make

sudo make -j8

5. make install

sudo -i
cd /usr/local/src/anbox/build/
make install

6. 测试

$ anbox                                               

NAME:
    anbox - anbox

USAGE:
    anbox [command options] [arguments...]

COMMANDS:
    wait-ready                     Wait until the Android system has successfully booted                                               
    check-features                 Check that the host system supports all necessary features                                          
    version                        Print the version of the daemon                                                                     
    help                           Print a short help message                                                                          
    launch                         Launch an Activity by sending an intent                                                             
    session-manager                Run the the anbox session manager                                                                   
    system-info                    Print various information about the system we're running on

如果成功进行到了这一步, 恭喜! 你已经成功了一大半!

7. 检测 anbox 需求

$ anbox check-features
Your computer does meet all requirements to run Anbox
$ anbox system-info
version: local-9de4e87
cpu:
  arch:  x86
  brand: AMD Ryzen 5 3550H with Radeon Vega Mobile Gfx  
  features: 
    - aes
    - sse4_1
    - sse4_2
    - avx
    - avx2
os:
  name: Deepin
  version: 20.2
  snap-based: false
kernel:
  version: Linux version 5.12.0-amd64-desktop-android (root@pro) (gcc (Uos 8.3.0.3-3+rebuild) 8.3.0, GNU ld (GNU Binutils for Uos) 2.31.1) #1 SMP Tue Apr 27 16:48:19 CST 2021
  binder: true
  ashmem: true
graphics:
  egl:
    vendor: Mesa Project
    version: 1.5
    extensions:
      - EGL_ANDROID_blob_cache
...# 折叠了
      - EGL_WL_bind_wayland_display
  gles2:
    vendor: X.Org
    vendor: OpenGL ES 3.2 Mesa 19.2.6
    extensions:
      - GL_EXT_blend_minmax
...# 折叠了
      - GL_EXT_texture_query_lod

四、运行 anbox

0. 准备 Android 镜像

wget https://build.anbox.io/android-images/2018/07/19/android_amd64.img
sudo mkdir /var/lib/anbox
sudo mv android_amd64.img /var/lib/anbox/android.img

1. 命令行运行测试

  • 新启动一个命令行窗口 1
# 再次确认
$ ls -1 /dev/{ashmem,binder}
/dev/ashmem
/dev/binder
# 启动 bridge 脚本
sudo /usr/local/src/anbox/scripts/anbox-bridge.sh start
# 启动 manager 脚本
sudo anbox container-manager --daemon --privileged --data-path=/var/lib/anbox
# 上面这个命令将会占用窗口, 没有任何输出, 需要初始化一段时间, 放着就行, 测试完 ctrl + C 关掉就好
  • 新启动一个命令行窗口 2
# 检测 manager 日志, 直到文件存在且日志显示:
# Mainloop is ready 字样再往下走
sudo tail -f /var/lib/anbox/logs/container.log
  • 新启动一个命令行窗口 3

启动 anbox

anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

一般情况下会正常运行, 如果显示 session manager failed to become ready 那么代表 上一步骤中的 manager 还没有完全启动, 等等再启动即可

五、写入 systemctl 服务

1. 写入 service

$ sudo vim /lib/systemd/system/anbox-container-manager.service

[Unit]
Description=Anbox Container Manager
After=network.target
Wants=network.target
ConditionPathExists=/var/lib/anbox/android.img

[Service]
#ExecStartPre=/sbin/modprobe ashmem_linux
#ExecStartPre=/sbin/modprobe binder_linux
ExecStartPre=/usr/local/src/anbox/scripts/anbox-bridge.sh start
ExecStart=/usr/local/bin/anbox container-manager --daemon --privileged --data-path=/var/lib/anbox
ExecStopPost=/usr/local/src/anbox/scripts/anbox-bridge.sh stop

[Install]
WantedBy=multi-user.target

由于 modprobe ashmem_linux 命令执行会出错, 所以跳过去 (命令的作用是启动内核的 askmem 模块, 不过我们已经编译在内核里面自动启动了, 所以这里不需要这个操作)

2. 建立启动链接

sudo ln -s /lib/systemd/system/anbox-container-manager.service /etc/systemd/system/

如果显示 ln: 无法创建符号链接'/etc/systemd/system/anbox-container-manager.service': 文件已存在, 删掉 上述文件即可

3. reload daemon

sudo systemctl daemon-reload

4. 启动

sudo systemctl start anbox-container-manager.service

# 查看运行状态
sudo systemctl status anbox-container-manager.service

5. [选择性]开机启动

sudo systemctl enable anbox-container-manager.service

6. 启动 anbox

anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

小结

deepin 由于内核版本更新的速度比较快, 而且使用的是社区维护的版本, 所以有些软件不可用是正常的;

anbox 这一波的确比较折腾, 不过占用资源比较少;

我还没有使用 anbox 进行操作, 当前仅仅是安装成功, 预计情况下会有很多 app 不兼容的情况, 遇见再说吧;

希望这篇总结可以帮到你 😃

David Zhang,

Br