记:关于Lineageos最新分支编译的众多隐坑

    技术2024-10-21  25

    0x00 概论

    历时4天,踩了所有的数据大坑,坑了清华源与GitHub近400GB的数据流量,在此表示抱歉……终于总结出来一个现阶段可以实现的编译与完整的同步必坑的文章。

    阅读本文之前,您需要掌握的技能有:

    技能名称技能熟练度技能教程链接Linux操作了解暂无

    0x01前言之可看可不看的换源更新

    因为某些原因,使用的外部源而不是当前的官方源,但是操作与官方源其实并无二致,如果使用官方源的情况下就不需要参考这些东西。可以直接去第二步。

    个人手机是Chiron,所以这里参考了我的手机官方的链接: 官方教程。这里的讲述基本上可以帮助我完成90%以上的工作。

    首先,需要一个靠谱的Linux,我个人比较喜欢Debian,所以下面的所有讲述都是按照Debian进行操作演示。而且全部的操作都定义在code的文件夹下的。

    在确保源正常的情况下,使用APT包管理器进行安装,如果使用的是yum也可以直接使用yum安装

    sudo apt install 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 openjdk-11-jdk

    这里要提一点,官方推荐的openjdk是7.0,但是实际测试发现Debian的openjdk11也是可以的。

    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ./bin/repo sudo chmod a+x ./bin/repo mkdir lineage cd lineage

    并将repo加入环境变量文件~/.profile中

    # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi

    然后就进行repo配置拖取

    repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-17.1

    随后进入./.repo/manifests/default.xml,将

    <remote name="github" fetch=".." review="review.lineageos.org" />

    修改成

    <remote name="github" fetch="https://github.com/" /> <remote name="lineage" fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/" review="review.lineageos.org" />

    <remote name="aosp" fetch="https://android.googlesource.com"

    改成

    <remote name="aosp" fetch="https://aosp.tuna.tsinghua.edu.cn"

    <default revision="..." remote="github

    改成

    <default revision="..." remote="lineage"

    这里需要注意的是,因为清华源的教程更新的较慢,现在lineage-os的repo配置已经更新为更加分层的方式,所以原本教程的manifest.xml里面仅包含着default.xml,进入manifests文件夹才可以找到default.xml.

    随后需要加入REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo"到环境内

    export REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo"

    这样就可以直接进行repo sync拖下库。在100M的宽带下大约需要70GB与4个小时的时间。

    0x02 编译前准备

    个人手机是Chiron,所以这里参考了我的手机官方的链接。https://wiki.lineageos.org/devices/chiron/build。这里的讲述基本上可以帮助我完成90%以上的工作。

    首先,需要一个靠谱的Linux,我个人比较喜欢Debian,所以下面的所有讲述都是按照Debian进行操作演示。而且全部的操作都定义在code的文件夹下的。

    在确保源正常的情况下,使用APT包管理器进行安装,如果使用的是yum也可以直接使用yum安装

    sudo apt install 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 openjdk-11-jdk

    这里要提一点,官方推荐的openjdk是7.0,但是实际测试发现Debian的openjdk11也是可以的。

    curl https://storage.googleapis.com/git-repo-downloads/repo > ./bin/repo sudo chmod a+x ./bin/repo mkdir lineage cd lineage

    并将repo加入环境变量文件~/.profile中

    # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi

    这样就可以直接进行repo sync拖下库。在100M的宽带下大约需要150GB与4个小时的时间。

    进行设备元数据的获取与内核设置文件的读取。

    在保证有手机的情况下,可以使用adb shell进行数据传输,从手机内取得设备元数据,但是需要adb su的权限。在此之前必须要临时关闭selinux,否则可能出现某些奇奇怪怪的错误,还需要安装patchelf,否则会有某些so文件无法传输。至于adb文件,可以自行百度搜索安装方式,此处不再赘述。

    sudo apt install patchelf adb shell setenforce 0 source ./build/envsetup.sh cd ./device/xiaomi/chiron ./extract-files.sh

    强烈建议第一次编译的时候先进行这个操作,之后在进行后面的操作,否则会在后面莫名其妙的报错。

    上面的setenforce是关闭selinux的操作,记得在获取设备元数据之后再将其打开!!!

    随后再回退到code文件夹内,再执行breakfast chiron 进行前菜操作。此操作会创建.repo/local_manifests/内创建一个仓库列表文件,专门存储设备内核设置文件的仓库地址。这个时候如果出现错误,就请进行之前的获取设备元数据的操作哟。做好仓库地址之后,软件会自动化同步,此时如果使用了别的源的话,需要停止自动同步,并将文件内部的remote="lineage"修改为需要的参数。否则,就会到GitHub的原始源上面去下载,而小米的msm8998仓库约有500000的文件,因此数据还是比较大的。

    修改完成后即可以进行同步repo sync ,此时就会将仓库同步。此时已经完成了对源码仓库的构建。

    0x03 设备编译

    此时,基本上所以的源码都已经完成,而下面就是对机器的最终考验:编译!

    从日志上看,编译流程大概是:

    Created with Raphaël 2.2.0 开始编译指令 预准备环境检查 环境软件预编译 基础文件空间编译 应用软件集体编译 设备初始化引导参数生成 根据前面的成果生成镜像文件并签名 并和镜像文件进行打包 清空环境垃圾

    编译指令为croot && brunch chiron其中,官方说法是开放ccache会更好些,但是经过实测,可能是我64GB的内存导致ccache似乎并没有什么用,全部流程走完也只用了6GB不到。

    0x13 可开可不开的CCACHE

    在待编译的终端窗口内输入:

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

    随后直接输入ccache -M 10G 即可,之后可以使用ccache -s查看输出的参数:

    cache directory /code/.ccache primary config /code/.ccache/ccache.conf secondary config (readonly) /usr/local/etc/ccache.conf stats updated Tue Jun 30 22:16:49 2020 cache hit (direct) 48036 cache hit (preprocessed) 547 cache miss 51331 cache hit rate 48.62 % called for link 294 called for preprocessing 1217 unsupported code directive 9 no input file 568 cleanups performed 0 files in cache 153861 cache size 5.4 GB max cache size 50.0 GB

    开完ccache即可进行croot && brunch chiron,进行编译。

    等待一段时间后一般都会提示编译成功,此时你将获得一个zip压缩包,以及一个recovery的镜像可以刷进手机。

    更多

    本文首发自 记:关于Lineageos最新分支编译的众多隐坑,更多文章可进入我的博客详查。

    Processed: 0.009, SQL: 9