Android系统 —— image文件解析

Android系统编译之后的打包阶段,会将所有编译出来的有需要的执行文件,库文件以及各种配置文件等打包到各个镜像文件中。有时候我们需要看一下镜像文件中都打包了什么东西,那就可以通过一些方法将其挂载到一个目录,然后进行查看。

1. 所用工具

1.1 simg2img

简述:
将sparse格式的image文件转化为raw格式的image文件。
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/simg2img


1.2 lpunpack

简述:
这个工具可以将system.img,product.img,vendor.img等文件从super.img解析出来。

路径:
out/host/linux-x86/bin/lpunpack

编译指令:

source build/envsetup.sh
lunch
make lpunpack

1.3 unpack_bootimg

简述:
专门用于解析boot.img的工具。

路径:
out/host/linux-x86/bin/unpack_bootimg
system/core/mkbootimg/unpack_bootimg.py

编译指令:

source build/envsetup.sh
lunch
make unpack_bootimg

1.4 mkdtimg

简述:
将dtbo.img文件转化为dtb文件,一个dtbo.img会包含多个dtb文件;
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/mkdtimg


1.5 dtc

简述:
将dtb文件转化为可阅读的dts文件;
编译android源码默认会生成。

路径:
out/host/linux-x86/bin/dtc


2. 解析image文件

这次准备了下面这几个镜像文件进行举例解析:

#用file查看一下每个img文件的格式信息
sun@sun-pc:~/android/imgs$ file *.img
boot.img:          Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memc)
dtbo.img:          data
metadata.img:      Android sparse image, version: 1.0, Total of 4096 4096-byte output blocks in 4 input chunks.
persist.img:       Linux rev 1.0 ext4 filesystem data, UUID=e44c9479-7df0-4905-8ac0-216d5c8adf3e (extents) (large files) (huge files)
recovery.img:      Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memc)
super.img:         Android sparse image, version: 1.0, Total of 3145728 4096-byte output blocks in 120 input chunks.
userdata.img:      Android sparse image, version: 1.0, Total of 11564499 4096-byte output blocks in 28 input chunks.
vbmeta.img:        data
vbmeta_system.img: data

2.1 boot.img,recovery.img

这两个都是Android bootimg格式,方法都是一样的
boot.img

# sun@sun-pc:~/android/imgs$ ../system/core/mkbootimg/unpack_bootimg.py --boot_img boot.img --out boot
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/unpack_bootimg --boot_img boot.img --out boot

#查看解析出的boot目录
sun@sun-pc:~/android/imgs$ ls boot
dtb  kernel  ramdisk

recovery.img

# sun@sun-pc:~/android/imgs$ ../system/core/mkbootimg/unpack_bootimg.py --boot_img recovery.img --out recovery
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/unpack_bootimg --boot_img recovery.img --out recovery

#查看解析出的boot目录
sun@sun-pc:~/android/imgs$ ls recovery
dtb  kernel  ramdisk  recovery_dtbo

2.2 dtbo.img

(1) 先从dtbo.img解析出dtb文件

#创建dtbo目录,然后使用mkdtimg工具解析dtbo.img,-b后边是输出路径(dtb是自定义的文件名前缀)
sun@sun-pc:~/android/imgs$ mkdir dtbo && ../out/host/linux-x86/bin/mkdtimg dump dtbo.img -b dtbo/dtb
sun@sun-pc:~/android/imgs$ ls dtbo
dtb.0  dtb.1  dtb.10  dtb.11  dtb.12  dtb.13  dtb.14  dtb.15  dtb.16  dtb.17  ...  dtb.6  dtb.7  dtb.8  dtb.9

#查看一下文件信息,的确是dtb(Device Tree Blob)文件
sun@sun-pc:~/android/imgs$ file dtbo/dtb.0
dtbo/dtb.0: Device Tree Blob version 17, size=110367, boot CPU=0, string block size=7979, DT structure block size=102332

(2) 再将上一步的dtb文件转化为可以阅读的dts文件

#将dtb.0转化为0.dts
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/dtc dtbo/dtb.0 dtbo/0.dts

#如果觉得一个个文件转化比较麻烦,可以使用下面的命令
find ./dtbo -name 'dtb.*' | xargs -n1 sh -c '../out/host/linux-x86/bin/dtc $1 -o $1.dts && rename "s/dtb\.//" $1.dts' sh

2.3 metadata.img,userdata.img

这两个解析步骤一样,下面以metadata.img为例
(1) 将sparse格式的metadata.img转化为raw格式的metadata_raw.img

sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/simg2img metadata.img metadata_raw.img

(2) 将metadata_raw.img挂载到一个目录上,此时访问这个目录就可以访问镜像文件的内容了

#首先创建目录metadata,然后将metadata_raw.img挂载到此目录
sun@sun-pc:~/android/imgs$ mkdir metadata && sudo mount -o ro metadata_raw.img metadata

#可以看到metadata目录已经有内容了
sun@sun-pc:~/android/imgs$ ls
lost+found

2.4 super.img

(1) sparse格式转化为raw格式

sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/simg2img super.img super_raw.img

(2) 使用lpunpack解析super_raw.img

