Mystery0の小站

Mystery0の小站

编译LineageOS

2017-04-23

说在前面

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

准备

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

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

编译

安装编译环境

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

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

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

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

PATH=~/bin:$PATH

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

# 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用户名和邮箱

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

然后执行:

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

同步源码到仓库

直接执行以下代码:

repo sync -j4

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

. 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 ,对应的 vendormotorola ,我往清单文件中添加的代码应该是如下这样的:

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

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

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

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

配置缓存

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

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

配置jack

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

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

开始编译

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

source build/envsetup.sh
croot
brunch shamu

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

编译完成

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

cd $OUT

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

到此,教程结束。