Skip to content

备份字库

第一章:初识

一、什么是字库?

字库可以简单理解为 Android 设备的分区;更准确的表述应该为UFS / eMMC。刷机时也会刷入分区,但刷入不完整。如果设备刚好是其他分区损坏了,那么即使线刷完整包也无法修复。所以为了预防特殊分区损坏、也为了预防不小心刷入格机模块 (rm -rf /) 。

所以玩机前我们需要自行备份 Android 设备的字库文件。

基带分区
高通机型: fsg, fsc, modemst1, modemst2
联发科机型: nvram, nvdata, nvcfg, persist, protect1, protect2, seccfg

警告

如果是高通机型,可直接使用本文的命令,如果是联发科机型,请将下面命令中的 /dev/block/bootdevice/by-name 修改为 /dev/block/by-name

第二章:备份字库

方法一:Shell 命令【推荐】

本文使用的方法是手动在 Shell 中键入指令以达成备份字库的目的,酷安上有教程可在手机上直接执行备份和恢复,写的很好,但本人认为恢复部分有些许问题,因此不采用这种方法。

一、备份的前提条件

  • 设备需获取 Root 权限。

  • 开启设备的 USB 调试(在开发者选项中打开)。

  • 在 Android 至少预留 20GB 可用空间。

  • 给予 Shell 以 Root 权限

    将设备连接至电脑,在终端进入 adb shell。首次使用设备会提示“是否给予 Root 权限”,给予即可。指令如下:

    shell
    adb shell
    su

二、备份流程

1. 创建工作目录

首先,在设备 sdcard 目录下创建一个用于存储备份字库的目录:

shell
mkdir /sdcard/000_Backup

这个时候我们就可以在设备的文件浏览器看到这个目录生成了,当然,这一步也可以使用设备独立完成。

2. 读取设备的分区信息

在终端中输入以下命令,这里注意,我的指令中屏蔽了 userdata 和缓存分区 (没有必要) 。

  • 高通机型

    shell
    ls -1 /dev/block/bootdevice/by-name | grep -ixvE "userdata|cache" | while IFS= read -r name; do echo "dd if=/dev/block/bootdevice/by-name/$name of=/sdcard/000_Backup/$name.img" >> /sdcard/000_Backup/001_Backup.sh; echo "fastboot flash $name $name.img" >> /sdcard/000_Backup/002_Restore.bat; done
  • 联发科机型

    shell
    ls -1 /dev/block/by-name | grep -ixvE "userdata|cache" | while IFS= read -r name; do echo "dd if=/dev/block/by-name/$name of=/sdcard/000_Backup/$name.img" >> /sdcard/000_Backup/001_Backup.sh; echo "fastboot flash $name $name.img" >> /sdcard/000_Backup/002_Restore.bat; done

执行完成后,000_Backup 目录下会多出一个 sh 脚本和一个 bat 脚本,sh 脚本用于读取备份,bat 用于还原备份。

3. 执行备份脚本

使用 001_Backup.sh 脚本执行备份:

shell
sh /sdcard/000_Backup/001_Backup.sh

随后终端会显示备份的进度,耐心等待。

4. 创建 MD5 值表(可选)

备份完成后执行下面这条命令,它会计算我们备份出来的所有文件的 MD5 值并将其全部整理至 003_MD5Hsah.txt 这个文本中。

shell
cd /sdcard/000_Backup && md5sum * > /sdcard/000_Backup/003_MD5Hsah.txt

备份 MD5 值是为了防止在存储过程中备份文件出现损坏,而我们浑然不知,将这个损坏的分区刷进手机导致出错。

5. 手动修改 bat 脚本

我们备份字库的目的就是还原那些刷机包中没有的分区文件,如果刷机包中包含某些文件,我们就没有必要还原,不然可能会导致版本冲突,并且浪费时间。我们可以修改 bat 脚本中的指令,使还原的时候不会恢复 super 等分区。

shell
sed -i \
    -e '/ super.img/s/^/::/g' \
    -e '/ system.img/s/^/::/g' \
    -e '/ system_a.img/s/^/::/g' \
    -e '/ system_b.img/s/^/::/g' \
    -e '/ vendor.img/s/^/::/g' \
    -e '/ vendor_a.img/s/^/::/g' \
    -e '/ vendor_b.img/s/^/::/g' \
    -e '/ mmcblk0.img/s/^/::/g' \
    -e '/ sda.img/s/^/::/g' \
    -e '/ sdb.img/s/^/::/g' \
    -e '/ sdc.img/s/^/::/g' \
    -e '/ sdd.img/s/^/::/g' \
    -e '/ sde.img/s/^/::/g' \
    -e '/ sdf.img/s/^/::/g' \
    -e '/ sdg.img/s/^/::/g' \
    /sdcard/000_Backup/002_Restore.bat

然后给它打包一下:

shell
cd /sdcard && tar -zcpvf PartitionBackup.tgz 000_Backup

等处理完,我们就可以在 sdcard 根目录下就可以看到 PartitionBackup.tgz,我们将 tgz 压缩文件备份至电脑端,以后要用直接解压就很方便了。到此为止,备份工作结束,我们可以删除设备存储中的 000_Backup 目录,释放空间。

三、恢复字库

当我们的设备分区损坏后,就可以通过我们备份的分区进行修复。我们只需要解压备份文件,将手机启动至 Fastboot 模式连接电脑,在终端执行我们备份文件中的 002_Restore.bat 脚本,我们备份的分区就会被写入设备,写完后我们再线刷一下官方线刷包,格式化 data 分区后就可以正常开机进系统了!

如果批量恢复后设备系统还是有问题,可以尝试在 fastboot 模式下擦除某分区,然后手动刷入该分区的备份,当然这么做有很大的风险。

擦除某分区

shell
fastboot erase 分区名称

刷写某分区

shell
fastboot flash 分区名称 用户刷写的文件路径

方法二:工具箱软件

  • 多系统工具箱.apk

附录

一、参考资料

preview
图片加载中
预览

Released under the MIT License.