为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
在初始化仓库时,如果repo
报 python
错误,可以这样解决:
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
解决这个意外。好像是 ibus
和 gnome
之间出了问题。不管了,继续。
重连 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 的内容,看看能不能编译个高版本的系统。