首页
社区
课程
招聘
[原创] LineageOS-21 编译大战!—— 一个萌新的心路历程 ☆
发表于: 2025-4-18 15:34 19942

[原创] LineageOS-21 编译大战!—— 一个萌新的心路历程 ☆

2025-4-18 15:34
19942

kira~☆ 本文将同步闪耀于 CSDN & 看雪论坛,请多指教!

最近闲得快要长蘑菇了,于是淘来一台二手 LG G8 ThinQ (代号是 alphaplus 哦~),打算让它成为我的新玩具... 啊不,是备用机!然后捏,一个大胆的想法突然降临:何不亲手为它打造一套 LineageOS 呢?
说干就干,冒险的帷幕,就此拉开!(•̀ㅂ•́)و✧

首先,得把我们的 Linux 小窝打造成适合编译魔法的环境。需要安装一些神秘的咒语。

本教程基于 Archlinux 魅魔,Ubuntu 小姐姐部分如果有误,请温柔地指出,我会立刻修正哒~ (没有特别标注的话,就是两个系统通用的咒语哦!)

!!!注意注意!!!编译的时候千万不要用 root 大人的权限,会引来不必要的麻烦哦!Σ( ° △ °|||)

For Archlinux 小伙伴:

For Ubuntu 小伙伴:

诶嘿嘿~ 想要让之后的编译快到飞起吗?那就快来召唤 Ccache 酱 这位时间魔法师吧!她能记住你编译过的东西,下次再编译同样的内容时,就能瞬间完成,大大缩短等待时间哦!(ノ´ヮ´)ノ*:・゚✧

要召唤 Ccache 酱,你需要咏唱以下咒语:

然后,记得把这两行神秘代码也添加到你的 ~/.bashrc (或者 ~/.zshrc,看你用哪个 Shell 啦) 文件里,这样每次打开终端,Ccache 酱就会自动准备好为你加速啦!

接下来,要告诉 Ccache 酱她能使用多少硬盘空间来存放她的编译产物。念这个咒语:

这里的 30G 就代表 Ccache 酱可以征用 30GB 的硬盘空间哦。这个咒语只需要成功咏唱 一次 就好~

Ccache 酱需要多大空间呢?

还有个小秘技!Ccache 酱的压缩魔法!

你可以选择开启 Ccache 酱的压缩模式!虽然这可能会让她的编译速度稍微慢一丢丢,但好处是能在同样的空间里塞下更多的缓存文件!更省空间了耶!

要开启压缩模式,就念这个咒语 (同样,只需一次):

小贴士: 如果开启了压缩模式,之前设定的缓存大小就可以适当调小一点啦 (比如只为一个设备编译的话,大概 20GB 可能就够用了~)

好啦!有了 Ccache 酱的加持,我们的编译大业就能更加顺畅啦!继续前进!➡️

就在咱的用户目录下建一个新家吧~

然后,瞬移进去!

我们选择清华大学的镜像作为主要传送点。(当然 BFSU 镜像在 LineageOS-21.0 时也能成功抵达终点,但 LineageOS-22.1 遇到了 VNDK33 无法召唤的问题,22.2 又遇到了奇怪的编译错误... 可能是版本更新太快,同步还没跟上?)

简单对比一下两大传送门 (截至我上次观察时... 诶~我上次观察是啥时候来着?):

结论: 清华更稳妥全面,但可能慢;BFSU 快但可能有坑。大家可以根据自己的网络情况和追求选择信仰!(当然,直连官方 GitHub/GoogleSource 的都是真·勇士!这件事实在是泰裤辣!)

这里以 BFSU 源为例 (因为它在我的 LineageOS-21 冒险中成功了嘛):

小小解说:

第一次进行大规模召唤 (拉取操作) 前,需要先跟 Git 大神报上名号:

先悄悄修改一下传送契约 .repo/manifests/default.xml

把这段:

改成这样 (具体修改可以参考镜像站点的帮助文档):

然后,启动召唤法阵!

--no-clone-bundle 这个小咒语是为了防止某些调皮的仓库 (比如 Lineage_framework_base) 在同步时闹别扭,出现 bundle 错误。

召唤途中可能会遇到小波折,不要慌!按下 Ctrl + C 中断仪式,然后重新念咒:

如果还不行,试试更强硬的姿态:

但有时,会遇到极其可怕的恶性错误:

这是我在尝试召唤 LineageOS-22.1 时遇到的噩梦...

遇到这种级别的错误,基本就是绝境了... (偷偷用 git clone 塞东西到 .repo/project 里面?想都别想!repo 酱会用小皮鞭严厉惩罚每一个不听话的宝宝;中途更换代码源到 googlesourcegithub?她同样会惩罚那些三心二意的宝宝,必须对选择的源保持忠贞不渝!)

实在没办法了,可以试试这些最后的挣扎:

强制对问题仓库进行灵魂同步:

物理超度损坏的仓库,然后重新召唤:

如果以上都不行... 终极奥义:删库重来!

