折腾了2天,终于编译在成功了lineage,我的手机是redmi8a,编译的目标是mi439
同步
创建目录,配置repo。
首先使用清华的源同步镜像, 查看可同步的分支, 开始同步。
$ git ls-remote --heads https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git
8ec351910ca718336565ffbc04453abc24027418 refs/heads/cm-13.0
09558fe8f7656cc565f3084584f96aa6aada114f refs/heads/cm-14.0
286392180362d51c0b51e1eca1ae5222e13e179e refs/heads/cm-14.1
0bc20ba9b271cd841d83f93278548c816e388f15 refs/heads/cm-7.0.0
019260f647f5119eac7a1674d467dd79d00042f0 refs/heads/cm-7.0.1
087a9d82f5e2d778cb591a67ded5d29472ea7d7d refs/heads/cm-7.0.2.1
0b9fb2d557eb2a5ad528966cc00f15fd48281ec7 refs/heads/cm-7.0.3
fd173ae94bb896d1d0793a4284a205c12c86dd30 refs/heads/cm-9.1.0
434ac9b482c7786d485a28d532d7ca6002893086 refs/heads/eclair
2bcc83672e97ccac1937555267a1c502ae44b13a refs/heads/froyo
15bf66453e118ba8ee1c89d243463d388da824bd refs/heads/froyo-stable
9d9b93d5854f7ec3fd48153f811987b1164ef6dc refs/heads/gb-release-7.2
24253e4ffac9390dda538d19c7488bb3f68a1576 refs/heads/gingerbread
91e199938cd2b0530314e31963bf6be7ef788f56 refs/heads/gingerbread-release
0561e364d45db8ea62d6b117685bbbb1fc829d01 refs/heads/ics
fd173ae94bb896d1d0793a4284a205c12c86dd30 refs/heads/ics-release
900af14a2713f54ee92da2de5b2c769682e91cde refs/heads/jellybean
acdb4b18776a9bfb5817cc9bd2f5f16ee910744f refs/heads/jellybean-stable
af1e86e66d797e08a82d8a13c1f0209efd8c2137 refs/heads/lineage-15.0
541ea4d543990ec58f3a959ea9b8c727f7195f89 refs/heads/lineage-15.1
dec25fc433326babcc34eb8bd78135f70472453c refs/heads/lineage-16.0
f0f3a8555c3866ab5e3a284f52e7a909fa61eff8 refs/heads/lineage-17.0
3536adb07ead87c5ebe2943b03d87b47e7e58b35 refs/heads/lineage-17.1
5c5e6f6cfb02d10ea11b8f7650f8662466242c4c refs/heads/lineage-18.0
fd0f1538a4e11cf456529c9e9a6cd55508b7592c refs/heads/lineage-18.1
5ee0fbfe209bade4fbb70f89d6f3c5aa5f72df64 refs/heads/lineage-19.0
9e8a290355a646e0cc0a523c8ff78d55a80743a0 refs/heads/lineage-19.1
62a8f6fd8dcb9e63e94b06ec31bdc401a3daae2f refs/heads/lineage-20.0
5d6104c30d43956217b0211666e72b6463616e40 refs/heads/lineage-21.0
e4efa3377dad6c954f8208a5b0766001a6333e0d refs/heads/lineage-22.0
538c2539f5863a792f5909a05bbfddb43419449c refs/heads/lineage-22.1
$ repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-21.0
找到 manifest.xml 文件,初始化后,manifest.xml 文件位于 .repo/manifests/default.xml。
vim .repo/manifests/default.xml
将所有 https://android.googlesource.com 替换为 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP。
例如:
<remote name="aosp"
fetch="https://android.googlesource.com"
review="https://android-review.googlesource.com/" />
替换为:
<remote name="aosp"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/AOSP"
review="https://android-review.googlesource.com/" />
如果最后同步出现如下问题,需要安装git-lfs(Git Large File Storage)后再同步。
error: Unable to fully sync the tree
error: Checking out local projects failed.
Failing repos:
external/chromium-webview/prebuilt/arm
external/chromium-webview/prebuilt/arm64
external/chromium-webview/prebuilt/x86
external/chromium-webview/prebuilt/x86_64
Try re-running with "-j1 --fail-fast" to exit at the first error.
================================================================================
Repo command failed due to the following `SyncError` errors:
Cannot initialize work tree for LineageOS/android_external_chromium-webview_prebuilt_arm
Cannot initialize work tree for LineageOS/android_external_chromium-webview_prebuilt_arm64
Cannot initialize work tree for LineageOS/android_external_chromium-webview_prebuilt_x86
Cannot initialize work tree for LineageOS/android_external_chromium-webview_prebuilt_x86_64
$ sudo apt install git-lfs
编译
$ . build/envsetup.sh
$ breakfast Mi439
In file included from build/make/core/config.mk:380:
In file included from build/make/core/envsetup.mk:369:
In file included from build/make/target/product/product_launched_with_p.mk:2:
device/xiaomi/Mi439/device.mk:107: error: vendor/xiaomi/Mi439/Mi439-vendor.mk does not exist..
21:42:18 dumpvars failed with: exit status 1
Device Mi439 not found. Attempting to retrieve device repository from LineageOS Github (http://github.com/LineageOS).
Found repository: android_device_xiaomi_Mi439
Default revision: lineage-21.0
Checking branch info
Using fallback branch: lineage-21
Checking if device/xiaomi/Mi439 is fetched from android_device_xiaomi_Mi439
LineageOS/android_device_xiaomi_Mi439 already fetched to device/xiaomi/Mi439
Syncing repository to retrieve project.
Fetching: 100% (1/1), done in 0.285s
Checking out: 100% (1/1), done in 0.001s
repo sync has finished successfully.
Repository synced!
Looking for dependencies in device/xiaomi/Mi439
Looking for dependencies in device/xiaomi/mithorium-common
Looking for dependencies in kernel/xiaomi/msm8937
kernel/xiaomi/msm8937 has no additional dependencies.
Done
In file included from build/make/core/config.mk:380:
In file included from build/make/core/envsetup.mk:369:
In file included from build/make/target/product/product_launched_with_p.mk:2:
device/xiaomi/Mi439/device.mk:107: error: vendor/xiaomi/Mi439/Mi439-vendor.mk does not exist..
21:42:23 dumpvars failed with: exit status 1
In file included from build/make/core/config.mk:380:
In file included from build/make/core/envsetup.mk:369:
In file included from build/make/target/product/product_launched_with_p.mk:2:
device/xiaomi/Mi439/device.mk:107: error: vendor/xiaomi/Mi439/Mi439-vendor.mk does not exist..
21:42:24 dumpvars failed with: exit status 1
** Don't have a product spec for: 'lineage_Mi439'
** Do you have the right repo manifest?
如果出现上面类似错误,说明设备专用的供应商配置文件,通常包含设备的专有二进制文件(如驱动、固件等):vendor/xiaomi/Mi439/Mi439-vendor.mk 文件缺失,导致无法正确构建设备 Mi439 的 ROM。按照官方文档生成:https://wiki.lineageos.org/extracting_blobs_from_zips
完成上面步骤后重新构建
$ brunch Mi439
FAILED: out/soong/build.lineage_Mi439.ninja
cd "$(dirname "out/host/linux-x86/bin/soong_build")" && BUILDER="$PWD/$(basename "out/host/linux-x86/bin/soong_build")" && cd / && env -i "$BUILDER" --top "$TOP" --soong_out "out/soong" --out
"out" --soong_variables out/soong/soong.lineage_Mi439.variables -o out/soong/build.lineage_Mi439.ninja --globListDir lineage_Mi439 --globFile out/soong/globs-lineage_Mi439.ninja -l out/.module_paths/
Android.bp.list --available_env out/soong/soong.environment.available --used_env out/soong/soong.environment.used.lineage_Mi439.build Android.bp
error: art/libartpalette/Android.bp:126:1: "art_libartpalette_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/compiler/Android.bp:587:1: "art_compiler_host_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/oatdump/Android.bp:233:1: "art_standalone_oatdump_tests" depends on undefined module "art_standalone_gtest_defaults".
Or did you mean ["cts-android-test-jarjar-rules" "target_shim_libs0xc00a600800" "webrtc_strings__cord_internal"]?
error: art/libnativebridge/tests/Android.bp:26:1: "libnativebridge-test-case-defaults" depends on undefined module "art_test_defaults".
Or did you mean ["net_test_defaults"]?
error: art/imgdiag/Android.bp:95:1: "art_imgdiag_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/libartpalette/Android.bp:137:1: "art_standalone_libartpalette_tests" depends on undefined module "art_standalone_gtest_defaults".
Or did you mean ["cts-android-test-jarjar-rules" "target_shim_libs0xc00a600800" "webrtc_strings__cord_internal"]?
error: art/compiler/Android.bp:562:1: "art_compiler_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/libnativebridge/tests/Android.bp:100:1: "libnativebridge-tests-defaults" depends on undefined module "art_test_defaults".
Or did you mean ["net_test_defaults"]?
error: art/dex2oat/Android.bp:539:1: "art_standalone_dex2oat_cts_tests" depends on undefined module "art_standalone_gtest_defaults".
Or did you mean ["cts-android-test-jarjar-rules" "target_shim_libs0xc00a600800" "webrtc_strings__cord_internal"]?
error: art/dex2oat/Android.bp:384:1: "libart-dex2oat-gtest" depends on undefined module "libart-gtest-defaults".
Or did you mean ["art_libarttools_tests" "libgtest_main_ndk_c++" "libgtest_prod_headers" "liblog-tests-defaults" "libstatsgtestmatchers"]?
error: art/libdexfile/Android.bp:408:1: "art_standalone_libdexfile_external_tests" depends on undefined module "art_standalone_test_defaults".
Or did you mean ["CtsSandboxedAdIdManagerTests" "lazy_static_test_tests_test" "libart_static_base_defaults" "rust_static_cc_lib_defaults" "target_shim_libs0xc00a600800" "test_ndk_api_coverage_parser" "web
rtc_strings__cordz_handle"]?
error: art/libdexfile/Android.bp:480:1: "art_libdexfile_support_tests" depends on undefined module "art_test_defaults".
Or did you mean ["net_test_defaults"]?
error: art/dexlayout/Android.bp:286:1: "art_dexdiag_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/dexdump/Android.bp:100:1: "art_standalone_dexdump_tests" depends on undefined module "art_standalone_gtest_defaults".
Or did you mean ["cts-android-test-jarjar-rules" "target_shim_libs0xc00a600800" "webrtc_strings__cord_internal"]?
error: art/libdexfile/Android.bp:320:1: "art_libdexfile_tests" depends on undefined module "art_gtest_defaults".
Or did you mean ["jni_gtest_defaults" "net_test_defaults"]?
error: art/libnativeloader/Android.bp:121:1: "libnativeloader-test-defaults" depends on undefined module "art_test_defaults".
Or did you mean ["net_test_defaults"]?
error: art/libdexfile/Android.bp:329:1: "art_standalone_libdexfile_tests" depends on undefined module "art_standalone_gtest_defaults".
Or did you mean ["cts-android-test-jarjar-rules" "target_shim_libs0xc00a600800" "webrtc_strings__cord_internal"]?
fatal errors encountered
08:06:04 soong bootstrap failed with: exit status 1
从错误日志来看,编译失败的原因是 soong 构建系统在解析 Android.bp 文件时遇到了未定义的模块依赖(如 art_gtest_defaults、art_standalone_gtest_defaults 等)。发现art/test目录居然不存在,肯定同步存在问题。
使用“repo sync -c art -j4 --force-sync” 等方式同步依然不行,索性删除对应的git和art目录:
rm -rf art
rm -rf .repo/projects/art.git
再次同步终于OK了。
继续编译,提示external/chromium-webview/prebuilt/arm64目录下的apk为非zip文件,一看才100多k,看来清华镜像同步存在问题。手动下载对应apk:
下载
最后终于OK:
编译成功后进入out目录查看编辑后的文件
$ cd $OUT
$ ll
-rw-rw-r-- 1 ken ken 67108864 3月 1 18:48 boot.img
-rw-rw-r-- 2 ken ken 1067993906 3月 1 19:01 lineage-21.0-20250301-UNOFFICIAL-Mi439.zip
-rw-rw-r-- 1 ken ken 109 3月 1 19:01 lineage-21.0-20250301-UNOFFICIAL-Mi439.zip.sha256sum
-rw-rw-r-- 2 ken ken 1067993906 3月 1 19:01 lineage_Mi439-ota.zip
drwxrwxr-x 3 ken ken 4096 3月 1 14:03 recovery/
-rw-rw-r-- 1 ken ken 67108864 3月 1 18:48 recovery.img
...
刷机过程主要用到boot.img,lineage-21.0-20250301-UNOFFICIAL-Mi439.zip和recovery.img。简单说明各个文件的作用:
文件 | 内容 | 作用 | 使用场景 | 刷入方法 |
---|---|---|---|---|
recovery.img | Recovery 系统镜像 | 包含 Recovery 系统的内核和文件系统 | 刷入自定义 Recovery(如 TWRP 或 LineageOS Recovery) | 通过 fastboot 刷入 |
lineage_Mi439-ota.zip | OTA 更新包(增量更新) | 包含系统更新的增量文件(仅变化的文件) | 从旧版本升级到新版本 | 通过 Recovery 模式或系统更新功能刷入 |
boot.img | 启动镜像(内核 + initramfs) | 包含 Linux 内核和初始 RAM 磁盘(initramfs) | 刷入内核以启动设备 | 通过 fastboot 刷入 |
system.img | 系统分区镜像 | 包含 Android 系统的核心文件(/system 分区) | 刷入系统分区以安装或修复系统 | 通过 fastboot 刷入 |
刷入方式,手机进入fastboot,刷入boot.img和recovery.img.
$adb reboot fastboot
$fastboot flash boot boot.img
$fastboot flash recovery recovery.img
重启进入recovery模式,然后格式化data和system等目录,刷入 ROM
adb sideload lineage-21.0-20250301-UNOFFICIAL-Mi439.zip
执行上面命令后不用单独刷入 system.img了,ROM 包已包含 system 分区: lineage-21.0-20250301-UNOFFICIAL-Mi439.zip 已经包含了完整的 system 分区内容,刷入 ROM 包时会自动更新 system 分区。
再次重启,就可以进入lineageOS了。后面就可以对系统模块的源码单独修改编译跟踪查看,直接push到手机,对于研究系统源码还是很有帮助。