0x01 介绍
在 Ubuntu 18.04 下编译 LineageOS/CM 等 AOSP 源码可能会踩到很多坑。下面就跟我一起来配置避免入坑吧。Ubuntu 18.04 LTS 请选择 64 位的。
硬件设施最低要求
CPU: Core i3 530 及以上的 CPU(推荐 Intel Core i7 6 代以上或 AMD Ryzen 系列 CPU)
RAM: 8GB 及以上的 RAM(推荐 16GB 及以上)
HDD: HDD 120GB 及以上剩余存储空间(推荐 SSD 256GB 及以上)
当然 CPU 差点没事,只不过是浪费时间与电费而已。源码所在目录最低剩余空间不要小于 100GB。
操作系统
Ubuntu 18.04 64bit
0x02 安装依赖组件
主要组件:
sudo apt install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
额外组件,可能会使用到:
sudo apt install imagemagick libbz2-dev libssl-dev lzma ncftp bash-completion
0x03 安装 JDK
Open JDK 8 安装:
CM 14.1 及 LineageOS 14.1 以上,需要安装 JDK 8,直接安装即可,不要添加 PPA 源。
使用如下命令:
sudo apt install -y openjdk-8-jdk
CM 14 以下,需添加 JDK 7 的 PPA 源:
由于 Ubuntu 官方已经移除了对 Open JDK 7 的支持,所以要使用第三方的仓库。这真是大坑。
注:Android 7.1+ 已经支持 Open JDK 8,不要安装 Open JDK 7。
sudo apt install software-properties-common sudo add-apt-repository ppa:openjdk-r/ppa sudo apt update sudo apt install -y openjdk-7-jdk
注:第一条命令导入 PPA 时,按回车键继续导入即可。
安装完毕后不需要设置 JAVA 环境变量,是直接可以用的。
0x04 设置 repo
Google 可能无法下载。建议爬墙访问。PS:如果有 TZ 需要,可以找我哦(发邮件到 admin@htcp.net)。
mkdir -p ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo cat >> ~/.bashrc <关于清华的源:
无力吐槽清华源,老是出问题。当然您可以自己试试看使用这个,总有好的时候不是么 :)。
0x05 设置 git
1. 设置 git 用户名和邮箱
示例如下:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
双引号中的 "you@example.com" 填写您的 github 所使用的邮箱。注意格式,不要把双引号去掉。
双引号中的 "Your Name" 填写您的 github 用户名,不要把双引号去掉。2. 生成 ssh 并添加到 github:
您可以参考官方的文档:
https://help.github.com/articles/connecting-to-github-with-ssh/
如果您不将 ssh 添加到 github 的话,您可能会遭遇下载受限,从而导致接下来的同步源码失败。
0x06 下载源码
注:千万不要使用中文路径!千万不要包含空格或一些特殊字符!不要将使用 Windows 的坏习惯带入到 Linux 中来!
6.1 新建源码目录:
(假如您想使用 Lineage 14.1,则可将 lineage-15.1 改为 cm-14.1)
mkdir -p ~/android/los/lineage-15.1
cd ~/android/los/lineage-15.1
6.2 初始化源码:
(假如想使用 Lineage 14.1,则将 lineage-15.1 改为 cm-14.1)
repo init -u https://github.com/LineageOS/android.git -b lineage-15.1Enable color display in this user account (y/N)? y
6.3 正式同步源码:
<1> 使用如下命令:
在过程中可能会提示 clone 失败的信息,可以添加参数--no-clone-bundle
到命令末尾。repo sync -j4 -c --no-clone-bundle由于国内环境不太好。网络比较差的同学,可以试试自动化 repo 同步脚本。
复制粘贴如下代码到终端中,回车将会保存为 repo.sh。注意将源码的路径改成您设置的源码路径。
cat > repo.sh <假如您在服务器上编译,建议使用 screen 开启一个新的窗口,避免 ssh 掉线后导致同步终止。
假如 ssh 断掉,使用screen -r 窗口名
即可恢复这个窗口。在 ssh 断掉的时候,这个窗口始终会保持程序的运行。具体的使用方法您可以使用 Google 搜索看一下文档。安装 screen:
sudo apt install screen -y开启窗口:
screen -S sync<2> 然后执行这个脚本:
chmod a+x repo.sh bash repo.sh网速很慢的话(10M 带宽以下),估计要下 1 天左右。
当同步源码接近完毕后,会提示 Syncing work tree,直到同步完毕后会自动退出这个脚本。
0x07 编译源码
7.1 设置编译机型的 device tree、kernel 和私有文件。在这里以 shamu(Nexus 6)为例。其他机型请参照对应机型的相关设备源码来设置。
以下仅供参考,您需要根据设备的具体依赖自行修改:
(请将这里的 lineage-15.1 修改为您自己使用的源码目录)
mkdir ~/android/los/lineage-15.1/.repo/local_manifests
vim shamu.xml
Lineage-14.1 可能要在 上面再加一行(Lineage15.1+ 不要这个,会冲突并报错):
7.2 再次 repo sync。
repo sync7.3 设置 ccache 提高编译效率。
sudo apt install ccache -y
echo export USE_CCACHE=1 >> ~/.bashrc prebuilts/misc/linux-x86/ccache/ccache -M 50G7.4 解决 jack 内存不足导致编译失败的问题
7.4.1 允许 jack 使用更多的内存
echo 'export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"' >> ~/.bashrc source ~/.bashrc可以将这个添加进
~/.bashrc
末尾最后一行中,然后 source 一下。否则每次打开终端时都要执行一次。7.4.2 重启 jack:
./out/host/linux-x86/bin/jack-admin kill-server ./out/host/linux-x86/bin/jack-admin start-server7.5 开启自带的 Root 权限
默认不带 Root,可通过输入如下命令开启(每次打开终端时执行一次,或者将这个加入到
~/.bashrc
中并执行 source):export WITH_SU=true7.6 设置编译变量
. ./build/envsetup.sh7.7 开始编译
使用如下命令,会将编译过程中的所有屏幕输出保存至 build.log 文件中,方便排错。假如是其他设备,请修改对应的 brunch 机型。
croot brunch lineage_clark-userdebug 2>&1 | tee build.log假如只需要编译 recovery,则:
make recoveryimage -j8 2>&1 | tee build.log提示:j 后面的是线程数,一般是 CPU 核心数的 2 倍。不要设置的太大,否则会适得其反并且炸内存。
0x08 编译完成
编译完成后,会在 源码目录/
out/target/product/您的机型
文件夹生成对应的刷机包、镜像和一些编译出来的文件。假如在编译过程中遇到报错,尝试 Google 对应的报错内容,不建议使用国内搜索引擎。
每次重新编译,可执行清理步骤:
make clean然后重新执行 0x07 分段中的第 7.6 和 7.7 步。
0x09 其他
1. 解决 flex 报错问题:
echo "export LANG=C" >> ~/.bashrc source ~/.bashrc文章最后修订于:2018 年 06 月 20 日 18:34 CST。
能帮看下这是怎么回事吗
CC kernel/fork.o
In file included from ../../../../../../kernel/xiaomi/msm8953/kernel/fork.c:42:
../../../../../../kernel/xiaomi/msm8953/include/linux/syscalls.h:195:18: warning: ‘sys_set_tid_address’ alias between functions of incompatible types ‘long int(int *)’ and ‘long int(long int)’ [-Wattribute-alias]
error, forbidden warning: syscalls.h:195
/media/lxl/Android/LOS/kernel/xiaomi/msm8953/scripts/Makefile.build:257: recipe for target ‘kernel/fork.o’ failed
make[2]: *** [kernel/fork.o] Error 1
/media/lxl/Android/LOS/kernel/xiaomi/msm8953/Makefile:969: recipe for target ‘kernel’ failed
make[1]: *** [kernel] Error 2
make[1]: 离开目录“/media/lxl/Android/LOS/out/target/product/tiffany/obj/KERNEL_OBJ”
Makefile:145: recipe for target ‘sub-make’ failed
make: *** [sub-make] Error 2
make: Leaving directory ‘/media/lxl/Android/LOS/kernel/xiaomi/msm8953’
[ 8% 8173/99056] target arm C: lib7z_32 <= external/p7zip/C/HuffEnc.c
ninja: build stopped: subcommand failed.
22:38:08 ninja failed with: exit status 1
#### failed to build some targets (22:22 (mm:ss)) ####
硬件设施最低要求
RAM: 8GB 及以上的 CPU(推荐 16GB 及以上)