然后回到 Step 4,重新配置仓库 (repo init)。这次... 也许该考虑放弃国内镜像,直接拥抱官方源了 (虽然可能要经历漫长的等待... 大约 200GB 的数据量呢)。

之后,就是... 泡杯茶,看几集番,或者睡一觉吧... 等待法阵完成它的工作... 直到所有星辰归位... ✨

请务必查清你家设备的代号!可以去官方文档或者XDA这样的论坛找找看。

.repo 目录下创建一个叫做 local_manifests 的小文件夹。在里面新建一个文件,名字可以叫 <你的手机厂商>_manifest.xml (比如 lge_manifest.xml)。然后,参考下面的模板抄写咒语:

那么,这些神秘力量的地址在哪里找呢?

很简单!去 GitHub 这个大宝库里搜索关键词,比如:

很多机型的这些宝贝都可以在 TheMuppets (木偶大佬!) 的 GitHub 仓库下找到 (但不一定是最新的哦)。想要最新鲜的?直接在 GitHub 搜索框里搜,像这样:

点进搜索结果,找到看起来最靠谱的仓库(数量不多的话也可以依次查看,顺便看看作者有没有其他的库),然后去看看它的 Branches (分支) 页面:

选择与你的 LineageOS 版本 (比如 lineage-21) 相对应的那个分支,把仓库地址和分支名填到我们刚才的 .xml 文件里。

保存好 .xml 文件后,再次执行召唤仪式!

现在呢...

呐~ 你吃早餐了吗?要不要和可爱的 Android 酱共进早餐呢?

诶?同意了嘛?那... 把你手机的代号作为用餐券交给 Android 酱吧~

欸嘿,别忘了问 Android 酱的联系方式哦~ (虽然她可能不会直接告诉你)

嗯... 果然,傲娇的 Android 酱没有直接回应... 但没关系,我们可以用刚才的“用餐券”来正式邀请她共进早餐啦!

如果是第一次约 Android 酱吃早餐,她可能会需要从 GitHub 上拉取一些专属于你设备的材料 (device, hardware, kernel 等)。这时候可能需要你的魔法上网工具助力!如果开了代理(全局)还是卡住不动,就按 Ctrl + C 强制取消,然后重新邀请她吃早餐 (多试几次可能就好了)。

早餐过后,就是激动人心的早午餐 (Brunch) 时间!这才是正餐!

接下来,就是漫长而又悲壮的炼成时间... 期间你可能会经历:

不过不用太担心!即使编译中途电脑不幸牺牲,直接强制重启后,回到源码目录,重新执行 source build/envsetup.shbrunch <你的设备代号>,编译大法师会从上次中断的地方继续施法 (有点像断点续传,超神奇!)。

坚持住!胜利的 BGM 终将奏响!—— 编译成功!


我们亲手炼成的 ROM 包就静静地躺在 ./out/target/product/<你的设备代号>/ 这个目录下。


好啦!快去把这份带着你心血和汗水的 ROM 刷入你的爱机吧!享受这份亲手创造的喜悦!(≧∇≦)

# 先来个全身心的大扫除和升级!
sudo pacman -Syyu
# 然后召唤我们需要的工具伙伴们!
sudo pacman -S --needed base-devel git jdk17-openjdk python python-pip ccache \
             libxml2 ncurses zlib openssl pngcrush schedtool imagemagick \
             bc android-tools rsync wget unzip zip p7zip curl \
             libxslt lz4 patchelf coreutils findutils gawk grep sed git git-lfs
# 先来个全身心的大扫除和升级!
sudo pacman -Syyu
# 然后召唤我们需要的工具伙伴们!
sudo pacman -S --needed base-devel git jdk17-openjdk python python-pip ccache \
             libxml2 ncurses zlib openssl pngcrush schedtool imagemagick \
             bc android-tools rsync wget unzip zip p7zip curl \
             libxslt lz4 patchelf coreutils findutils gawk grep sed git git-lfs
