从 LineageOS zip 文件中提取专有 blobs

简介

专有 blobs 可以从已运行 LineageOS 的设备或 LineageOS 可安装 zip 文件中提取。在本指南中,我们将描述从可安装 zip 文件中提取专有文件所需的步骤。

在开始之前,需要了解 OTA 类型的区别

如果您的 zip 文件没有 system 文件夹,或者该文件夹几乎为空,并且根级别存在名为 system.transfer.list 的文件,那么您拥有的是基于块的 OTA。在这种情况下,请跳转到从基于块的 OTA 中提取专有 blobs

如果您的 system 文件夹内有系统分区的全部内容,并且没有 system.transfer.list,那么您拥有的是基于文件的 OTA。请参阅从基于文件的 OTA 中提取专有 blobs

您也可能拥有基于 payload 的 OTA,如果您的设备使用 A/B 分区系统,则会使用这种 OTA。如果您拥有的是这种 OTA,请跳转到从基于 payload 的 OTA 中提取专有 blobs

从基于块的 OTA 中提取专有 blobs

一些基于块的 OTA 被拆分为多个文件,每个文件用于单独的分区,如 system、vendor、product、oem、odm 等。您可以通过在可安装的 LineageOS zip 文件的根目录中查找每个分区对应的 *.transfer.list 文件来验证您的 OTA 是否被拆分。

如果您拥有拆分的基于块的 OTA 文件,那么您需要以类似于下面概述的 system 和 vendor 的方式提取、解压缩和转换每个文件。

如果您没有拆分的 OTA 文件,您可以跳过任何引用 vendor.transfer.listvendor.new.dat.brvendor.new.dat 的步骤

创建一个临时目录并移动到该目录

mkdir ~/android/system_dump/
cd ~/android/system_dump/

从可安装的 LineageOS zip 文件中提取 system.transfer.listsystem.new.dat.brsystem.new.dat

unzip path/to/lineage-*.zip system.transfer.list system.new.dat*

其中 path/to/ 是可安装 zip 文件的路径。

如果您的 OTA 包括 vendor.transfer.listvendor.new.dat.brvendor.new.dat(或其他文件),也请从可安装的 LineageOS zip 文件中提取它们

unzip path/to/lineage-*.zip vendor.transfer.list vendor.new.dat*

其中 path/to/ 是可安装 zip 文件的路径。

对于 system.new.dat.br/vendor.new.dat.br/super.new.dat.br/etc.(brotli 压缩包)的情况,您需要首先使用 brotli 实用程序解压缩它们

sudo apt install brotli
brotli --decompress --output=system.new.dat system.new.dat.br

如果您有一个 vendor.dat.new.br(或其他)文件

brotli --decompress --output=vendor.new.dat vendor.new.dat.br

您现在需要获取 sdat2img 的副本。此脚本可以将基于块的 OTA 的内容转换为可以挂载的 dumps。sdat2img 在以下 git 存储库中可用,您可以使用以下命令克隆它

git clone https://github.com/xpirt/sdat2img

获得 sdat2img 后,使用它来提取系统镜像

python sdat2img/sdat2img.py system.transfer.list system.new.dat system.img

您现在应该有一个名为 system.img 的文件,您可以按如下方式挂载它

mkdir system/
sudo mount system.img system/

如果您有一个 vendor.dat.new(或其他)文件

python sdat2img/sdat2img.py vendor.transfer.list vendor.new.dat vendor.img

如果您有一个名为 vendor.img 或类似的文件,您可以按如下方式挂载它们

sudo rm system/vendor
sudo mkdir system/vendor
sudo mount vendor.img system/vendor/

与上述不同,如果您有一个 super.dat.new 文件

python sdat2img/sdat2img.py super.transfer.list super.new.dat super.img

