记录下这几天折腾编译LineageOS的过程,因为我觉得我容易健忘23333。

我安装的环境是Ubuntu,至少8GB内存,硬盘预留100G左右,因为代码在Github上面,所以梯子要自己搭。

0x00 安装JDK8与所需要的环境

$ sudo apt-get update && sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk3.0-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev openjdk-8-jre openjdk-8-jdk pngcrush schedtool libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev gcc-multilib maven tmux screen w3m ncftp liblz4-tool

0x01 设置repo

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

0x02建立LineageOS目录并同步源码和依赖

$ mkdir ~/LineageOS && cd ~/LineageOS

设置的你Github用户名和邮箱

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"

安装LineageOS的repo

$ repo init -u git://github.com/LineageOS/android.git -b cm-14.1

同步代码

$repo sync -f --force-sync --no-clone-bundle

同步的代码大概有20GB左右,如果你的网速较慢,可能会同步失败,如果失败就再次执行repo sync

同步完成后执行(”device name”为你的机器型号)

$ cd ~/LineageOS 
$ . build/envsetup.sh
$ breakfast "device name"

这步是同步你的手机相关代码,不过完成后需要加入你机器的厂商vendor文件,可以从手机上获取,也可以在这里找到https://github.com/TheMuppets
这里比如我是编译LG D802的ROM,就在上面的地址找到lge的vendor按照下面格式(name=”github路径” path=”本地路径”)把他加入~/LineageOS/.repo/local_manifests/roomservice.xml

<project name="TheMuppets/proprietary_vendor_lge"  path="vendor/lge"  remote="github" revision="cm-14.1" /> 

再次执行repo sync就会把这些文件同步到vendor/lge文件夹中

0x03 开始编译

设定缓存加快编译

$ export USE_CCACHE=1
$ ~/LineageOS/prebuilts/misc/linux-x86/ccache/ccache -M 50G

我之前一直编译错误,Google后发现是JACK默认限制使用的内存太小(来源)官方文档),所以先执行

$ export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
# 如果编译前没有执行上面export命令,编译出错后再执行export,需要用下面命令重启jack
$ out/host/linux-x86/bin/jack-admin kill-server
$ out/host/linux-x86/bin/jack-admin start-server

开始编译

$ . build/envsetup.sh
$ brunch "device name"

如果编译成功,Zip包可以在~/LineageOS/out/target/product/中找到;如果不成功,善用Google。


1月26日更新(https://review.lineageos.org/#/c/161777/)
LineageOS默认取消了ROOT,如果希望编译的ROM自带ROOT,需要加入环境变量

export WITH_SU=true

并将 https://github.com/LineageOS/android_system_extras_su 同步到 system/extras/su