在 Arch Linux 下编译 Android 7
本文以一加 3 设备为例,介绍 LineageOS 14.1 (Android 7.1) 在 Arch Linux 下的编译过程。
环境配置
首先,按照 ArchWiki 相关介绍 安装编译工具:lineageos-devel
、repo
与 JDK
。这里以 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 | ./prebuilts/sdk/tools/jack-admin kill-server |
此时重新运行编译命令,编译过程恢复。