Anbox手动安装ARM兼容库

环境配置说明

检查所需模块

从Ubuntu 19.04开始,自带的内核(>= 5.0)已包含上面两个模块,不再需要从PPA安装模块。
从Debian 10开始,自带的内核(>= 4.19)已包含上面两个模块,不再需要从DKMS安装模块。

1
2
3
4
5
6
7
8
# 测试加载内核模块
sudo modprobe ashmem_linux
sudo modprobe binder_linux

# 查看加载是否成功
ls -1 /dev/{ashmem,binder}
/dev/ashmem
/dev/binder

安装配置Anbox

  1. 安装Anbox
1
2
# 注意:Anbox在contrib源里,找不到包则需要添加contrib源
sudo apt install anbox
  1. 下载Android镜像
1
2
wget https://build.anbox.io/android-images/2018/07/19/android_amd64.img
cp android_amd64.img /var/lib/anbox/android.img
  1. 启动Anbox容器管理器
1
2
3
4
5
6
7
8
# 启动Anbox容器管理器
sudo systemctl start anbox-container-manager

# 启动Session管理器
/usr/bin/anbox session-manager

# 启动Anbox应用管理界面
/usr/bin/anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

启用ARM兼容

  1. 可以使用脚本来自动启用ARM兼容,如使用脚本就不需要执行后面步骤了
1
2
3
4
sudo apt install wget lzip unzip squashfs-tools
wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-houdini-only.sh
chmod +x install-playstore.sh
sudo ./install-playstore.sh
  1. 下载兼容库和准备镜像
1
2
3
4
5
6
# houdini中7代表安卓版本号,x是32位系统用的支持32位程序的库
# y是64位系统用的支持32位程序的库,z是64位系统用的支持64位的库
wget http://dl.android-x86.org/houdini/7_y/houdini.sfs -O houdini_y.sfs
wget http://dl.android-x86.org/houdini/7_z/houdini.sfs -O houdini_z.sfs
cp /var/lib/anbox/android.img ./
unsquashfs android.img
  1. 将兼容库复制到解包后的Android镜像内
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 为了保证文件的权限正常,后续操作全部以ROOT权限执行
# 32位库放到/system/lib/arm/下
unsquashfs -f -d houdini_y houdini_y.sfs
mkdir squashfs-root/system/lib/arm
cp -r ./houdini_y/* squashfs-root/system/lib/arm
chown -R 100000:100000 squashfs-root/system/lib/arm
cp squashfs-root/system/lib/arm/libhoudini.so squashfs-root/system/lib/libhoudini.so

# 64位库放到/system/lib64/arm64/下
unsquashfs -f -d houdini_z houdini_z.sfs
mkdir squashfs-root/system/lib64/arm64
cp -r ./houdini_z/* squashfs-root/system/lib64/arm64/
chown -R 100000:100000 squashfs-root/system/lib64/arm64
cp squashfs-root/system/lib64/arm64/libhoudini.so squashfs-root/system/lib64/libhoudini.so
  1. 设置将ARM的程序通过houdini来运行
1
2
3
4
5
# 通过文件开始位置的特殊的字节来判断是否是ARM程序,是的话将其使用houdini来运行
echo ':arm_exe:M::\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28::/system/lib/arm/houdini:P' | tee -a /proc/sys/fs/binfmt_misc/register
echo ':arm_dyn:M::\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x28::/system/lib/arm/houdini:P' | tee -a /proc/sys/fs/binfmt_misc/register
echo ':arm64_exe:M::\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7::/system/lib64/arm64/houdini64:P' | tee -a /proc/sys/fs/binfmt_misc/register
echo ':arm64_dyn:M::\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\xb7::/system/lib64/arm64/houdini64:P' | tee -a /proc/sys/fs/binfmt_misc/register
  1. 修改default.prop和system/build.prop文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 在default.prop中的 `ro.zygote=zygote64_32` 下面添加一行:ro.dalvik.vm.native.bridge=libhoudini.so
sed -i '/ro.zygote=zygote64_32/a\ro.dalvik.vm.native.bridge=libhoudini.so' default.prop

# system/build.prop的修改
sed -i "/^ro.product.cpu.abilist=x86_64,x86/ s/$/,armeabi-v7a,armeabi,arm64-v8a/" system/build.prop
sed -i "/^ro.product.cpu.abilist32=x86/ s/$/,armeabi-v7a,armeabi/" system/build.prop
sed -i "/^ro.product.cpu.abilist64=x86_64/ s/$/,arm64-v8a/" system/build.prop
echo "persist.sys.nativebridge=1" | sudo tee -a system/build.prop
echo "ro.opengles.version=131072" | sudo tee -a system/build.prop

# system/build.prop修改前
ro.product.cpu.abilist=x86_64,x86
ro.product.cpu.abilist32=x86
ro.product.cpu.abilist64=x86_64

# system/build.prop修改后
ro.product.cpu.abilist=x86_64,x86,armeabi-v7a,armeabi,arm64-v8a
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
ro.product.cpu.abilist64=x86_64,arm64-v8a

# 在最后面添加下面两行
persist.sys.nativebridge=1
ro.opengles.version=131072
  1. 修改system/etc/permissions/anbox.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 删除下面两句
<unavailable-feature name="android.hardware.wifi" />
<unavailable-feature name="android.hardware.bluetooth" />

# 添加下面几句
<feature name="android.hardware.touchscreen" />
<feature name="android.hardware.audio.output" />
<feature name="android.hardware.camera" />
<feature name="android.hardware.camera.any" />
<feature name="android.hardware.location" />
<feature name="android.hardware.location.gps" />
<feature name="android.hardware.location.network" />
<feature name="android.hardware.microphone" />
<feature name="android.hardware.screen.portrait" />
<feature name="android.hardware.screen.landscape" />
<feature name="android.hardware.wifi" />
<feature name="android.hardware.bluetooth" />"
  1. 将修改后的镜像打包并替换原版镜像
1
2
3
4
mksquashfs squashfs-root android.img
rm /var/lib/anbox/android.img
cp android.img /var/lib/anbox/android.img
systemctl restart anbox-container-manager

其他说明

  1. 在Session manager启动后,可通过lxc-attach来进入Abox的Shell环境
1
2
3
4
5
6
7
8
9
10
11
sudo lxc-attach -q \
--clear-env \
-P /var/lib/anbox/containers \
-n default \
-v PATH=/sbin:/system/bin:/system/sbin:/system/xbin \
-v ANDROID_ASSETS=/assets \
-v ANDROID_DATA=/data \
-v ANDROID_ROOT=/system \
-v ANDROID_STORAGE=/storage \
-v ASEC_MOUNTPOINT=/mnt/asec \
-v EXTERNAL_STORAGE=/sdcard -- /system/bin/sh
  1. 在Anbox中安装应用
1
2
3
4
5
6
7
8
sudo apt install android-tools-adb

# ABD基本操作
adb devices # 查看Android设备
adb install xxx.apk # 安装APP到Anbox
adb uninstall com.xx.xx # 从设备中卸载APP
adb shell # 进入Android交互
adb shell pm list packages # 列出已安装的包