限于具体情况不同,不能保证方案的通用性,请依据具体情况合理调整!

机型概况

机子是 2017 年发布的 OPPO R11,CPU 是骁龙 660 AIE,运存为 4GB,闪存是严重磨损的 eMMC 64GB。电池是原装的 3000mAh 的(现在只有 2200mAh 了)。

绿厂只给到 Android 9 ColorOS 6,连暗色模式都没有,根本满足不了我的需求。于是,我决定刷机。

OPPO R11 目前主要由 CY 团队维护,故绝大多数资源来自 CY 团队的下载站。分享链接有密码,请自行加群获取。

刷机入门

在此,我们需要明确几个定义:

  • 底层:是指基本的驱动等最重要、最基本的文件,即 “底包”。R11 (s) 系列底包版本号多为 X.nnnnnnnnnnnn 格式。
  • 系统
    1. 字面意义上的系统,包括全部可被刷写的分区
    2. 分区名,通常指 System 分区,可能同时也指 Vendor 分区
  • A/C:为了避免歧义,本文中 Android 与 ColorOS 均使用全程而简称为 A 或 C

解除 Fastboot 限制

由于在大多数稳定版系统中 OPPO 对 fastboot 进行了限制,所以我们必须降级或升级至合适的版本进行解锁 BootLoader 的操作。

无限制

若您的版本号为 A.01 / 170529C.17 / 1170,恭喜,Fastboot 畅通无阻,您可直接开始解锁 BootLoader

升级

若您的版本号小于 C.17 / 1170,则可以下载 R11_11_OTA_1170_all_PDZfMhjgV0q1_b68a39.ozip,在自带文件管理中打开,升级至 C.17 / 1170 以解除限制。

降级

相信决定对 OPPO R11 刷机的同学大多数应该更新到了比较新的系统版本吧?如果您的版本号为 C.19 / 1190,则必须采用降级法。由于此时手机处于严重受限状态,所以我们只能采用最底层的刷机方式 9008 刷机(这也是售后修手机的方法)进行降级操作。

  1. 打上驱动
  2. 下载 R11_11_A.01_170529(9008 线刷包,11、11t 可用).7zR11-MsmDownloadTool.exe,选择对应代号(R11 的代号为 16051);手机关机,同时按下电源键 + 音量++ 音量- 进入 EDL(9008 模式),连接手机至电脑,按照提示刷入即可。
  3. A.01,启动!

切记保证数据线连接良好,慎防数据线意外松动。除此之外,基本不会出现什么问题。如果出现诸如 “握手失败”“握手超时” 之类的错误,请尝试重启电脑手机、更换数据线、USB 口,有条件的更换电脑。

解锁 BootLoader

  1. 打开开发者选项
    打开手机,进入设置,找到 “关于手机” 或 “关于设备” 选项,找到 “版本号” 或 “型号 “一栏,并连续点击数次(通常需要点击 7 次),开发者模式即可成功开启。
  2. 打开 OEM 解锁和 USB 调试开关
  3. 下载 SDK Platform Tools,并解压到合适的位置
  4. 手机连接电脑,重启到 fastboot(或执行 adb reboot fastboot),然后执行 fastboot oem unlock,终端应当提示 “unlocked”
  5. 重启,手机应当有一橙色感叹号(< ! >),提示 “数据有危险”,并要求你访问 g.co/ABH。若有,则解锁成功。

