刷入任意单独镜像

来自Uotan Wiki · 刷机百科

提示:刷入镜像到设备是一项具有一定危险性的操作,需要小心谨慎地执行,错误的操作可能导致设备无法正常运行。

概述

在刷机中我们经常看到的镜像是一种原始(raw)镜像,通常具有.img 扩展名,并包含一个或多个原始二进制格式的文件系统。它是即原始二进制存储介质的转储。换句话说,我们可以向给定的分区或整个存储介质中逐位复制数据。因此,我们也可以逐位地向手机的内部存储刷入这些原始镜像。

方法一:使用 Fastboot 及 FastbootD 刷入

Fastboot是一个硬件通信协议,主要用于由一台计算机(GNU/Linux或Windows的PC以及使用Termux的手机)通过USB连接Android智能手机,修改其闪存的文件系统。它是Android Debug Bridge库的一部分。在Fastboot协议下,刷入镜像的操作是十分简单的。我们仅需要用到以下命令:

fastboot flash [分区名称] [镜像文件名]

在较新的设备上刷入镜像时,这些设备没有system,vendor,odm等分区,你会遇到无法找到 system , vendor,odm等分区的问题,取而代之的是super分区,在命令行中输入

fastboot reboot fastboot

进入用户空间fastboot,随后即可进行刷入。

对于A/B分区的设备,我们需要正确选择镜像被刷入的槽位,在出厂时搭载Android 11及以上版本的设备中,虚拟A/B是GMS要求。搭载虚拟A/B分区的设备,一定拥有动态分区及A/B双槽在命令行输入

fastboot getvar current-slot

以查看当前处于A槽位或B槽位

若处于A槽位,刷入system命令则在分区名后添加 _a

fastboot flash system_a [镜像文件名]

B槽位的分区刷入也同理,刷入system命令则在分区名后添加 _b

fastboot flash system_b [镜像文件名]

PS:如不指定槽位则会自行刷入至当前槽位的对应分区。

方法二:使用dd命令刷入

类UNIX操作系统将存储在文件系统上的任何内容都视为文件,甚至是块设备(包括手机上的UFS存储)。dd 可用于转换和复制终端中的文件、备份磁盘或擦除数据,这意味着dd在许多情况下都非常方便。事实上 dd 还被用来制作GNU/Linux启动盘,以及修复GNU/Linux权限错误等多种用途。Magisk或者爱玩机工具箱刷写分区,以及市面上的恶意格机脚本用的都是dd命令,参见:格机中心。我们可以使用dd命令由分区创建原始(raw)镜像,也可以把原始(raw)镜像逐一刷入系统的各分区。

Android 手机的分区是有名字的,而且有两套。以UFS存储(下同)为例,这两套都是分区一套是/dev/block/sd*(在eMMC存储设备中是mmcblk*p*)这些名字是由内核分配的;而另一些是分区名(boot_a,dtbo_b,super,......),在Android中,同一个块设备对应两个文件。比如说笔者的boot_a就既对应/dev/block/sde43,又对应 /dev/block/by-name/boot_a。可以看出 /dev/block/by-name/ 这一目录下对应的是分区的具体名称。

Android是类UNIX系统,有不完整的shell指令集toybox,尽管不如GNU/Linux 上的 Coeutils那样强大,但是也提供了dd的二进制实现。而Android上的命令行工具Termux则提供了一套完整的 GNU Coreutils 实现。这意味着你可以通过adb shell、TWRP上的命令行shell或者Termux便捷地刷入一些分区(除了动态分区)。

  • 你不需要打断工作,大费周章重启到Fastboot;
  • 不需要电脑、数据线或其它设备即可刷写分区。

dd命令使用方式如下:

导出镜像

# dd if = /dev/block/by-name/[要刷入的分区名字] of= [镜像文件名] [选项]

刷入镜像

# dd if = [镜像文件名] of= /dev/block/by-name/[要刷入的分区名字] [选项]

方法三:使用高通9008或MTK深刷刷入

最复杂、最底层的刷机方式。

参见:9008深度刷机MTK Flashtool深度刷机

方法四:使用柚坛工具箱

柚坛工具箱提供了一个GUI界面。在柚坛工具箱的自定义刷入页面中,可以在预制刷入中快捷的选择需要刷入对于分区的文件,随后点击刷入即可,也可以在自定义分区刷入中选择镜像文件并填写对应的分区,随后即可完成刷入。