1. 项目背景与准备工作
作为一名长期折腾Android设备的玩家,我一直想尝试自己编译定制ROM。最近入手了一加9R(代号lemonades),决定挑战一下为它编译LineageOS系统。LineageOS作为最活跃的第三方Android开源项目,不仅提供了接近原生Android的纯净体验,还支持大量设备的自定义开发。
1.1 硬件与软件需求
硬件准备:
- 一加9R手机(建议使用备用机操作)
- 性能强劲的电脑(我使用的是i7-10700K/32GB RAM/1TB SSD配置)
- Type-C数据线(原装线最可靠)
- 稳定的网络环境(编译过程需要下载约30GB源码)
软件环境:
- Ubuntu 20.04 LTS(官方推荐系统)
- 至少300GB的磁盘空间(源码+编译产物会占用大量空间)
- JDK 8(Android编译的Java环境要求)
- Python 3.6+
- Git版本控制工具
重要提示:整个编译过程可能需要6-12小时不等,建议在空闲时间操作,并保持电脑供电稳定。
1.2 开发环境搭建
首先需要在Ubuntu上安装必要的编译工具链:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3 python3-pip
接着配置repo工具(Google提供的代码管理工具):
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc
source ~/.bashrc
2. 设备解锁与基础准备
2.1 解锁Bootloader
一加手机需要先解锁Bootloader才能刷入第三方ROM:
- 在手机设置中启用"开发者选项"(连续点击"关于手机"中的版本号7次)
- 开启"OEM解锁"和"USB调试"选项
- 连接电脑执行:
adb reboot bootloader
fastboot oem unlock
警告:解锁会清除手机所有数据,请提前备份重要文件。
2.2 刷入临时Recovery
为了刷入LineageOS,我们需要先替换官方Recovery:
fastboot flash boot lineage-19.1-recovery-lemonades.img
fastboot reboot recovery
我使用的是LineageOS官方提供的TWRP兼容版本,这样既保持了稳定性又支持ADB sideload功能。
3. 源码下载与编译
3.1 初始化代码仓库
创建源码目录并初始化LineageOS仓库:
mkdir -p ~/android/lineage
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-19.1
添加一加9R的设备特定代码:
git clone https://github.com/LineageOS/android_device_oneplus_lemonades.git -b lineage-19.1 device/oneplus/lemonades
git clone https://github.com/LineageOS/android_device_oneplus_sm8250-common.git -b lineage-19.1 device/oneplus/sm8250-common
git clone https://github.com/LineageOS/android_kernel_oneplus_sm8250.git -b lineage-19.1 kernel/oneplus/sm8250
git clone https://github.com/LineageOS/android_vendor_oneplus.git -b lineage-19.1 vendor/oneplus
3.2 同步源码
开始同步所有代码(这将下载约30GB数据):
repo sync -j$(nproc --all) --force-sync --no-clone-bundle --no-tags
我建议在夜间执行此操作,因为即使使用高速网络也需要数小时。如果中断,可以重复执行该命令继续同步。
3.3 编译配置
初始化编译环境:
source build/envsetup.sh
选择设备配置:
lunch lineage_lemonades-userdebug
3.4 开始编译
使用以下命令启动编译过程:
mka bacon -j$(nproc --all)
"-j"参数指定并行编译任务数,一般设置为CPU核心数。我的16线程CPU使用了16个并行任务,内存占用约24GB。
编译过程中常见的几个阶段:
- 检查依赖关系(约10分钟)
- 编译内核(约30分钟)
- 编译系统组件(约2-4小时)
- 打包镜像文件(约30分钟)
经验之谈:编译过程中如果报错,通常是因为缺少依赖包。根据错误信息安装对应软件包后,从出错的地方重新开始编译即可。
4. 刷机与问题排查
4.1 刷入编译好的系统
编译完成后,在out/target/product/lemonades/目录下会生成以下重要文件:
- lineage-19.1-xxxxxxxx-UNOFFICIAL-lemonades.zip(系统刷机包)
- boot.img(内核镜像)
- dtbo.img(设备树镜像)
- vbmeta.img(验证启动镜像)
进入Recovery模式执行:
adb sideload lineage-19.1-xxxxxxxx-UNOFFICIAL-lemonades.zip
4.2 常见问题解决
问题1:编译时报错"ninja failed with: exit status 1" 解决方案:这通常是代码不同步导致的。执行:
repo sync --force-sync
make clobber
然后重新编译。
问题2:刷机后无法启动 尝试刷入vbmeta镜像禁用验证:
fastboot flash vbmeta vbmeta.img --disable-verity --disable-verification
问题3:WiFi或蓝牙无法工作 可能是vendor镜像不匹配。需要先刷入官方ROM的vendor分区:
fastboot flash vendor vendor.img
4.3 性能优化技巧
- 使用ccache加速后续编译:
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G
- 对于SSD用户,可以启用f2fs文件系统提升I/O性能:
make filesystem f2fs
- 精简编译目标(仅编译system镜像):
mka systemimage -j$(nproc --all)
5. 系统定制与进阶玩法
5.1 添加Root权限
LineageOS默认不包含Root,可以通过以下方式添加:
- 编译时在envsetup.sh后执行:
export WITH_SU=true
- 或者刷入Magisk:
adb sideload Magisk-v25.2.zip
5.2 自定义功能修改
以修改状态栏时钟样式为例:
- 找到源码位置:
cd frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/
- 修改Clock.java中的相关代码
- 重新编译SystemUI模块:
mka SystemUI -j$(nproc --all)
5.3 内核调优
一加9R使用骁龙870处理器,可以通过修改内核配置提升性能:
cd kernel/oneplus/sm8250
make menuconfig
推荐调整的参数:
- CPU Governor改为performance
- GPU默认频率提升10%
- 启用KSM内存压缩
6. 维护与更新
6.1 增量更新
后续更新代码只需执行:
repo sync
make installclean
mka bacon -j$(nproc --all)
6.2 备份重要分区
建议备份以下关键分区:
adb shell
dd if=/dev/block/bootdevice/by-name/modem of=/sdcard/modem.img
dd if=/dev/block/bootdevice/by-name/persist of=/sdcard/persist.img
6.3 回退官方系统
如果需要恢复官方系统:
- 下载官方ROM包
- 在fastboot模式下执行:
fastboot update oxygenos.zip
经过三天断断续续的尝试,我的定制版LineageOS终于在一加9R上稳定运行了。最大的收获是学会了如何阅读Android构建系统的错误日志,这比任何教程都更有价值。建议有兴趣的玩家先从简单的模块修改开始,逐步深入理解Android系统架构。



557

被折叠的 条评论
为什么被折叠?



