设定上……
我的手机是Nexus 5 hammerhead
,最近Android 6.0发布,然而由于root过了以至于不能OTA。今天上午找了一个办法能够正常的OTA了。
步骤
- 查找版本号。Settings > About phone > Build number,得到
LMY48B
- 下载:adb
- 下载:对应的系统镜像,对于我的情况来说是 hammerhead-lmy48b-factory-596bb9c1.tgz
- 在这个压缩包里还有一个zip:
image-hammerhead-lmy48b.zip
,找到system.img
和boot.img
- 以防万一
$ adb backup
$ adb backup
$ adb backup
很重要所以说三遍 - 开刷之前记得把手机上使用root权限的软件卸载,在data分区上的残留文件清理干净,刷完以后手机就没root也不能清理了。
- 手机关机进入fastboot
$ fastboot flash system path/to/system.img
$ fastboot flash boot path/to/boot.img
- 开机,OTA
原理
Nexus 5使用的cf-auto-root
在root时会修改内核并且在系统内装入SuperSU,而SuperSU在system
分区,内核在boot
分区。
用adb shell
进入手机执行mount
指令的话……
cth451@cth-linux-desktop:~$ adb shell shell@hammerhead:/ $ mount rootfs / rootfs ro,seclabel,relatime 0 0 ...... /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,noauto_da_alloc,errors=panic,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,noauto_da_alloc,errors=panic,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,nomblk_io_submit,nodelalloc,errors=panic,data=ordered 0 0 ......
正常开机的话boot分区根本不挂载,根目录和system
分区都是只读挂载。这也就意味着如果没有强行手动以rw
模式挂载system
的话,是不能写入的。由于不root的情况下,任何用户和程序都不能写入system
,所有的应用程序数据和用户文件以及虚拟sdcard(如果有)一定不会存储在system
分区上。
OTA本身只更新系统也就是system
分区,由于OTA的包是增量更新,打过root补丁的内核、system
分区里的SuperSu程序无法通过校验,于是机器人倒地。因此想把boot
和system
恢复至当前版本的出场状态就能可以正常通过OTA前的校验。