说在前面
之前一直想自己编译一次LineageOS,同时修改一些源码来自定义,然后在寒假折腾双系统,重新分区(原来的分区小了),然后升级配置之类的。最后在上个月成功编译了自己的第一个版本,编译的过程并不算难,网上很多流程,而且官方也有流程,所以一次编译成功了。只是这第一次编译花费了我3个小时。
虽然说编译成功了说明我的机器编译还是没问题的,但是在编译的这三个小时里,我的机器cpu4个核心全部占用100%,同时8g的内存也是95%+,swap也占了一半多,虽说有一定好处,但是一定程度上妨碍了我学习和工作。
考虑到学习工作问题以及想要提升一下编译速度,所以我在网友的推荐下,去Vultr租了一台高配置服务器专门用于编译(一个月500来不起,只能租)。
准备
虽然是在服务器上,但是如果在自己的电脑上编译过程也是一样的。
需要如下:
- 一台运行Ubuntu系统64位的PC(至少8个g的内存同时拥有100g以上的空闲硬盘空间)
- 一个好的网络
编译
安装编译环境
我们在电脑上写软件都需要搭建软件的开发环境,同理,编译系统也需要搭建环境,既然是编译源码,我们只需要安装编译需要的软件就行了。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 | mkdir -p ~/bin |
接下来将~/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 | export USE_CCACHE=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
。
到此,教程结束。