前言 & Anbox 简介

最近换回了 Manjaro 和 Xfce, 打算认认真真地开始将 Linux 作为日常生活系统而不仅仅是开发系统来用了. 然而在日常生活中, 总归是逃不掉某国产IM的 :(. 为了实现以 Manjaro 作为生活主力系统的目标, (同时也为了以后说不定能愉快地打游戏), 决定安装一个能跑安卓应用的东西. 于是我的 Anbox 之旅就在完全搞不懂 Android x86 是什么玩意的情况下展开了.

Anbox 官网上的介绍:

Anbox: Android in a Box Run Android applications on any GNU/Linux operating system. Anbox puts the Android operating system into a container, abstracts hardware access and integrates core system services into a GNU/Linux system. Every Android application will be integrated with your operating system like any other native application.

简单来讲就类似 docker , 利用 LXD 技术在 Linux 系统里新建一个全新的容器, 然后直接去跑一个 Android x86. 好处嘛就是跑得比虚拟机快, 集成度比虚拟机好. 坏处嘛就是兼容性还是有待提高…

安装

安装之前…

确保您的内核支持 /dev/ashmem/dev/binder, 如果没有, 请参照:

安装 Anbox

Anbox 分为两块, 一块是本体, 一块是安卓镜像.

archlinuxcn

使用 archlinuxcn 的并且没有特殊需求的老哥可以直接用 archlinuxcn 里的.

$ pacman -Ss anbox
archlinuxcn/anbox-git 1:1282.170f1e0-2
    Running Android in a container
archlinuxcn/anbox-image 1:2018.07.19-1
    Android image for running in Anbox

$ pacman -S anbox-git anbox-image

注意, 此镜像就是一纯的 AOSP , 没有谷歌框架, 没有 ARM 译码器.

aur

$ pikaur -Ss anbox
aur/anbox-git 1:r1240.c1e7550-1 (134, 0.86)  # 本体
    Running Android in a container


aur/anbox-image 1:2018.07.19-1 (67, 0.36)             # 纯净镜像
    Android image for running in Anbox
aur/anbox-image-gapps 2018.07.19-15 (18, 0.40)        # 带 Google 框架的镜像
    Android image for running in Anbox, with OpenGApps and Houdini
aur/anbox-image-houdini-rooted 2018.07.19-5 (6, 0.67) # 带译码器, SuperSU 的镜像
    Android image for running in Anbox with Houdini and SuperSU
aur/anbox-image-gapps-rooted 2018.07.19-7 (4, 0.04)   # 带 Google 框架, SuperSU 的镜像
    Android image for running in Anbox with Houdini, OpenGApps and SuperSU
aur/anbox-image-houdini 2018.07.19-5 (3, 0.03)        # 带译码器的镜像
    Android image for running in Anbox with Houdini

Houdini (某知名动画软件) libhoudini, 是 Android x86 默认采用的, 将 arm 架构译码到 x86 的转换层.
简单来说, 有了它, Android x86 就可以安装/运行很多基于 ARM 的 Apk/App 了. (理所当然地, 会变慢, 并且不是全部都能跑. 但是对于现代电脑来说这点性能损失完全抵消不掉其对手机处理器的性能优势)

本体 装上之后再挑一个 镜像 装上就可以了.

安装之后

挂载 binder:

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

启动服务:

sudo systemctl start anbox-container-manager.service
sudo systemctl enable anbox-container-manager.service # 让这个服务每次开机之后保持运行

启动 Anbox 的应用抽屉:

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

如果有像下面这样的报错:

The name org.anbox was not provided by any .service fil

请检查您是否完成上面两步. 同时您还可以查看日志:

sudo systemctl status anbox-container-manager.service

替换内核

根据 Arch Wiki 的 Anbox 页面, 5.7.0 及以上的内核需要重新编译开启某些选项来支持 binder 等功能.

5.7.0 以下的内核直接安装名字里带有 dkms 的包即可.

通过 aur

在编译完之后才发现 aur 里直接就有…

pikaur -S linux-xanmod-anbox

随后重启.

自己编译

当初看鸟哥的私房菜的时候, 编译内核还是高级操作, 搞得我一开始还害怕极了… 后来发现前辈们早已为我们准备了各种各样的工具, 编译内核? 几行搞定!

主要参考: [extendswind] Manjaro内核编译

下载源码

如果您在时隔多年(?)以后看我的文章的话, 记得把链接最后那个 linux58 改成您想要的版本号.

git clone https://gitlab.manjaro.org/packages/core/linux58.git

(可选) 修改makepkg的编译选项

主要就是开一个-march=native. 编辑 /etc/makepkg.conf, 将 CFLAGSCXXFLAGS 改为:

CFLAGS="-march=native -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=native -O2 -pipe -fstack-protector-strong -fno-plt"

这个选项是让 gcc 自己选择当前平台的优化. 参见 Arch Wiki 上的介绍

编译

查看 clone 下来的 PKGBUILD 文件可以看到, Manjaro 团队已经很贴心地帮我们把 Anbox 的内核编译参数写好加进去了. 所以我们只需要编译就好了

config.anbox 的内容:

CONFIG_ASHMEM=y
# CONFIG_ION is not set
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set

编译!

./autogen.sh
makepkg

在本人的 i5-7500 上编译大概要一小时, 编译完之后安装产出的 linux58-headers-5.8.13-3-x86_64.pkg.tar.xz 包即可:

sudo pacman -U linux58-headers-5.8.13-3-x86_64.pkg.tar.xz

然后重启.

最后

deepin.com.qq.officedeepin.com.wechat2 真香! 结果又花了几个小时的时间折腾了没意义的东西呢!