android

在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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值