您现在将拥有一个名为 super.img 的文件。您需要获取 lpunpack 的副本,以从中提取镜像。此脚本可以将 Super 分区的内容提取到其各自的组件分区中,这些分区可以被挂载。幸运的是,lpunpack 很容易构建,从 LineageOS 17.1 或更高版本的树中执行以下操作即可

source build/envsetup.sh
breakfast your_device_codename
m lpunpack

构建 lpunpack 后,使用它来提取 super 镜像

lpunpack super.img /output/dir

您现在还必须挂载您拥有的任何其他镜像文件,并将它们放在各自的目录中,如上面 vendor.img 所示。

挂载镜像后,移动到您的设备源代码的根目录,并按如下方式运行 extract-files.shextract-files.py

./extract-files.sh ~/android/system_dump/

或者,对于 Python 脚本

./extract-files.py ~/android/system_dump/

这将告诉 extract-files 脚本从挂载的系统 dump 而不是从连接的设备获取文件。

提取所有专有文件后,如果您之前挂载了 vendor dump,请卸载它

sudo umount ~/android/system_dump/system/vendor

然后卸载系统 dump

sudo umount ~/android/system_dump/system

最后,卸载任何其他镜像,然后再删除不再需要的文件

rm -rf ~/android/system_dump/

从基于文件的 OTA 中提取专有 blobs

创建一个临时目录以提取 zip 文件的内容,并移动到该目录

mkdir ~/android/system_dump/
cd ~/android/system_dump/

从 zip 文件中提取 system 文件夹

unzip path/to/lineage-*.zip system/*

其中 path/to/ 是可安装 zip 文件的路径。

提取 system 文件夹后,移动到您的设备源代码的根目录,并按如下方式运行 extract-files.shextract-files.py

./extract-files.sh ~/android/system_dump/

或者,对于 Python 脚本

./extract-files.py ~/android/system_dump/

这将告诉 extract-files 脚本从提取的系统 dump 而不是从连接的设备获取文件。

提取所有专有文件后,您可以删除从 zip 文件中提取的文件

rm -rf ~/android/system_dump/

从基于 payload 的 OTA 中提取专有 blobs

创建一个临时目录以提取 zip 文件的内容,并移动到该目录

mkdir ~/android/system_dump/
cd ~/android/system_dump/

要使用 payload.bin 提取器,您将需要 python3-protobuf,如果您还没有它

sudo apt install python3-protobuf

您现在将克隆使用 payload.bin 提取器所需的 repos

git clone https://github.com/LineageOS/android_prebuilts_extract-tools android/prebuilts/extract-tools
git clone https://github.com/LineageOS/android_tools_extract-utils android/tools/extract-utils
git clone https://github.com/LineageOS/android_system_update_engine android/system/update_engine

提取 lineage-*.zip 内部的 payload.bin

unzip path/to/lineage-*.zip

其中 path/to/ 是可安装 zip 文件的路径。

现在,提取 payload.bin 内部的 .img 文件

./android/prebuilts/extract-tools/linux-x86/bin/ota_extractor --payload path/to/payload.bin

其中 path/to/ 是新提取的 payload.bin 的路径。

这将需要一些时间。完成后,我们将需要挂载 system.img 文件,以及 vendor.imgodm.imgproduct.imgsystem_ext.img 文件(如果它们存在),以获得完整的专有 blobs 集

mkdir system/
sudo mount -o ro system.img system/
sudo mount -o ro vendor.img system/vendor/
sudo mount -o ro odm.img system/odm/
sudo mount -o ro product.img system/product/
sudo mount -o ro system_ext.img system/system_ext/

移动到您的设备源代码的根目录,并按如下方式运行 extract-files.shextract-files.py

./extract-files.sh ~/android/system_dump/

或者,对于 Python 脚本

./extract-files.py ~/android/system_dump/

这将告诉 extract-files 脚本从挂载的系统 dump 而不是连接的设备提取专有 blobs。

完成后,卸载系统 dump 并删除现在不需要的文件

sudo umount -R ~/android/system_dump/system/
rm -rf ~/android/system_dump/