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
预览:
一、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
参考链接:
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