编译LineageOS

说在前面

之前一直想自己编译一次LineageOS,同时修改一些源码来自定义,然后在寒假折腾双系统,重新分区(原来的分区小了),然后升级配置之类的。最后在上个月成功编译了自己的第一个版本,编译的过程并不算难,网上很多流程,而且官方也有流程,所以一次编译成功了。只是这第一次编译花费了我3个小时。
虽然说编译成功了说明我的机器编译还是没问题的,但是在编译的这三个小时里,我的机器cpu4个核心全部占用100%,同时8g的内存也是95%+,swap也占了一半多,虽说有一定好处,但是一定程度上妨碍了我学习和工作。
考虑到学习工作问题以及想要提升一下编译速度,所以我在网友的推荐下,去Vultr租了一台高配置服务器专门用于编译(一个月500来不起,只能租)。

准备

虽然是在服务器上,但是如果在自己的电脑上编译过程也是一样的。
需要如下:

  1. 一台运行Ubuntu系统64位的PC(至少8个g的内存同时拥有100g以上的空闲硬盘空间)
  2. 一个好的网络

编译

安装编译环境

我们在电脑上写软件都需要搭建软件的开发环境,同理,编译系统也需要搭建环境,既然是编译源码,我们只需要安装编译需要的软件就行了。

1
$ 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 python

如果编译完成之后想要将包直接通过usb传到手机,可以安装一个adb包,然后通过adb push传到手机上,具体的使用以及安装方法自行google

创建bin目录并且安装repo

1
2
3
$ mkdir -p ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

接下来将~/bin目录配置到PATH环境变量中。
可以直接在终端使用以下代码配置环境变量,但是重开终端后会失效。

1
$ PATH=~/bin:$PATH

如果以后也要编译的话,我们可以将bin目录永久添加到环境变量中。
使用编辑器编辑~/.profile文件,然后在其中添加以下代码。

1
2
3
4
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

然后运行source ~/.profile来使环境变量生效。

初始化LineageOS源码仓库

设置的你Github用户名和邮箱

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

然后执行:

1
2
$ cd ~/LineageOS
$ repo init -u https://github.com/LineageOS/android.git -b cm-14.1

同步源码到仓库

直接执行以下代码:

1
$ repo sync -j4

其中-j4是使用四个线程同步源码的意思。
然后执行:

1
2
$ . build/envsetup.sh
$ breakfast "device name"

这里是同步机型的信息以及内核文件。

添加厂商vendor

LineageOS官方的文档中使用的是一个脚本然后用adb从你的设备中提取vendor,我觉得这种方法太麻烦了,因为不一定是每一台设备都正好装了adb,比如说服务器上这种办法就不行了。
于是,在另外一篇博客教程上我找到了替代的方法,现在应该都是这样做的了。
github项目地址:https://github.com/TheMuppets
仓库中有一个清单的项目,里面提供了所有的清单,你只需要将对应你机型的厂商vendor的代码添加到LineageOS/.repo/local_manifests/roomservice.xml文件中就行了。
例如我的机型是Nexus6,设备代号shamu,对应的vendor是motorola,我往清单文件中添加的代码应该是如下这样的:

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

其中的remote是原项目清单文件中没有的,要添加上,后面的是分支还是版本忘了,反正如果编译LineageOS14.1就填cm-14.1
添加完毕之后再次执行repo sync,此时就开始同步厂商vendor到你的LineageOS项目下了。

现在我们应该是准备好了,开始编译吧

在编译之前我们要进行一些配置。

配置缓存

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

上面的代码是设置编译过程中的缓存为50g,如果你第二次使用这台设备编译的话,你会发现编译的过程快了很多,其实是因为每一次源码更新都之更新了一部分,对于我们编译的旧版本来说,新版本有些地方压根就没有更改,所以我们的旧版本依旧可用。而编译生成的就存储在这个缓存中。这也就是为什么源码只有20g,编译完成之后就有100g左右的原因。

配置jack

1
$ export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8G"

jack好像是jdk1.8的新特性,官方说要加上就加上。

开始编译

配置完成,然后就开始编译吧。

1
2
3
$ source build/envsetup.sh
$ croot
$ brunch shamu

如果编译过程中出现问题,然后从新开始编译的话,请依次执行上面的语句,确保源码完整。
不出意外的话,现在就应该开始编译了,然后你可以选择静静的等待。

编译完成

编译完成之后只需要在命令行界面输入以下代码,就可以自动定位到生成的包的位置,当然,也可以手动cd到对应目录(~/LineageOS/out/target/product/'设备型号'/)。

1
cd $OUT

编译生成的文件名为lineage-‘日期’-14.1-‘设备代号’.zip以及对应的zip.md5sum,还有recovery.img
到此,教程结束。

坚持原创技术分享,您的支持将鼓励我继续创作!