旧手机优化计划之一 - 刷机与 Root
限于具体情况不同,不能保证方案的通用性,请依据具体情况合理调整!
机型概况
机子是 2017 年发布的 OPPO R11,CPU 是骁龙 660 AIE,运存为 4GB,闪存是严重磨损的 eMMC 64GB。电池是原装的 3000mAh 的(现在只有 2200mAh 了)。
绿厂只给到 Android 9 ColorOS 6,连暗色模式都没有,根本满足不了我的需求。于是,我决定刷机。
OPPO R11 目前主要由 CY 团队维护,故绝大多数资源来自 CY 团队的下载站。分享链接有密码,请自行加群获取。
刷机入门
在此,我们需要明确几个定义:
- 底层:是指基本的驱动等最重要、最基本的文件,即 “底包”。R11 (s) 系列底包版本号多为
X.nn
、nnnn
或nnnnnn
格式。 - 系统:
- 字面意义上的系统,包括全部可被刷写的分区
- 分区名,通常指 System 分区,可能同时也指 Vendor 分区
- A/C:为了避免歧义,本文中 Android 与 ColorOS 均使用全程而不简称为 A 或 C
解除 Fastboot 限制
由于在大多数稳定版系统中 OPPO 对 fastboot 进行了限制,所以我们必须降级或升级至合适的版本进行解锁 BootLoader 的操作。
无限制
若您的版本号为 A.01
/ 170529
或 C.17
/ 1170
,恭喜,Fastboot 畅通无阻,您可直接开始解锁 BootLoader。
升级
若您的版本号小于 C.17
/ 1170
,则可以下载 R11_11_OTA_1170_all_PDZfMhjgV0q1_b68a39.ozip,在自带文件管理中打开,升级至 C.17
/ 1170
以解除限制。
降级
相信决定对 OPPO R11 刷机的同学大多数应该更新到了比较新的系统版本吧?如果您的版本号为 C.19
/ 1190
,则必须采用降级法。由于此时手机处于严重受限状态,所以我们只能采用最底层的刷机方式 9008 刷机(这也是售后修手机的方法)进行降级操作。
- 打上驱动
- 下载 R11_11_A.01_170529(9008 线刷包,11、11t 可用).7z 和 R11-MsmDownloadTool.exe,选择对应代号(R11 的代号为 16051);手机关机,同时按下
电源键
+音量+
+音量-
进入 EDL(9008 模式),连接手机至电脑,按照提示刷入即可。 - A.01,启动!
切记保证数据线连接良好,慎防数据线意外松动。除此之外,基本不会出现什么问题。如果出现诸如 “握手失败”“握手超时” 之类的错误,请尝试重启电脑手机、更换数据线、USB 口,有条件的更换电脑。
解锁 BootLoader
- 打开开发者选项
打开手机,进入设置,找到 “关于手机” 或 “关于设备” 选项,找到 “版本号” 或 “型号 “一栏,并连续点击数次(通常需要点击 7 次),开发者模式即可成功开启。 - 打开 OEM 解锁和 USB 调试开关
- 下载 SDK Platform Tools,并解压到合适的位置
- 手机连接电脑,重启到 fastboot(或执行
adb reboot fastboot
),然后执行fastboot oem unlock
,终端应当提示 “unlocked” - 重启,手机应当有一橙色感叹号(
< ! >
),提示 “数据有危险”,并要求你访问g.co/ABH
。若有,则解锁成功。
刷入第三方 Rec
- 手机连接电脑,重启到 fastboot(或执行
adb reboot fastboot
) - 电脑下载合适的 Recovery 镜像,执行
fastboot flash recovery twrp-x.x.x-xxxx.img
刷入第三方系统
- 从第三方系统刷机包 (Third Party ROM) 内下载喜欢的包
- 这些包大多是一体包,直接刷入就好
Magisk 技巧提示
- Magisk APK 相当于刷机包。当 Magisk 出现 “掉 Root 权限”“获取不到 Root 权限”“Zygisk 反复注入失败” 等问题,而三方 Recovery 又可用时,您可以通过将 Magisk.apk 重命名为 Magisk.zip 并刷入来修复。
- 修复 Magisk 运行环境与更新 Magisk 时,务必取消勾选 “安装到 recvoery” 这个选项,高版本 Magisk (26.1+)会默认启用这个选项,错误刷入后会导致 WLAN 无法打开以及 Recovery 无法进入。
如果您不慎安装到了 Recovery,请提取卡刷包内的 boot.img 和 recovery.img 重新刷入对应分区,或者干脆重刷完整包。 - “Ramdisk” 为 “否” 是正常的,是 R11 (s) 设备的特性,不影响 Magisk 功能
- Magisk 有多个 Fork,各 Fork 各有不同。若您想切换不同的的 Fork,除了在三方 Recovery 中刷入 Magisk.zip 外,还可以在已有的 Magisk Manager 中授予将要安装的 Magisk Manager Root 权限,并重新启动准备安装的新的 Magisk Manager。此时 Magisk Manager 应当提示 “无法获取版本信息”“必须重新安装”“修复运行环境” 等提示,重新安装即可。
KernelSU 上手教程
刷内核是一种高危操作。尽管刷内核只需要修改 Boot,理论上来说出了问题也可以通过 Fastboot 或 Recovery 救活;但是在没有备份的情况下,一切救砖恢复难度都不小。所以,在刷入前,务必备份 boot.img!
内核切换方法
切换、更新、修改内核有三种方法:
- 从别人那里要来 boot.img 刷入
- 将内核镜像(.gz/.gz-dtb)用 AnyKernel3 刷入
- 将内核镜像(Image)用 magiskboot 打包入 boot.img 刷入
显然,大多数同学会对 AnyKernel3 感到陌生。简单说,它就是修改 Android 的 Linux 内核的程序。
用过 Linux 的同学都知道,Linux 修改内核只需要安装 / 更新软件包,然后视情况 grub-mkconfig 一下就好了;然鹅,骨子里流着 Linux 的血液的 Android 更改内核却是一件麻烦事儿。总结一下,原因有三:
- Android 碎片化相当严重,各厂商采用的压缩方式、启动参数、存储位置等都不尽相同,难以找到统一方案
- Android 搞了很多名堂,比如 AVB、AB/VAB、SAR、DM-Verify 等等,这导致在 Linux 只需要生成一下镜像即可的工作变得异常复杂
- Android 生态显然比 Linux 封闭的多,缺少公开的文档,有些厂商甚至连内核源码都不公开,谈何修改?
以上问题并不是无解,但对于一般人来说学习成本颇高,而且处理起各种问题来费时费力,很是痛苦。于是,就有了 AnyKernel3 这个比较方便通用的 Android 内核修改工具。
此时又会有同学说了:“我不想了解这是什么,不需要自己修改内核,而且也没有追 CI 版本号的习惯,我只是想用!” 所以下面介绍 AnyKernel3 使用方法:
在第三方 Recovery 中把 AnyKernel3-xxx-xxxx-xxx.zip
刷入即可
是的,就这么简单!
如何安装 KernelSU
如何编译内核
如果您对已有的内核不满意,想要自己修改一下;或者等不及大佬们更新,按捺不住追版本号的激动,那下面的内容正合您胃口。
环境搭建
编译内核是一项较为浩大的工程,所以我们用 Github CodeSpace 编译。当然,您也可以选择本地计算机。但是,使用 CodeSpace 有相当的优势:
- 自带完美的、几乎无性能损耗的 Ubuntu,免除安装、调试系统的烦恼
- Ubuntu 是较为常规、通用、可靠的 Linux 发行版,有助于避免在一些小众发行版上的问题
- 编译内核很占 CPU、内存和磁盘 IO,会影响本地计算机的使用
GCC
- Fork 自己中意的仓库,然后建立它的 CodeSpace,各项配置拉满
- 选择一个合适的位置,下载 Linaro GCC 4.9 并解压,记下路径(如
/workspaces/gcc/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu/bin
)
Clang
WIP
设置变量
GCC
Wenhao 内核要求使用 GCC4.9 编译。
1 | export ARCH="arm64" |
Clang
WIP
编译
1 | # 拉取子模块(部分作者可能不使用子模块,故默认注释) |
静待花开即可
如何打包内核
boot.img
- 提取一个原版 boot.img,要求不带有 Magisk
- 回到 CodeSpace,依次展开目录
./out/arch/arm64/boot/
,将Image
下载下来备用 - 下载 Magisk.apk(适用于 Linux/MacOS,方法为解压后在 libs 里找到并提取 x86_64 的
libmagiskboot.so
)或 magiskboot(适用于 Windows),整到 magiskboot 备用 magiskboot unpack boot-origin.img
- 用
Image
替换掉kernel
,保持kernel
名称不变 magiskoot repack
,刷入得到的new-boot.img
AnyKernel 3
- 回到 CodeSpace,依次展开目录
./out/arch/arm64/boot/
,将Image-gz.dtb
下载下来备用 - CY 团队下载站上有好多 AnyKernel3 的 zip,挑一个自己机型的下载下来
- 用第一步得到的
Image-gz.dtb
替换掉AnyKernel3-xxx-xxxx-xxx.zip
里的Image-gz.dtb
参考资料
- 如何为非 GKI 内核集成 KernelSU | KernelSU
- [基础教程] 如何编译一个 ARM64 架构的自定义内核・tiann/KernelSU・Discussion #950
- [基础教程 2] 如何使用 AnyKernel 3 打包内核・tiann/KernelSU・Discussion #952
拓展阅读
- 救砖 | KernelSU(重要必读!)
- AnyKernel3 官方文档
- osm0sis/AnyKernel3: AnyKernel, Evolved
- DTB 映像 | Android 开源项目 | Android Open Source Project