deepin 20.2 编译 安装 anbox
<h1 id="deepin-202-编译-安装-anbox">deepin 20.2 编译 安装 anbox</h1><p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>deepin 20.2 编译 安装 anbox<ul><li><ul><li>最低折腾时间: 2 hour</li><li>预览:</li></ul></li><li>一、apt 安装失败原因<ul><li><ul><li>1. 内核不支持</li><li>2. dkms驱动无法安装</li></ul></li></ul></li><li>二、重新编译安装内核<ul><li>1. 查看内核版本</li><li>2. 安装依赖</li><li>3. 下载内核源码</li><li><strong>4. 重要! 复制当前内核 config 配置</strong></li><li>5. 配置内核参数</li><li>6. 编译内核</li><li>7. 安装</li><li>8. 重启确认</li><li>9. binder 不存在</li><li>10. modprobe 错误</li></ul></li><li>三、源码安装 anbox<ul><li>0. 卸载 apt 安装的 anbox</li><li>1. 安装依赖</li><li>2. 编译准备</li><li>3. cmake 准备</li><li>4. make</li><li>5. make install</li><li>6. 测试</li><li>7. 检测 anbox 需求</li></ul></li><li>四、运行 anbox<ul><li>0. 准备 Android 镜像</li><li>1. 命令行运行测试</li></ul></li><li>五、写入 systemctl 服务<ul><li>1. 写入 service</li><li>2. 建立启动链接</li><li>3. reload daemon</li><li>4. 启动</li><li>5. [选择性]开机启动</li><li>6. 启动 anbox</li></ul></li><li>小结</li></ul></li></ul></div><p></p>
<h3 id="最低折腾时间-2-hour">最低折腾时间: 2 hour</h3>
<h3 id="预览">预览:</h3>
<p><img src="https://i.loli.net/2021/04/28/oRxYSaCvGhOXMQj.png" alt="" loading="lazy"></p>
<p><img src="https://i.loli.net/2021/04/28/gK8WRfDFrIq5Pdv.png" alt="image-20210428133958111" loading="lazy"><img src="https://i.loli.net/2021/04/28/wWYlsfbUQriTIKx.png" alt="image-20210428134017040" loading="lazy"></p>
<h2 id="一apt-安装失败原因">一、apt 安装失败原因</h2>
<h4 id="1-内核不支持">1. 内核不支持</h4>
<pre><code class="language-sh">$ 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
</code></pre>
<h4 id="2-dkms驱动无法安装">2. dkms驱动无法安装</h4>
<pre><code class="language-sh">sudo apt install anbox-modules-dkms
# Output:
dpkg: 处理软件包 anbox-modules-dkms (--configure)时出错:
已安装 anbox-modules-dkms 软件包 post-installation 脚本 子进程返回错误状态 10
</code></pre>
<h2 id="二重新编译安装内核">二、重新编译安装内核</h2>
<p><strong>重新编译内核</strong></p>
<blockquote>
<p>参考文章:</p>
<p>https://github.com/anbox/anbox-modules/issues/75#issuecomment-794079944</p>
</blockquote>
<h3 id="1-查看内核版本">1. 查看内核版本</h3>
<pre><code class="language-sh">$ 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
</code></pre>
<h3 id="2-安装依赖">2. 安装依赖</h3>
<pre><code class="language-sh">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
</code></pre>
<h3 id="3-下载内核源码url">3. 下载内核源码</h3>
<pre><code class="language-sh">cd /tmp
mkdir kernel
wget http://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.tar.gz
</code></pre>
<ul>
<li>解压</li>
</ul>
<pre><code class="language-sh">cd /tmp/kernel
tar xzvf linux-*
cd linux-5.12
</code></pre>
<h3 id="4-重要-复制当前内核-config-配置"><strong>4. 重要! 复制当前内核 config 配置</strong></h3>
<pre><code class="language-sh">cp /boot/config-$(uname -r) ./.config
</code></pre>
<h3 id="5-配置内核参数">5. 配置内核参数</h3>
<blockquote>
<p>链接中使用的是 make gconfig 的图形界面配置, 但是配置项比较难找</p>
</blockquote>
<pre><code class="language-sh">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"
# 保存退出
</code></pre>
<blockquote>
<p>如果有报证书错误,编辑 CONFIG_SYSTEM_TRUSTED_KEYS="" 为空</p>
</blockquote>
<h3 id="6-编译内核">6. 编译内核</h3>
<blockquote>
<p>-j4 参数代表用几个线程同时跑make, 一般按照CPU逻辑核心数进行设定;例如我的机器是 4C8T(四核八线程) , 我就使用的是 -j8 参数</p>
</blockquote>
<pre><code class="language-sh">sudo time nice make -j8 bindeb-pkg LOCALVERSION=-android
</code></pre>
<p>.</p>
<p>.</p>
<p>.</p>
<p>编译内核比较慢, 我这边大约一个小时左右, 耐心等待即可</p>
<h3 id="7-安装">7. 安装</h3>
<pre><code class="language-sh">cd ..
sudo dpkg -i linux-*.deb
</code></pre>
<h3 id="8-重启确认">8. 重启确认</h3>
<pre><code class="language-sh">$ 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
</code></pre>
<h3 id="9-binder-不存在">9. binder 不存在</h3>
<blockquote>
<p>手动创建并挂载</p>
</blockquote>
<pre><code class="language-sh">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}
</code></pre>
<h3 id="10-modprobe-错误">10. modprobe 错误</h3>
<pre><code class="language-sh"># 内核安装完毕之后, modprobe 依旧会失败, 不用理会, 只需要 /dev/ashmem /dev/binder 的设备存在即可
</code></pre>
<h2 id="三源码安装-anbox">三、源码安装 anbox</h2>
<blockquote>
<p>参考链接:</p>
<p>https://community.linuxmint.com/tutorial/view/2501</p>
</blockquote>
<h3 id="0-卸载-apt-安装的-anbox">0. 卸载 apt 安装的 anbox</h3>
<pre><code class="language-sh">sudo apt remove anbox -y
</code></pre>
<h3 id="1-安装依赖">1. 安装依赖</h3>
<pre><code class="language-sh">$ 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
</code></pre>
<h3 id="2-编译准备">2. 编译准备</h3>
<pre><code class="language-sh">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/
</code></pre>
<h3 id="3-cmake-准备">3. cmake 准备</h3>
<pre><code class="language-sh">cmake ..
</code></pre>
<ul>
<li>
<p><strong>确保不会出现任何报错信息</strong>, 否则 <code>make</code> 会失败</p>
</li>
<li>
<p>正常输出类似这个样子:</p>
</li>
</ul>
<pre><code class="language-sh">$ 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
</code></pre>
<h3 id="4-make">4. make</h3>
<pre><code class="language-sh">sudo make -j8
</code></pre>
<h3 id="5-make-install">5. make install</h3>
<pre><code class="language-sh">sudo -i
cd /usr/local/src/anbox/build/
make install
</code></pre>
<h3 id="6-测试">6. 测试</h3>
<pre><code class="language-sh">$ anbox
NAME:
anbox - anbox
USAGE:
anbox
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
</code></pre>
<p><strong>如果成功进行到了这一步, 恭喜! 你已经成功了一大半!</strong></p>
<h3 id="7-检测-anbox-需求">7. 检测 anbox 需求</h3>
<pre><code class="language-sh">$ 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
</code></pre>
<h2 id="四运行-anbox">四、运行 anbox</h2>
<h3 id="0-准备-android-镜像">0. 准备 Android 镜像</h3>
<pre><code class="language-sh">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
</code></pre>
<h3 id="1-命令行运行测试">1. 命令行运行测试</h3>
<ul>
<li><strong>新启动一个命令行窗口 1</strong></li>
</ul>
<pre><code class="language-sh"># 再次确认
$ 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 关掉就好
</code></pre>
<ul>
<li><strong>新启动一个命令行窗口 2</strong></li>
</ul>
<pre><code class="language-sh"># 检测 manager 日志, 直到文件存在且日志显示:
# Mainloop is ready 字样再往下走
sudo tail -f /var/lib/anbox/logs/container.log
</code></pre>
<ul>
<li><strong>新启动一个命令行窗口 3</strong></li>
</ul>
<p>启动 anbox</p>
<pre><code class="language-sh">anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
</code></pre>
<blockquote>
<p>一般情况下会正常运行, 如果显示 <code>session manager failed to become ready</code> 那么代表 上一步骤中的 manager 还没有完全启动, 等等再启动即可</p>
</blockquote>
<h2 id="五写入-systemctl-服务">五、写入 systemctl 服务</h2>
<h3 id="1-写入-service">1. 写入 service</h3>
<pre><code class="language-sh">$ sudo vim /lib/systemd/system/anbox-container-manager.service
Description=Anbox Container Manager
After=network.target
Wants=network.target
ConditionPathExists=/var/lib/anbox/android.img
#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
WantedBy=multi-user.target
</code></pre>
<p>由于 <code>modprobe ashmem_linux</code> 命令执行会出错, 所以跳过去 (命令的作用是启动内核的 askmem 模块,不过我们已经编译在内核里面自动启动了, 所以这里不需要这个操作)</p>
<h3 id="2-建立启动链接">2. 建立启动链接</h3>
<pre><code class="language-sh">sudo ln -s /lib/systemd/system/anbox-container-manager.service /etc/systemd/system/
</code></pre>
<blockquote>
<p>如果显示 <code>ln: 无法创建符号链接'/etc/systemd/system/anbox-container-manager.service': 文件已存在</code>, 删掉 上述文件即可</p>
</blockquote>
<h3 id="3-reload-daemon">3. reload daemon</h3>
<pre><code class="language-sh">sudo systemctl daemon-reload
</code></pre>
<h3 id="4-启动">4. 启动</h3>
<pre><code class="language-sh">sudo systemctl start anbox-container-manager.service
# 查看运行状态
sudo systemctl status anbox-container-manager.service
</code></pre>
<h3 id="5-选择性开机启动">5. [选择性]开机启动</h3>
<pre><code class="language-sh">sudo systemctl enable anbox-container-manager.service
</code></pre>
<h3 id="6-启动-anbox">6. 启动 anbox</h3>
<pre><code class="language-sh">anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity
</code></pre>
<h2 id="小结">小结</h2>
<p>deepin 由于内核版本更新的速度比较快, 而且使用的是社区维护的版本, 所以有些软件不可用是正常的;</p>
<p>anbox 这一波的确比较折腾, 不过占用资源比较少;</p>
<p>我还没有使用 anbox 进行操作, 当前仅仅是安装成功, 预计情况下会有很多 app 不兼容的情况, 遇见再说吧;</p>
<p>希望这篇总结可以帮到你 😃</p>
<p>David Zhang,</p>
<p>Br</p><br><br>
来源:https://www.cnblogs.com/gettolive/p/14714022.html
頁:
[1]