自己编译 LineageOS

为2014年的平板 Sumsung Galaxy Tab S sm-t700 编译一个Lineage OS,Lineage 前身是 CyanogenMod,说来有趣,我就是通过这个类原生的安卓系统开发团队认识的Cyanogen (氰)这个单词。

本文是 LineageOS 官方文档的操作记录。

我选择在 GCP 上编译,灵活一些,正好 GCP 的试用金还有一些没用完。下面的操作步骤从服务器设置到固件安装。

#服务器设置

4V CPU,16 GB RAM,210 GB SSD,Debian 10(后面换成了 Debian 9),本来想选用针对计算用的 C2,但是选了好多个地点,都提示我没有足够的 CPU 资源。

#准备

准备以及编译中,需要一些库,使用下面的命令安装,适用于 Debian 10(也适用于 Debian 9)。

sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove && sudo apt autoclean

sudo apt install wget unzip bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev libwxgtk3.0-dev -y
#安装安卓 platform-tools
cd ~
mkdir prep && cd prep

wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip

unzip platform-tools-latest-linux.zip -d ~

nano ~/.profile

然后将下列代码放到最下面

if [ -d "$HOME/platform-tools" ] ; then
    PATH="$HOME/platform-tools:$PATH"
fi

保存,退出,然后执行

source ~/.profile
#配置 ccache 缓存加速

如果你用的不是 bash 而是 zsh 或其他,自行修改对应的配置文件。

nano ~/.bashrc

添加下面两行指令

export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

保存退出后,使其生效并设置 ccache 占用空间的最大值。

source ~/.bashrc
ccache -M 50G

#获取源码

先新建一些文件夹,存放源码

mkdir -p ~/bin
mkdir -p ~/android/lineage

bin 文件夹保存一些用到的可执行文件,lineage文件夹保存源码。下面获取一个叫 repo的可执行文件

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

配置 git,以前配置过就继续

git config --global user.email "acytoo@gmail.com"
git config --global user.name "Acytoo"

初始化仓库,拉取你想要的版本。

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

在初始化仓库时,如果repopython错误,可以这样解决:

sudo ln -s /usr/bin/python3 /usr/bin/python

git-repo已经支持 python3,详细情况查看其文档。

一切正常后,同步源码,我同步的是 Lineage14.1,大概 50G。

repo sync

同步源码可能花费一定长的时间,站起来活动一下。一般 VPS 的速度,不会花费很久,但是如果你的确花费了太长时间,可以使用 screen命令。

然后获取设备相关的驱动等。

source build/envsetup.sh
breakfast klimtwifi

klimtwifi 是我的设备开发代号。

然后发现,还需要获取设备驱动,从已经运行 LineageOS 的设备上获取,或者从安装包中获取……

在 VPS 上下载 LineageOS 刷机包,然后按照官方教程获取 proprietary blobs提取到需要的文件。感谢 LineageOS 的保姆级教程,但是其中第一个 extract-files.sh 脚本无法执行,手动把里面的export执行后,调用exynos5420-common里面的就好。

终于只剩下编译了。

croot
brunch klimtwifi

#编译以及出错

 

然后编译出错了。提示没有安装 Java,要 1.8 版本……前面不是说自带 Java 吗?重看一遍,原来是 LineageOS 16.0-18.1 自带。安装 openjdk-8-jdk

Debian 10 因为安全原因,不提供 OpenJDK 8,按照这个帖子,安装替代:

wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -

sudo apt update && sudo apt install software-properties-common

sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/

sudo apt update && sudo apt install adoptopenjdk-8-hotspot

 

然后又出错了。

ninja: error: 'vendor/samsung/exynos5420-common/proprietary/vendor/lib/libaptX-1.0.0-rel-Android21-ARMv7A.so', needed by '/home/acytoo/android/lineage/out/target/product/klimtwifi/system/vendor/lib/libaptX-1.0.0-rel-Android21-ARMv7A.so', missing and no known rule to make it

看起来像是刚刚提取的文件有缺失,先试试个笨方法,上网下载这个文件,看看能不能通过(我真是太聪明了),下载地址在一个 XDA 帖子中。

把下载的压缩文件里面的3个 so 文件放到提示缺失的文件夹中,然后,我本机桌面环境崩溃了…… 重启 graphical.target 解决这个意外。好像是 ibusgnome 之间出了问题。不管了,继续。

 

重连 VPS,编译。这次编译到 0% 的时候出了问题。查看打印信息,发现是 python 的版本问题。原来是这样:虽然新版本已经切换到 python3,但是这个 17年就停止支持的设备编译脚本依旧是 python2。安装python2

 

接下来是 Ninja 报错

Fatal Error: Unable to find package java.lang in classpath or bootclasspath

看起来是 JDK 的问题。真棘手,Ninja 这个构造系统我完全没用过。先 Java 一个 hello word 确定 Java 正常,确定是 Ninja 问题。然后发现,上面安装的 AdoptOpenJDK 的 JAVA_HOME 变量与当前的不一样,export一下。

export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64

发现又报错了,输出 JAVA_HOME,又变回 OpenJDK 的了,看来是执行时设置的 JAVA_HOME?那就创建一个链接文件夹。

sudo ln -s /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64 /usr/lib/jvm/java-8-openjdk-amd64

还是报错,类似的 Java 错误

晚上 ssh 到服务器真卡,先休息了。

 

几天后更新:换到 Debian 9 试试,先安装这个 openjdk-8-jdk,然后安装上面说的前置。在同步仓库时,发现需要安装 python3.6。Debian 9 没有 python3.6,所以需要手动安装。本地 make python 非常耗时,我这边花了半个小时左右。建议开一个 screen 安装。

mkdir -p ~/tmp && cd ~/tmp

wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz

tar xvf Python-3.6.13.tgz

cd Python-3.6.13

./configure --enable-optimizations --enable-shared\

make -j8

sudo make altinstall

如果你执行 python3.6 报下面的错误

python3.6: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory

那么,把解压文件夹中相应的 so 文件复制到 /usr/lib/中就可以解决问题。

sudo cp libpython3.6m.so.1.0 /usr/lib

用 Debian 9 配合 OpenJDK-8-jdk,编译没有问题,成功编译了刷机包。计算机性能一定要强,不然跑太久了。ssh到服务器的话,最好开一个 screen。

然后想下载到本地刷机,发现直连下载耗时比编译还要久,有趣。

聪明的你已经发现,这个 3 月 30 号开篇的“日记”终于在 4 月 3 号开始编译,然后在 4 月 4 号凌晨完成编译。想刷机看看无奈直接下载速度太慢。本来想着用脚本上传到 Google Drive 或者传到速度较快的香港服务器再传回来。但是很晚了,明天还要搬砖,今天就到这里吧。

 

搬了一天的砖,回来继续。

发现 GCP 自带一个叫 gcloud compute 的命令,可以很方便的在属于自己的,同一个项目的,不同的实例之间传递数据。于是我把刷机包转移到香港的服务器上了,我这里连接香港真快啊,很快就下载好了。

马上把卡刷包传到平板,备份,双清,刷机,重启,截屏。一气呵成。

嗯,一切正如预期的那样。下一步打算试试 Team Exynos5420 的内容,看看能不能编译个高版本的系统。