在android的emulator的几点knowledge中,俺对android的各种disk images很好奇,一直想知道怎么去know和hack这些images,所以就有了这篇paper。 1. 用file来查看文件类型 * chenjian@ubuntu8:/tmp/images$ file * kernel-qemu: data local.img: data ramdisk.img: gzip compressed data, from Unix, last modified: Thu Oct 22 16:30:38 2009 system.img: VMS Alpha executable userdata.img: VMS Alpha executable opl.img: VMS Alpha executable * 可见有三种,data, gzip和VMS Alpha executable; * 再看从avd目录取得的image文件 * chenjian@ubuntu8:/tmp/images/HVGA.avd$ file * cache.img: VMS Alpha executable userdata.img: VMS Alpha executable userdata-qemu.img: data * 仍然没有逃脱以上三种image类型。 * 用表格表示如下 文件类型 文件 data kernel-qemu local.img userdata-qemu.img gzip ramdisk.img VMS Alpha executable system.img userdata.img(images目录) opl.img userdata.img(avd目录) cache.img 2. ramdisk.img * 可以使用这个命令来查看ramdisk.img * root@ubuntu8:/tmp/images# gzip -d -S .img ramdisk.img root@ubuntu8:/tmp/images# ls -lrt ramdisk -rw-r–r– 1 root root 260608 Oct 22 01:34 ramdisk * 可见ramdisk.img被解压成ramdisk, * root@ubuntu8:/tmp/images# file ramdisk ramdisk: ASCII cpio archive (SVR4 with no CRC) * 可见ramdisk是个cpio文件,需要用cpio来extract * root@ubuntu8:/tmp/images# mkdir ramdiskdir 创建ramdiskdir来装ramdisk的内容 root@ubuntu8:/tmp/images# cd ramdiskdir/ cd到该目录中 root@ubuntu8:/tmp/images/ramdiskdir# cpio -idmv <../ramdisk 使用cpio来extractramdisk文件 data default.prop dev init init.goldfish.rc init.rc proc sbin sbin/adbd sys system 509 blocks root@ubuntu8:/tmp/images/ramdiskdir# ls 这就是被打包在ramdisk中的文件 data default.prop dev init init.goldfish.rc init.rc proc sbin sys system * 使用find和file来看这些文件,发现init其实是个ARM arch的可执行文件,这也和emulator中所说的linux是ARM arch相吻合 root@ubuntu8:/tmp/images/ramdiskdir# find . -type f|file -f - ./default.prop: ASCII text ./init.rc: ASCII English text ./init.goldfish.rc: ASCII English text ./init: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped ./sbin/adbd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped * 查看某些文件的md5 root@ubuntu8:/tmp/images/ramdir# find . -name "init*"|xargs md5sum c3cff931e494bb4872f0ebefe1dad548 ./init.rc 90dd60a3458cce84901d12b362880339 ./init.goldfish.rc 7a950533c62fe91300a5b31b12a38084 ./init * ls –lrt 这些文件 root@ubuntu8:/tmp/images/ramdir# find . |grep init|xargs ls -lrt -rwxr-x— 1 root root 11875 Jan 1 1970 ./init.rc -rwxr-x— 1 root root 2138 Jan 1 1970 ./init.goldfish.rc -rwxr-x— 1 root root 127548 Jan 1 1970 ./init 3. data data文件共有这么几个,kernel-qemu,local.img和userdata-qemu.img。 什么是data文件?如何使用这些文件?我们面临着么两个问题 4. VMS Alpha executable VMS Alpah executable共有这么几个system.img,userdata.img,opl.img,userdata.img和cache.img。 什么是VMS Alpha executable?如何使用这些文件?我们面临这么两个问题。。。 5. adb shell(1.5版本) 使用这个命令据说可以在emulator起来以后进入到android os的shell中,我们来看看、 * D:Program FilesOPhoneSDK_1.5.betatools>adb shell # pwd pwd / * # ls -l ls -l lrwxrwxrwx root root 2010-01-31 15:03 preload -> /system/preload drwxr-xr-x root root 2010-01-31 15:03 Linux lrwxrwxrwx root root 2010-01-31 15:03 bin -> /opl/telephony/bin lrwxrwxrwx root root 2010-01-31 15:03 usr -> /opl/telephony/usr lrwxrwxrwx root root 2010-01-31 15:03 lib -> /opl/telephony/lib drwxrwxrwt root root 2010-01-31 15:05 tmp drwxrwxrwt root root 2010-01-31 15:05 sqlite_stmt_journals drwxrwx— system cache 2009-12-20 10:11 cache drwxr-xr-x system system 2009-10-10 13:11 opl drwxrwxrwx system system 2009-10-24 01:48 local d——— system system 2010-01-31 15:03 sdcard drwxr-xr-x root root 2010-01-31 15:03 d lrwxrwxrwx root root 2010-01-31 15:03 etc -> /system/etc drwxr-xr-x root root 2009-10-22 16:20 system drwxr-xr-x root root 1970-01-01 08:00 sys drwxr-x— root root 1970-01-01 08:00 sbin dr-xr-xr-x root root 1970-01-01 08:00 proc -rwxr-x— root root 11875 1970-01-01 08:00 init.rc -rwxr-x— root root 2138 1970-01-01 08:00 init.goldfish.rc -rwxr-x— root root 127548 1970-01-01 08:00 init -rw-r–r– root root 118 1970-01-01 08:00 default.prop drwxrwx–x system system 2009-12-20 10:11 data drwx—— root root 1970-01-01 08:00 root drwxr-xr-x root root 2010-01-31 15:04 dev * 果然,可以run一些linux下的基本命令,如ls,pwd等,证明了我们确实是获得了一个linux shell * 另外黄颜色显示的文件和我们在ramdisk中看到的文件似乎大小一致,暗示它们是同一。 * run mount to see有那些文件系统被mount了 # mount mount rootfs / rootfs ro 0 0 tmpfs /dev tmpfs rw,mode=755 0 0 devpts /dev/pts devpts rw,mode=600 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0 tmpfs /tmp tmpfs rw 0 0 /dev/block/mtdblock0 /system yaffs2 rw 0 0 /dev/block/mtdblock4 /opl yaffs2 rw 0 0 /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0 /dev/block/mtdblock3 /local yaffs2 rw,nosuid,nodev 0 0 /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0 * 我们看见了system,opl,data,local和cache;恩,这些名字和那个表格里的data/VMS Alpha Executable似乎有些重合 /system,/opl和/cache是VMS Alpha Executable的system.img,opl.img和cache.img转换而来 /local是data的local.img转换而来 /data嘛,就不太好判断,不知道和userdata.img和userdata-qemu.img有什么关系没? 但至少我们知道可以查看/system来明白system image包含哪些东西了吧。。。,比如/system/framework就是android的framework啦 也可以知道可以查看/cache来明白什么是cache image的内涵了吧。。。 对于local image同理可得。。。 * 另外,adb shell提供的command有限,比如没有zcat,cp,uname和busybox等,有没有办法能将这些命令加入进去呢? 到这里下载busybox,http://benno.id.au/blog/2007/11/14/android-busybox,然后按照提示将busybox push至/data/busybox目录,install后即可运行所有的busybox applet。比如: # /data/busybox/zcat /proc/config.gz|/data/busybox/more /data/busybox/zcat /proc/config.gz|/data/busybox/more # # Automatically generated make config: don’t edit # Linux kernel version: 2.6.25 # Mon Nov 10 05:02:15 2008 所以我们就能知道1.5的Android用的linux kernel是2.6.25版本的。。。 6. kernel在哪里? 7. 什么是yaffs2? http://en.wikipedia.org/wiki/YAFFS2 ok,这又是一种新的文件系统,designed specially for NAND chips;YAFFS2是YAFFS的第二版,为了适应新的NAND chips,这些新chip的page size有2048bytes,plus 64bytes的spare areas;老版本的NAND chips的page是512bytes,plus 16bytes spare area。 8. 这些disk images从何而来? 从这篇文章编译Android1.5里能否得到一些启示? 在编译android1.5后,其实我们能得到3个img文件,似乎可以下断言,这三个image是在编译android的过程中得到的。有关生成他们的过程又是另外一个话题,估计得去读makefile了。 root@ubuntu8:/ophone/android-1.5# find . -name *.img ./out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img ./out/target/product/generic/userdata.img ./out/target/product/generic/system.img ./out/target/product/generic/ramdisk.img BTW, out目录是在编译过程中产生的目录,其余目录则是source目录 9. 如何增大/data目录的大小? /data目录缺省大小仅有64M,这导致在调试某些大apk时,emulator会报告insufficient storage,为了解决这个问题,可以使用emulator的-partition-size来指定/data目录的大小;从下列命令可以看出userdata.img被map成mtd1,而mtd1又被mount成/data # mount mount rootfs / rootfs ro 0 0 tmpfs /dev tmpfs rw,mode=755 0 0 devpts /dev/pts devpts rw,mode=600 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0 none /dev/cpuctl cgroup rw,cpu 0 0 /dev/block/mtdblock0 /system yaffs2 ro 0 0 /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0 /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0 # cat /proc/mtd cat /proc/mtd dev: size erasesize name mtd0: 07c20000 00020000 "system" mtd1: 07c20000 00020000 "userdata" mtd2: 04000000 00020000 "cache"

更多相关文章

  1. Ubuntu下搭建Android(安卓)NDK开发环境
  2. android之selector使用
  3. Android如何调用第三方SO库
  4. android 引入jni 的so库的方法
  5. android studio template模块开发
  6. Android(安卓)adb的常用命令
  7. Android之几个dos小命令
  8. ANDROID Porting系列二、配置一个新产品
  9. android 获取路径目录方法以及判断目录是否存在,创建目录

随机推荐

  1. Android SDCard Mount 流程分析
  2. 浅谈android的selector背景选择器
  3. android打开第三方APP
  4. Android 获取USB扫描枪简易封装
  5. Android(安卓)常用的系统服务简介
  6. 【转】Android 技术-- 图形系统详解
  7. android 各种控件颜色值
  8. Android Studio按钮响应事件(三)
  9. Android提供了Animation
  10. Android 内存泄漏