刷入第三方 Rec

  1. 手机连接电脑,重启到 fastboot(或执行 adb reboot fastboot
  2. 电脑下载合适的 Recovery 镜像,执行 fastboot flash recovery twrp-x.x.x-xxxx.img

刷入第三方系统

  1. 第三方系统刷机包 (Third Party ROM) 内下载喜欢的包
  2. 这些包大多是一体包,直接刷入就好

Magisk 技巧提示

  1. Magisk APK 相当于刷机包。当 Magisk 出现 “掉 Root 权限”“获取不到 Root 权限”“Zygisk 反复注入失败” 等问题,而三方 Recovery 又可用时,您可以通过将 Magisk.apk 重命名为 Magisk.zip 并刷入来修复。
  2. 修复 Magisk 运行环境与更新 Magisk 时,务必取消勾选 “安装到 recvoery” 这个选项,高版本 Magisk (26.1+)会默认启用这个选项,错误刷入后会导致 WLAN 无法打开以及 Recovery 无法进入。
    如果您不慎安装到了 Recovery,请提取卡刷包内的 boot.img 和 recovery.img 重新刷入对应分区,或者干脆重刷完整包。
  3. “Ramdisk” 为 “否” 是正常的,是 R11 (s) 设备的特性,影响 Magisk 功能
  4. Magisk 有多个 Fork,各 Fork 各有不同。若您想切换不同的的 Fork,除了在三方 Recovery 中刷入 Magisk.zip 外,还可以在已有的 Magisk Manager 中授予将要安装的 Magisk Manager Root 权限,并重新启动准备安装的新的 Magisk Manager。此时 Magisk Manager 应当提示 “无法获取版本信息”“必须重新安装”“修复运行环境” 等提示,重新安装即可。

KernelSU 上手教程

刷内核是一种高危操作。尽管刷内核只需要修改 Boot,理论上来说出了问题也可以通过 Fastboot 或 Recovery 救活;但是在没有备份的情况下,一切救砖恢复难度都不小。所以,在刷入前,务必备份 boot.img!

内核切换方法

切换、更新、修改内核有三种方法:

  1. 从别人那里要来 boot.img 刷入
  2. 将内核镜像(.gz/.gz-dtb)用 AnyKernel3 刷入
  3. 将内核镜像(Image)用 magiskboot 打包入 boot.img 刷入

显然,大多数同学会对 AnyKernel3 感到陌生。简单说,它就是修改 Android 的 Linux 内核的程序。

用过 Linux 的同学都知道,Linux 修改内核只需要安装 / 更新软件包,然后视情况 grub-mkconfig 一下就好了;然鹅,骨子里流着 Linux 的血液的 Android 更改内核却是一件麻烦事儿。总结一下,原因有三:

  1. Android 碎片化相当严重,各厂商采用的压缩方式、启动参数、存储位置等都不尽相同,难以找到统一方案
  2. Android 搞了很多名堂,比如 AVB、AB/VAB、SAR、DM-Verify 等等,这导致在 Linux 只需要生成一下镜像即可的工作变得异常复杂
  3. Android 生态显然比 Linux 封闭的多,缺少公开的文档,有些厂商甚至连内核源码都不公开,谈何修改?

以上问题并不是无解,但对于一般人来说学习成本颇高,而且处理起各种问题来费时费力,很是痛苦。于是,就有了 AnyKernel3 这个比较方便通用的 Android 内核修改工具。

此时又会有同学说了:“我不想了解这是什么,不需要自己修改内核,而且也没有追 CI 版本号的习惯,我只是想用!” 所以下面介绍 AnyKernel3 使用方法:

在第三方 Recovery 中把 AnyKernel3-xxx-xxxx-xxx.zip 刷入即可

是的,就这么简单!

如何安装 KernelSU

  1. 各位大佬大多开源,直接抄就好了
  2. 当然,也鼓励您参考官方文档自己写代码

如何编译内核

如果您对已有的内核不满意,想要自己修改一下;或者等不及大佬们更新,按捺不住追版本号的激动,那下面的内容正合您胃口。

环境搭建

编译内核是一项较为浩大的工程,所以我们用 Github CodeSpace 编译。当然,您也可以选择本地计算机。但是,使用 CodeSpace 有相当的优势:

  1. 自带完美的、几乎无性能损耗的 Ubuntu,免除安装、调试系统的烦恼
  2. Ubuntu 是较为常规、通用、可靠的 Linux 发行版,有助于避免在一些小众发行版上的问题
  3. 编译内核很占 CPU、内存和磁盘 IO,会影响本地计算机的使用

GCC

  1. Fork 自己中意的仓库,然后建立它的 CodeSpace,各项配置拉满
  2. 选择一个合适的位置,下载 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
2
3
4
export ARCH="arm64"
export OPPO_TARGET_DEVICE="MSM_nnnnn" # R11 MSM_16051,R11s MSM_17011
export PATH=$PATH:/workspaces/gcc/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu/bin
export CROSS_COMPILE=aarch64-linux-gnu-

Clang

WIP

编译

1
2
3
4
5
# 拉取子模块(部分作者可能不使用子模块,故默认注释)
# git submodule init
# git submodule update
make O=out sdm660-perf_defconfig
make ARCH=arm64 O=out -jX | tee kernel_log.log # X 为线程数,请自行调节,看不懂写 8 就行

静待花开即可

如何打包内核

boot.img

  1. 提取一个原版 boot.img,要求不带有 Magisk
  2. 回到 CodeSpace,依次展开目录 ./out/arch/arm64/boot/,将 Image 下载下来备用
  3. 下载 Magisk.apk(适用于 Linux/MacOS,方法为解压后在 libs 里找到并提取 x86_64 的 libmagiskboot.so)或 magiskboot(适用于 Windows),整到 magiskboot 备用
  4. magiskboot unpack boot-origin.img
  5. Image 替换掉 kernel,保持 kernel 名称不变
  6. magiskoot repack,刷入得到的 new-boot.img

AnyKernel 3

  1. 回到 CodeSpace,依次展开目录 ./out/arch/arm64/boot/,将 Image-gz.dtb 下载下来备用
  2. CY 团队下载站上有好多 AnyKernel3 的 zip,挑一个自己机型的下载下来
  3. 用第一步得到的 Image-gz.dtb 替换掉 AnyKernel3-xxx-xxxx-xxx.zip 里的 Image-gz.dtb

参考资料

拓展阅读

鸣谢