# 同样,先给系统梳梳毛,升升级~
sudo apt update && sudo apt upgrade
# 召唤 Ubuntu 平台的工具伙伴们!
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libdw-dev libelf-dev liblz4-tool lz4 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev libwxgtk3.0-dev lib32ncurses5-dev libncurses5 libncurses5-dev
# 同样,先给系统梳梳毛,升升级~
sudo apt update && sudo apt upgrade
# 召唤 Ubuntu 平台的工具伙伴们!
sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libdw-dev libelf-dev liblz4-tool lz4 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev libwxgtk3.0-dev lib32ncurses5-dev libncurses5 libncurses5-dev
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
# 这里以分配 30GB 为例,可以根据自己的硬盘大小调整哦
ccache -M 30G
# 这里以分配 30GB 为例,可以根据自己的硬盘大小调整哦
ccache -M 30G
ccache -o compression=true
ccache -o compression=true
mkdir ~/LineageOS
mkdir ~/LineageOS
cd LineageOS
cd LineageOS
mkdir ~/bin
# 温馨提示:这条命令是把 ~/bin 目录暂时加入到当前 Shell 的寻路列表 (PATH) 里,
# 新开终端或者重启电脑后就失效啦。想让它一直有效?把它加到 ~/.bashrc 或 ~/.zshrc 文件里吧!
PATH=~/bin:$PATH
# 从清华大学的神秘宝库里请来 repo 酱!
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
# 赋予 repo 酱执行魔法的力量!
chmod a+x ~/bin/repo
mkdir ~/bin
# 温馨提示:这条命令是把 ~/bin 目录暂时加入到当前 Shell 的寻路列表 (PATH) 里,
# 新开终端或者重启电脑后就失效啦。想让它一直有效?把它加到 ~/.bashrc 或 ~/.zshrc 文件里吧!
PATH=~/bin:$PATH
# 从清华大学的神秘宝库里请来 repo 酱!
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
# 赋予 repo 酱执行魔法的力量!
chmod a+x ~/bin/repo
# 赋予 repo 酱执行魔法的力量 (如果前面做了就不用重复啦)
# chmod a+x ~/bin/repo
# 初始化我们的冒险地图!指定 BFSU 为传送起点,目标是 lineage-21.0 分支,并开启 LFS 支持!
repo init -u https://mirrors.bfsu.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-21.0 --git-lfs
# 赋予 repo 酱执行魔法的力量 (如果前面做了就不用重复啦)
# chmod a+x ~/bin/repo
# 初始化我们的冒险地图!指定 BFSU 为传送起点,目标是 lineage-21.0 分支,并开启 LFS 支持!
repo init -u https://mirrors.bfsu.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-21.0 --git-lfs
git config --global user.name "<你的昵称或者名字啦,记得去掉尖括号哦>"
git config --global user.email "<你的邮箱地址,也去掉尖括号哈>"
git config --global user.name "<你的昵称或者名字啦,记得去掉尖括号哦>"
git config --global user.email "<你的邮箱地址,也去掉尖括号哈>"
<remote  name="github"
         fetch="814K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1j5`." />
 
<remote  name="private"
         fetch="ssh://git@github.com" />
 
<remote  name="aosp"
         fetch="897K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3b7f1!0e0f1l9`.`."
         review="android-review.googlesource.com"
         revision="refs/tags/android-14.0.0_r67" />
 
<default revision="refs/heads/lineage-21.0"
         remote="github"
         sync-c="true"
         sync-j="4" />
<remote  name="github"
         fetch="814K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1j5`." />
 
<remote  name="private"
         fetch="ssh://git@github.com" />
 
<remote  name="aosp"
         fetch="897K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3b7f1!0e0f1l9`.`."
         review="android-review.googlesource.com"
         revision="refs/tags/android-14.0.0_r67" />
 
<default revision="refs/heads/lineage-21.0"
         remote="github"
         sync-c="true"
         sync-j="4" />
<remote  name="github"
         fetch="10aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1j5`." />
<!-- 新增一个指向 LineageOS 镜像的 remote -->
<remote  name="lineage"
         fetch="670K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3L8r3W2F1k6h3q4Y4k6f1!0e0i4K6u0r3"
         review="review.lineageos.org" />
<!-- ... 其他 remote ... -->
<remote  name="aosp"
         fetch="ed6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3b7f1!0e0f1l9`.`."
         review="android-review.googlesource.com"
         revision="refs/tags/android-14.0.0_r67" />
 
<!-- 把 default 的 remote 指向我们新增的 'lineage',并可以调大 sync-j 的值(比如12)来加速召唤 -->
<default revision="refs/heads/lineage-21.0"
         remote="lineage"
         sync-c="true"
         sync-j="12" />
<remote  name="github"
         fetch="10aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1j5`." />
<!-- 新增一个指向 LineageOS 镜像的 remote -->
<remote  name="lineage"
         fetch="670K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3L8r3W2F1k6h3q4Y4k6f1!0e0i4K6u0r3"
         review="review.lineageos.org" />
<!-- ... 其他 remote ... -->
<remote  name="aosp"
         fetch="ed6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3b7f1!0e0f1l9`.`."
         review="android-review.googlesource.com"
         revision="refs/tags/android-14.0.0_r67" />

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2025-4-18 15:40 被OrionisLi编辑 ,原因: 修改错误的格式
收藏
免费 5
支持
分享
最新回复 (8)
雪    币: 2720
活跃值: (4315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
神人
2025-4-21 10:29
1
雪    币: 3407
活跃值: (2406)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这风格。。。 好BT,好喜欢
2025-4-21 22:47
0
雪    币: 10892
活跃值: (5288)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享,收藏备用
2025-4-22 10:36
0
雪    币: 28
活跃值: (919)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这风格。。。 好BT,好喜欢
2025-4-23 09:46
0
雪    币: 1057
活跃值: (608)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
牛笔
2025-4-23 12:25
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
非常好风格
2025-4-23 19:12
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
这种风格真的很好,看着很棒
2025-5-5 00:26
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
这种风格真的很好,看着很棒
2025-5-6 20:17
0
游客
登录 | 注册 方可回帖
返回