作者通过自己踩坑发现网上并没有一份很完美的编译lineageOS的教程,作者结合官网和踩坑之后,出一份详细的编译记录,帮助各个苦苦寻找好用的lineage编译文章。遇到问题一定要看清楚文字各位亲们。
编译主机 ubuntu 20.04 真的别用其他的版本,坑太多了。如果你的ubuntu是其他版本,建议自己去lineage官网查看安装需要的库。
设备是 flame,编译lineageOS18版本。其他版本也可以参考本文章,反正写的够详细,能踩得坑都记录下来了。
一定要记住platform-tools的安装目录,作者安装在了 ~/android/platform-tools 目录中
然后将platform-tools添加到环境变量中,作者喜欢用vim去编辑
然后将下面的内容添加到~/.profile的最下面,这里记得改成你的platform-tools的路径
添加成功之后,刷新环境,然后看看adb有没有成功添加到环境变量中,如果没有说明上一步的路径有问题
这里的软件包容易踩坑,官网的给的软件包并不合适,所以作者用的下面的能够成功去编译
18的话用OpenJDK 11,直接安装就好,安装好了之后运行 java --version 检查有没有安装成功
python可以直接将系统的python3软连接成python就可以了
创建项目的根目录,准备拉取指定的源码了。~/bin为了放repo,~/android/lineage放安卓源码
进入 ~/bin 目录中
然后将repo目录添加到环境变量中
将下面的内容添加到上面的文件中的最下面,注意要对应自己的repo所在的目录中
然后运行 source ~/.profile 刷新环境变量
随便填
开启缓存加快同步代码的速度,如果你的硬盘足够大,超过500G,ccache指定的大小可以是100G,如果没有就指定50G
执行下面的命令是下载源码,你可以根据当前ubuntu的CPU核心数量去指定线程数量,一般是核心数量的2倍。作者的核心数量是10,所以指定20线程。注意,同步过程中有报错是正常的,因为官方会限制短期的请求数量,不用管继续等就好了。
这条命令执行完毕之后,记得再执行 repo status 查看当前的同步状态,如果出现nothing to commit这种字眼说明同步完成了,可以不用看下面的注意了。同步完成之后,就是源代码拉去完毕了,可以进行下一个步骤了。
注意, 没有出现上面提到的字眼就是失败了,失败的话建议执行 repo sync 命令去补全,注意最好不要指定多线程。
进入到安卓源码项目的根目录,然后运行下面的命令用来下载设备的特定配置和内核。这里的flame是我的设备代号,其他的设备代号需要自己查然后把flame替换成自己的设备代号
第一次运行breakfast 命令,会出现下面的错误,我觉得这里是最大的坑
关键的字眼就是 "vendor/google/flame/flame-vendor.mk" does not exist. 这个内容,原因是这个时候设备的特定内容还没有被拉取到当前的项目中,所以构建设备镜像的时候出现这个错误。下面是解决方案
官网提供了两种解决方式,但是我觉得官网提供的两种方式都不方便,所以这里用作者自己摸索出来的解决方案,因为操作起来是真的简单
首先创建 ~/android/system_dump/ 目录然后进入
因为这个问题出现的原因是当前的项目中缺少了指定设备的特定内容,所以不给我们构建,那么我们可以自己去提取现成的特定内容
这个时候需要你进入到 628K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9K9h3&6W2j5h3N6W2i4K6u0V1j5i4u0U0K9r3W2$3k6g2)9J5k6i4c8A6L8i4y4U0K9s2g2E0K9g2)9J5k6h3&6W2N6q4)9J5c8R3`.`. 这个网站中,然后去找到自己对应型号对应版本的包下载下来,注意他一个型号一个版本可能会有多个包,随便下载一个就可以,下载好之后把里面的 payload.bin 文件解压出来。
windows电脑使用 https://pan.quark.cn/s/bf6a4ce548aa 工具,首先把payload.bin放进这个工具的目录中然后双击 打开CMD命令行.bat 文件就可以了,然后按 a 全部提取出来。全部提取出来的镜像保存在当前的目录的 img 目录中
linux电脑使用 https://pan.quark.cn/s/318bd8bf5fe1 工具,直接 payload-dumper-go payload.bin
执行就好。
然后把提取出来的镜像全部拷贝到 ~/android/system_dump/ 目录中,对于lineageOS18系统,需要挂载下面这些镜像,其他的可以参考自己解包内容是否含有这些镜像,然后去挂载。高版本会有更多的镜像,作者也没办法去具体判断需要挂在哪些,但是作者能够给到一个技巧,就是如果这里你挂载的不够,那么在 编译 部分会出现文件找不到的问题,如果你确认了报错的文件在项目中没有,那说明这里少挂载了。
下一步是进入到自己的设备的指定目录中,然后执行下面的命令
运行这个命令的时候也会出现错误,原因是./extract-files.sh脚本中记录的文件路径有问题,需要自己修改,按照错误提示的文件,然后去找到文件的正确路径修改好就可以了,我是用find命令找的错误路径的文件,改好之后运行上面的内容就能够成功提取到了。
编译的过程中可能会出现中断的操作,虽然有错误但是大概率是交换分区不够大导致的,建议一开始就修改交换分区,大小就改成内存大小,下面是修改交换分区的命令
为了每次系统重启后自动挂载交换分区,需要执行下面的命令
# 在最下面一行加上 /swapfile none swap sw 0 0 内容
然后运行 swapon --show 去验证交换分区大小,看到是自己指定的大小就可以了
到这个时间点,设备的特定内容已经提取到当前的项目中了,然后可以去准备编译了,下面是作者自己的编译方式,因为作者需要用到一个OTA的包,并且最推荐使用这种方式。
注意,作者这里编译的是user版本的镜像,如果不考虑什么版本,在运行 source build/envsetup.sh 之后可以直接运行 brunch flame 命令,这样他会自己直接去编译userdebug版本的镜像。
全速编译完成之后,再执行 make otapackage 命令生成OTA的包,生成的OTA的包和在前面的网站下载的包的格式一摸一样,这个作为作者的系统刷机包
你可以使用其他的方式去完成刷机,作者比较喜欢下面的方式去完成刷机。