Android鏡像文件的拆解
前言:最近新入手了一台電信版的Android手機,由於厭惡其中預裝的各種應用,也想按照自己的意願裁剪一下手機中的應用,所以對此進行了一些學習。我找到了一個HTC的RUU包,從中解析到了system.img,發現這個system.img不是EXT4格式的,不能簡單的在Ubuntu上掛載,於是在網上找到了一篇說明Android裡面各種分區拆解的文章。我做了翻譯和補充,供大家參考。
RAMDISK
RAMDISK(initrd)是一個小的分區鏡像,在引導時內核以只讀方式掛載它。它只保護/init和一些配置文件。它用於初始化和掛載其它的文件系統鏡像。RAMDISK是一個標準的Linux特性。
ramdisk.img被包含Google android SDK中($SDK_ROOT/tools/lib/images/ramdisk.img),也可以編譯生成($SDK_ROOT/out/target/product/$PRODUT_NAME/ramdisk.img)。這是一個gzip壓縮的CPIO文件。
修改Android的RAMDISK鏡像
要修改它,首先複製它到你的Linux機器上,並用如下命令解開:
user@computer:$ mv ramdisk.img ramdisk.cpio.gz
gzip -d ramdisk.cpio.gz
mkdir ramdisk
cd ramdisk
cpio -i -F ../ramdisk.cpio
解開後,做一些你的修改和刪除無用的文件後,通過如下命令重新創建ramdisk.cpio:
user@computer:$ cpio -i -t -F ../ramdisk.cpio | cpio -o -H newc -O ../ramdisk_new.cpio
然後可以重新改名並壓縮:
user@computer:$ cd ..
gzip ramdisk_new.cpio
mv ramdisk_new.cpio.gz ramdisk.img
SYSTEM和DATA鏡像
system.img是掛載到 / 下的鏡像,它包含了全部的系統可執行文件。
userdata.img掛載到 /data 下的鏡像,它包含了應用及用戶相關的數據。
在實際的物理設備中,他們通過ramdisk中的init.rc腳本掛載為文件系統。它們可以有各種不同的格式,如 YAFFS2、EXT4或 UBI-FS。
它們通過Android構建系統生成並刷入到物理設備中。模擬器對它們的使用有所不同(見下文):
Android模擬器鏡像
- system.img 被複制到一個臨時文件中,用於模擬器工作。所以你對模擬器中的根目錄做的任何改變都會在模擬器退出後丟失。
- userdata.img 只用於使用了 -wipe-data參數時。通常將~/.android/userdata-qemu.img(linux下)作為 /data 分區鏡像掛載,而使用 -wipe-data 時會複製userdata.img中的內容到userdata-qemu.img。
- sdcard.img 用於使用了-sdcard參數時,掛載到/sdcard
- cache.img 用於使用了-cache參數來指定/cache內容。如果未指定該參數,模擬器啟動時會創建一個空的臨時文件掛載到/cache上。這個臨時文件會在退出時自動清除。
模擬器不會修改system.img和userdata.img。
拆解Android』s YAFFS2 鏡像
一個YAFFS2文件在Linux被識別為「VMS Alpha executable」文件。
user@computer:$ file ${SDK_ROOT}}/out/target/product/imx51_ccwmx51js/system.img
./out/target/product/imx51_ccwmx51js/system.img: VMS Alpha executable
從Google代碼站中下載 unyaffs 。
如果上面的可執行文件在你的系統不工作的話,你也可以下載 源代碼 並重新編譯它。
user@computer:$ gcc -o unyaffs unyaffs.c
sudo chmod +x /complete/directory/path/to/unyaffs
然後使用這個命令來拆解 YAFF2 鏡像文件:
user@computer:$ mkdir image
cd image
unyaffs ../system.img
拆解EXT4鏡像
如果鏡像是EXT4,那麼很簡單,直接掛載就可以讀取其中的內容了:
user@computer:$ mount -o loop -t ext4 system.img /media
拆解JFFS2鏡像
作為補充,這裡說一下如何拆解JFFS2鏡像:
user@computer:$ modprobe mtdblock
modprobe jffs2
modprobe mtdram total_size=65536 erase_size=256
mknod /tmp/mtdblock0 b 31 0
dd if=/pathtoimage/rootfs.jffs2 of=/tmp/mtdblock0
mount -t jffs2 /tmp/mtdblock0 /mnt
原文鏈接:http://www.lindusembedded.com/blog/2012/02/23/androids-partition-images/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive