此页面https://source.android.com/docs/core/ota/apex
apex_payload.img 是由 dm-verity 支持的 ext4 文件系统映像。图像在运行时通过环回设备安装。
我已经在我的 Android 设备上安装了调试映像,并使用 adb root;adb shell 来获取 Android 设备上的 root 访问权限。当我查看安装时,我看到很多 /dev/block/loop* 条目:
/apex/com.android.apex.cts.shim@1 上的 /dev/block/loop20 类型 ext4 (ro,dirsync,seclabel,nodev,noatime) /dev/block/loop21 在 /apex/com.android.vndk.v34@1 上输入 ext4 (ro,dirsync,seclabel,nodev,noatime)
如果我看
# cat /sys/devices/virtual/block/loop20/loop/backing_file
/system/apex/com.android.apex.cts.shim.apex
如果我看到 apex 文件似乎是一个 zip 文件,如上面的文档提到的:
# file /system/apex/com.android.apex.cts.shim.apex
/system/apex/com.android.apex.cts.shim.apex: Zip archive data, requires at least v1.0 to extract
# unzip -l /system/apex/com.android.apex.cts.shim.apex
Archive: /system/apex/com.android.apex.cts.shim.apex
Length Date Time Name
--------- ---------- ----- ----
644 2009-01-01 00:00 META-INF/MANIFEST.MF
1124 2009-01-01 00:00 AndroidManifest.xml
40 2009-01-01 00:00 resources.arsc
1032 2009-01-01 00:00 apex_pubkey
779 2009-01-01 00:00 META-INF/CERT.SF
1722 2009-01-01 00:00 META-INF/CERT.RSA
274432 2009-01-01 00:00 apex_payload.img
57875 2009-01-01 00:00 assets/NOTICE.html.gz
29 2009-01-01 00:00 apex_manifest.pb
884 2009-01-01 00:00 apex_build_info.pb
--------- -------
338561 10 files
我可以理解apex_payload.img文件是一个ext4文件图像。但是loop20后备存储是整个zip文件?
我想我期望 apex_payload.img 文件将从 apex zip 文件中的某个位置提取出来,然后该图像文件将成为 Loop20 设备的 backing_file 存储。但事实似乎并非如此。
了解循环设备如何挂载 zip 文件并能够访问 apex_payload.img 文件吗?
谢谢 克里斯
我只通过使用 -o Loop 选项进行挂载来使用循环设备。看来 mount 会“为你做一些事情”
我发现了lostup命令。我发现对于循环设备,您可以在支持文件中设置偏移量和大小以将其视为图像。当我使用 losetup 命令查看某些设备时,我发现循环设备已定义偏移量和大小:
# losetup -s /dev/block/loop17
/dev/block/loop17: [65025]:6047 (), offset 4096, sizelimit 114651136
# losetup -s /dev/block/loop20
/dev/block/loop20: [65025]:57 (), offset 4096, sizelimit 274432
因此,apex_payload.img 文件似乎从 *.apex 文件内的 4096 偏移量开始。 apex_paylod.img 文件中的字节无论如何都不会被压缩,并且是上面所示大小的字节数组。
因此,*.apex 文件确实是由 apexd 直接挂载的,它定义了 *.apex zip 文件中 apex_payload.img 文件的偏移量和大小。
谢谢 克里斯