转载自:http://kongweile.iteye.com/blog/1008250

===============================================================

android的emulator的几点knowledge中,俺对android的各种disk images很好奇,一直想知道怎么去know和hack这些images,所以就有了这篇paper。


  1. 用file来查看文件类型
    • [email protected]:/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文件
    • [email protected]:/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
    • [email protected]:/tmp/images# gzip -d -S .img ramdisk.img
      [email protected]:/tmp/images# ls -lrt ramdisk
      -rw-r–r– 1 root root 260608 Oct 22 01:34 ramdisk
    • 可见ramdisk.img被解压成ramdisk,
    • [email protected]:/tmp/images# file ramdisk
      ramdisk: ASCII cpio archive (SVR4 with no CRC)
    • 可见ramdisk是个cpio文件,需要用cpio来extract
    • [email protected]:/tmp/images# mkdir ramdiskdir创建ramdiskdir来装ramdisk的内容
      [email protected]:/tmp/images# cd ramdiskdir/cd到该目录中
      [email protected]:/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
      [email protected]:/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相吻合
      [email protected]:/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

      [email protected]:/tmp/images/ramdir# find . -name "init*"|xargs md5sum
      c3cff931e494bb4872f0ebefe1dad548 ./init.rc
      90dd60a3458cce84901d12b362880339 ./init.goldfish.rc
      7a950533c62fe91300a5b31b12a38084 ./init

    • ls –lrt 这些文件

      [email protected]:/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 yaffs2rw 0 0
      /dev/block/mtdblock4/opl yaffs2rw 0 0
      /dev/block/mtdblock1/data yaffs2rw,nosuid,nodev 0 0
      /dev/block/mtdblock3/local yaffs2rw,nosuid,nodev 0 0
      /dev/block/mtdblock2/cache yaffs2rw,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了。

    [email protected]:/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. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写
  2. android的布局文件简介
  3. Android系列教程之四:Android项目的目录结构
  4. Android 数据存储之文件存储小记
  5. Android软件安装文件夹
  6. 详细解读Android中的搜索框(四)—— Searchable配置文件
  7. SDK中模拟器创建命令行!!!
  8. Android Studio 指定DEBUG和RELEASE版本打包时的APK文件名
  9. android am命令

随机推荐

  1. Android(安卓)中Observer模式的使用
  2. Android(安卓)之主题
  3. android开发秘籍笔记
  4. Android(安卓)Audio Effect 机制初探
  5. Android――Dialog
  6. android按钮点击——implements View.OnC
  7. Android(安卓)App 版本更新
  8. Android(安卓)模糊搜索rawquery bind or
  9. Android(安卓)Day02
  10. android中加载assets中的资源文件