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
添加评论