Linux中國

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

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國