b. 编译安卓7.1.1系统anbox_arm64-userdebug版本img镜像

0. 编译环境

  • 代码分支:anbox分支源码

  • 系统:Ubuntu22.04

  • 内存:16G

1. 下载repo工具

mkdir -p ~/.bin PATH="${HOME}/.bin:${PATH}" curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo chmod a+rx ~/.bin/repo

创建phyton软连接,否则repo下载源码时会报错。

sudo ln -s /usr/bin/python3 /usr/bin/python

2. 通过repo工具下载安卓系统anbox分支源码

mkdir anbox-work cd anbox-work/ repo init -u https://github.com/anbox/platform_manifests.git -b anbox repo sync -c -j6

3. 安装编译依赖

sudo apt-get install openjdk-8-jdk sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib sudo apt-get install -y flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install libsdl1.2-dev curl libc6-dev-i386 lib32ncurses5-dev sudo apt-get install lib32z-dev ccache

4. 编译安卓系统anbox分支源码

首先使用envsetup.sh脚本初始化环境

. build/envsetup.sh

使用lunch初始化构建

lunch anbox_arm64-userdebug

提供如下全部构建目标列表。

anbox_x86_64-userdebug anbox_armv7a_neon-userdebug anbox_arm64-userdebug

开始全部编译

make -j8 2>&1 | tee ../build_arm64.log

5.打包android.img镜像

构建完成后,我们需要获取结果并创建一个适合Anbox的镜像文件

cd $HOME/anbox-work/vendor/anbox scripts/create-package.sh \ $PWD/../../out/target/product/arm64/ramdisk.img \ $PWD/../../out/target/product/arm64/system.img

(如果是编译的其他架构,使用您的目标架构名称替换arm64)
最后在$HOME/anbox-work/vendor/anbox得到一个android.img

6.写在最后

编译过程中遇到的一些问题以及解决办法。

  • 问题1

在Ubuntu20.04遇到了,You asked for an OpenJDK based build but your version is java version "1.8.0_77" Java(TM) SE Run

解决方法:原因是编译Android的源码时要安装 openjdk而不是jdk,安装openjdk即可。

  • 问题2

FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"

解决方法:这个错误是由于本地LC_ALL变量导致的,可以在编译前将这个值设置为C即可,即:export LC_ALL=C

  • 问题3

编译报错:SSL error when connecting to the Jack server......recipe for target 'ninja_wrapper' failed

解决方法:

1、cd /etc/java-8-openjdk/security/到该目录下;
sudo vim java.security(注意需要用root用户去打开并修改);
remove "TLSv1, TLSv1.1"这两个配置;

2、重启server

./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server
  • 问题4

编译报错Error: Could not find or load main class com.tonicsystems.jarjar.Main

解决方法:

rm -rf out export LANG=C export LC_ALL=C export LC_COLLATE=C

然后按上面的步骤4重新编译

  • 问题5

编译anbox_arm64-userdebug版本报错,
external/libavc/decoder/arm/ih264d_function_selector.c:67: error: undefined reference to 'ih264d_init_function_ptr_av8'

解决方案:

修改文件,./external/libavc/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ARCH_ARM_HAVE_NEON:=true       //增加这一行
# encoder
include $(LOCAL_PATH)/encoder.mk
# decoder
include $(LOCAL_PATH)/decoder.mk