从 LineageOS zip 文件中提取专有 blobs
简介
专有 blobs 可以从已运行 LineageOS 的设备或 LineageOS 可安装 zip 文件中提取。在本指南中,我们将描述从可安装 zip 文件中提取专有文件所需的步骤。
在开始之前,需要了解 OTA 类型的区别
-
基于块的 OTA:系统分区的内容以二进制数据形式存储在
.dat
/.dat.br
文件中。 -
基于文件的 OTA:系统分区的内容在 zip 文件中名为
system
的文件夹内可用。 -
基于 payload 的 OTA:系统分区的内容作为
payload.bin
内部的.img
文件存储。
如果您的 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.list
和 vendor.new.dat.br
或 vendor.new.dat
的步骤
创建一个临时目录并移动到该目录
mkdir ~/android/system_dump/
cd ~/android/system_dump/
从可安装的 LineageOS zip 文件中提取 system.transfer.list
和 system.new.dat.br
或 system.new.dat
unzip path/to/lineage-*.zip system.transfer.list system.new.dat*
其中 path/to/
是可安装 zip 文件的路径。
如果您的 OTA 包括 vendor.transfer.list
和 vendor.new.dat.br
或 vendor.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.sh
或 extract-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.sh
或 extract-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.img
、odm.img
、product.img
和 system_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.sh
或 extract-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/