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
酱会用小皮鞭严厉惩罚每一个不听话的宝宝;中途更换代码源到 googlesource
或 github
?她同样会惩罚那些三心二意的宝宝,必须对选择的源保持忠贞不渝!)
实在没办法了,可以试试这些最后的挣扎:
强制对问题仓库进行灵魂同步:
物理超度损坏的仓库,然后重新召唤:
如果以上都不行... 终极奥义:删库重来!
然后回到 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.sh
和 brunch <你的设备代号>
,编译大法师会从上次中断的地方继续施法 (有点像断点续传,超神奇!)。

坚持住!胜利的 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
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
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
ccache -M 30G
ccache -o compression=
true
ccache -o compression=
true
mkdir
~
/LineageOS
cd
LineageOS
mkdir
~
/bin
PATH=~
/bin
:$PATH
curl https:
//mirrors
.tuna.tsinghua.edu.cn
/git/git-repo
-o ~
/bin/repo
chmod
a+x ~
/bin/repo
mkdir
~
/bin
PATH=~
/bin
:$PATH
curl https:
//mirrors
.tuna.tsinghua.edu.cn
/git/git-repo
-o ~
/bin/repo
chmod
a+x ~
/bin/repo
repo init -u https:
//mirrors
.bfsu.edu.cn
/git/lineageOS/LineageOS/android
.git -b lineage-21.0 --git-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`."
/>
<
remote
name
=
"lineage"
fetch
=
"670K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3L8r3W2F1k6h3q4Y4k6f1!0e0i4K6u0r3"
review
=
"review.lineageos.org"
/>
<
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
revision
=
"refs/heads/lineage-21.0"
remote
=
"lineage"
sync-c
=
"true"
sync-j
=
"12"
/>
<
remote
name
=
"github"
fetch
=
"10aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1j5`."
/>
<
remote
name
=
"lineage"
fetch
=
"670K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2j5X3k6K6N6g2)9J5k6h3g2V1N6g2)9J5k6h3y4F1i4K6u0r3k6$3W2@1i4K6u0r3L8r3W2F1k6h3q4Y4k6f1!0e0i4K6u0r3"
review
=
"review.lineageos.org"
/>
<
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编辑
,原因: 修改错误的格式