Anbox在ARM64架构Linux上运行Android程序

环境配置说明

交叉编译内核

  1. 某些发行版内核已自带了模块,但树莓派的内核不包含它们且不支持DKMS只能手动编译

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

  1. 在编译主机上安装交叉编译工具
1
2
sudo apt-get update
sudo apt install git bc bison flex libssl-dev make libncurses-dev gcc-aarch64-linux-gnu
  1. 获取内核源码
1
2
3
mkdir /home/leux/rpi4
cd /home/leux/rpi4
git clone -b rpi-5.4.y --depth=1 https://github.com/raspberrypi/linux.git
  1. 为内核源码打补丁,使其可生成ashmem_linux和binder_linux模块
1
2
3
4
5
wget https://salsa.debian.org/kernel-team/linux/-/blob/debian/5.4.19-1/debian/patches/debian/android-enable-building-ashmem-and-binder-as-modules.patch
wget https://salsa.debian.org/kernel-team/linux/-/blob/debian/5.4.19-1/debian/patches/debian/export-symbols-needed-by-android-drivers.patch
cd linux
patch -p1 < ../android-enable-building-ashmem-and-binder-as-modules.patch
patch -p1 < ../export-symbols-needed-by-android-drivers.patch
  1. 获取内核编译配置文件
1
2
3
4
5
6
# 在64位的Raspbian系统内执行下面命令来获取官方的内核编译配置文件
sudo modprobe configs
zcat /proc/config.gz > ~/raspi4b.config

# 将上面的raspi4b.config拷贝到内核源码下
cp raspi4b.config /home/leux/rpi4/linux/.config
  1. 配置内核编译参数
1
2
3
4
5
6
7
8
9
10
11
12
# 进入内核配置界面
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

# 要运行所必须的内核参数
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=m
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
CONFIG_ASHMEM=m

# 在内核配置界面里的位置
Device Drivers > Android > Android Drivers > Android Binder IPC Driver
Device Drivers > Staging drivers > Android > Enable the Anonymous Shared Memory Subsystem
  1. 编译内核并备份
1
2
3
4
5
6
7
8
9
10
11
12
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j12

# 安装模块到临时文件夹
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/leux/rpi4/kernel/ modules_install

# 安装内核到临时文件夹
cp arch/arm64/boot/Image ../kernel/kernel-kvm.img

# 备份生成的内核到kernel.tgz
cd /home/leux/rpi4
tar -czvf kernel.tgz kernel/
  1. 安装内核到系统
1
2
3
4
5
# 把上步生成的kernel.tgz复制到树莓派里
tar -xzvf kernel.tgz && cd kernel
mv kernel-kvm.img /boot/
mv lib/modules/* /lib/modules/
echo "kernel=kernel-kvm.img" >> /boot/config.txt
  1. 安装完内核后重启来加载新内核,然后查看模块效果
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
3
4
5
6
7
8
9
10
11
# 官方提供的arm64镜像不能正常启动,但可以使用别人已经编译好的
# 链接: https://pan.baidu.com/s/1QDaDtCi4MIMLbQyc-Ov0UA 提取码: w6av
https://build.anbox.io/android-images/2017/06/12/android_1_armhf.img
https://build.anbox.io/android-images/2017/08/04/android_1_arm64.img
https://build.anbox.io/android-images/2018/07/19/android_amd64.img

# 也可使用Ubuntu Touch项目提供的Anbox-images镜像
https://cdimage.ubports.com/anbox-images/android-armhf-32binder.img
https://cdimage.ubports.com/anbox-images/android-armhf-64binder.img

cp android_1_arm64.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

其他说明

  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
9
10
11
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 # 列出已安装的包

# 只能安装arm64-v8a的应用,不兼容armeabi-v7a或armeabi的应用
adb: failed to install xx.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]