APEX如何挂载至循环设备?为何关联完整APEX压缩包
APEX压缩包中apex_payload.img的循环设备挂载原理
刷入Android调试镜像后,通过adb root;adb shell获取root权限,查看挂载信息会发现大量loop设备挂载的是完整的APEX文件:
/dev/block/loop20 on /apex/com.android.apex.cts.shim@1 type ext4 (ro,dirsync,seclabel,nodev,noatime) /dev/block/loop21 on /apex/com.android.vndk.v34@1 type ext4 (ro,dirsync,seclabel,nodev,noatime)
查看loop设备的备份文件指向的是完整APEX包:
# cat /sys/devices/virtual/block/loop20/loop/backing_file /system/apex/com.android.apex.cts.shim.apex
而APEX本身是zip格式压缩包,内部包含apex_payload.img这个ext4镜像:
# 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,系统会先解析APEX这个zip包,找到apex_payload.img在整个APEX文件中的起始字节偏移和文件大小。
在绑定loop设备时,系统会指定这两个参数:让loop设备只读取APEX文件中从该偏移地址开始、对应大小的那一段数据。这段数据正好就是完整的ext4镜像,因此可以直接被挂载为只读的ext4文件系统。
另外需要注意:APEX包中的apex_payload.img是未压缩存储的,只有这样系统才能通过字节偏移直接定位并读取镜像内容,同时结合dm-verity完成完整性校验。
内容的提问来源于stack exchange,提问作者chriskot
相关产品推荐
相关产品推荐

