deepin 20.2 編譯 安裝 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