在 Arch Linux 下编译 Android 7

本文以一加 3 设备为例,介绍 LineageOS 14.1 (Android 7.1) 在 Arch Linux 下的编译过程。

环境配置

首先,按照 ArchWiki 相关介绍 安装编译工具:lineageos-develrepoJDK。这里以 LineageOS 14.1 为例,因此需要安装的 JDK 版本为 8。

代码拉取

创建源代码工作及编译目录,以清华大学的 lineageOS 源代码镜像使用帮助 为指引,同步 LineageOS 源代码即可。

之后,参考 LineageOS 一加 3 设备编译指引,开启 ccache ,下载设备对应代码与内核,并连接设备以同步闭源二进制文件。在下载设备对应代码时,由于此时并未生成 vendor 目录,可能出现失败,只需在同步二进制文件后再次执行相关命令即可。

编译

执行相关命令,开始编译。下面总结一些遇到的问题。

Python 2 代码出错

一些 Python 2 时代的编译工具脚本无法在 Python 3 下运行。安装 python2-bin,新建一个 env-python2 目录,在其中执行 ln -s /usr/bin/python2 python 生成一个名为 python 指向 Python 2 的链接,之后将此目录加入环境变量 PATH 即可。

无法访问 java.lang.Object

确认 JDK 版本无误。可使用 archlinux-java 工具查看。之后执行 make clean 命令,清除旧编译内容再次编译即可。

yylloc 重复定义问题

由于 GCC 工具链较 LineageOS 14.1 版本过高导致的问题,需要修改源代码解决此错误。对应文件位于设备内核代码目录下的 scripts/dts/ 目录中,将 dtc-lexer.lex.c_shipped文件中 YYLTYPE yyloc 这一行代码前添加 extern

此外,也有前辈提到应将 LC_ALL 设置为 C 以清除本地化对编译可能带来的影响。

Jack 服务器启动问题

Jack 服务器是 Android Java 相关源代码的编译工具。提示它不能启动,是因为 JDK 存在配置问题。

修改 /etc/java-8-openjdk/security/java.security 文件,将 jdk.tls.disabledAlgorithms 配置项中的 TLSv1, TLSv1.1 删除。执行命令重启 Jack

1
2
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server

此时重新运行编译命令,编译过程恢复。