sun@sun-pc:~/android/imgs$ mkdir super
sun@sun-pc:~/android/imgs$ ../out/host/linux-x86/bin/lpunpack super_raw.img super

sun@sun-pc:~/android/imgs$ ls super
product_a.img  product_b.img  system_a.img  system_b.img  vendor_a.img  vendor_b.img

(3) 挂载解析出来的镜像文件

#以system_a.img为例,其他同理
sun@sun-pc:~/android/imgs/super$ mkdir system_a
sun@sun-pc:~/android/imgs/super$ sudo mount -o ro system_a.img system_a

#查看system_a.img解析出来的文件
sun@sun-pc:~/android/imgs/super$ ll system_a
总用量 172
drwxr-xr-x. 22 root root  4096 11  2009 ./
drwxrwxr-x   3 sun  sun   4096 826 13:49 ../
drwxr-xr-x.  2 root root  4096 11  2009 acct/
drwxr-xr-x.  2 root root  4096 11  2009 apex/
lrw-r--r--.  1 root root    11 11  2009 bin -> /system/bin
lrw-r--r--.  1 root root    50 11  2009 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
lrw-r--r--.  1 root root    11 11  2009 cache -> /data/cache
lrw-r--r--.  1 root root    19 11  2009 charger -> /system/bin/charger
dr-xr-xr-x.  2 root root  4096 11  2009 config/
lrw-r--r--.  1 root root    17 11  2009 d -> /sys/kernel/debug/
drwxrwx--x.  2 sun  sun   4096 11  2009 data/
drwxr-xr-x.  2 root root  4096 11  2009 debug_ramdisk/
lrw-------.  1 root root    23 11  2009 default.prop -> system/etc/prop.default
drwxr-xr-x.  2 root root  4096 11  2009 dev/
lrw-r--r--.  1 root root    11 11  2009 etc -> /system/etc
lrwxr-x---.  1 root 2000    16 11  2009 init -> /system/bin/init
-rwxr-x---.  1 root 2000  2067 11  2009 init.environ.rc*
-rwxr-x---.  1 root 2000 34196 11  2009 init.rc*
-rwxr-x---.  1 root 2000  3343 11  2009 init.recovery.qcom.rc*
-rwxr-x---.  1 root 2000  7690 11  2009 init.usb.configfs.rc*
-rwxr-x---.  1 root 2000  5649 11  2009 init.usb.rc*
-rwxr-x---.  1 root 2000   611 11  2009 init.zygote32.rc*
-rwxr-x---.  1 root 2000  1029 11  2009 init.zygote64_32.rc*
drwx------.  2 root root 16384 11  2009 lost+found/
drwxr-xr-x.  2 root root  4096 11  2009 metadata/
drwxr-xr-x.  2 root sun   4096 11  2009 mnt/
drwxr-xr-x.  2 root root  4096 11  2009 odm/
drwxr-xr-x.  2 root root  4096 11  2009 oem/
drwxr-xr-x.  2 root root  4096 11  2009 postinstall/
drwxr-xr-x.  2 root root  4096 11  2009 proc/
drwxr-xr-x.  2 root root  4096 11  2009 product/
lrw-r--r--.  1 root root    24 11  2009 product_services -> /system/product_services
drwxr-xr-x.  3 root root  4096 11  2009 res/
drwxr-x---.  2 root 2000  4096 11  2009 sbin/
lrw-r--r--.  1 root root    21 11  2009 sdcard -> /storage/self/primary
drwxr-x--x.  2 root 1028  4096 11  2009 storage/
drwxr-xr-x.  2 root root  4096 11  2009 sys/
drwxr-xr-x. 14 root root  4096 11  2009 system/
-rw-r--r--.  1 root root  2608 11  2009 ueventd.rc
drwxr-xr-x.  2 root 2000  4096 11  2009 vendor

2.5 persist.img

这个镜像是linux ext4格式的,直接挂载即可

sun@sun-pc:~/android/imgs$ mkdir persist
sun@sun-pc:~/android/imgs$ sudo mount -o ro persist.img persist

sun@sun-pc:~/android/imgs$ ls persist
lost+found  sensors

2.6 vbmeta.img,vbmeta_system.img

这两个镜像文件暂时还没有找到相关解析方法,后续找到再更新

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 上,你可以使用 Intent 过滤器来接收系统分享的文件。下面是一个示例代码,展示如何接收并处理系统分享的文件: ```java public class ShareActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_share); // 获取分享的 Intent Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if (type.startsWith("image/")) { // 处理分享的图片 handleSharedImage(intent); } else if (type.startsWith("text/")) { // 处理分享的文本 handleSharedText(intent); } } } private void handleSharedImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // 在这里处理分享的图片 } } private void handleSharedText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // 在这里处理分享的文本 } } } ``` 在 AndroidManifest.xml 文件中,将该 ShareActivity 添加为一个接收分享的 Intent 过滤器: ```xml <activity android:name=".ShareActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="text/*" /> </intent-filter> </activity> ``` 这样,当用户分享图片或文本时,系统会启动 ShareActivity 并传递相关的数据给它,你可以在 `handleSharedImage()` 和 `handleSharedText()` 方法中对分享的文件进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星际工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值