android文件系统及其制作

  • Android文件系统具有什么样的结构?我们如何才能将这一文件系统分离出来?又能以何种方式挂载文件系统呢?这些问题都会在文中找到具体的解决答案。
  • 用过Linux的朋友可能对开源的系统有一个非常好的印象。那么在日益成熟的手机操作系统中,有没有一款像Linux一样的开源系统呢?谷歌公司就退出了一款基于Linux平台的Android 操作系统来满足人们的需求。在这里大家可以先来了解一下Android文件系统的相关内容。

    1、Android文件系统的结构

    Android源码编译后得到system.img,ramdisk.img,userdata.img映像文件。其中, ramdisk.img是emulator的文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,emulator加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。因此,我们可以把ramdisk.img里的所有文件复制出来,system.img和userdata.img分别解压到 ramdisk文件系统中的system和 userdata目录下。

    2、分离Android文件系统出来

    system.img,ramdisk.img,userdata.img映像文件是采用cpio打包、gzip压缩的,可以通过file命令验证:

      
      
    1. file ramdisk.img 

    输出:

      
      
    1. ramdisk.img: gzip compressed data, from Unix,  last modified: Wed Mar 18 17:16:10 2009 

    Android源码编译后除了生成system.img,userdata.img之外还生成system和 userdata文件夹,因此不需要解压它们。Android源码编译后还生成root文件夹,其实root下的文件与 ramdisk.img 里的文件是一样的,不过这里还是介绍怎样把 ramdisk.img解压出来:

    将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

      
      
    1. gunzip ramdisk.img.gz 

    然后新建一个文件夹,叫ramdisk吧,进入,输入命令

      
      
    1. cpio -i -F ../ramdisk.img 

    这下,你就能看见并操作ramdisk里面的内容了。

    然后把Android源码编译后生成的system和 userdata里的文件复制到 ramdisk/system和 ramdisk/userdata下。这样就得到一个文件系统了。

    3、使用网络文件系统方式挂载Android文件系统

    因此,我们需要建立/nfsroot目录,再建立/nfsroot/Androidfs目录,把刚才的Android文件系统改名为Androidfs,并链接到/nfsroot/Androidfs

    4、Android文件系统内核引导文件系统

    Android内核挂载/nfsroot/Androidfs之后,根据init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:

    1)设置一些环境变量

    2)创建system、sdcard、data、cache等目录

    3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals

    4)设置一些文件的用户群组、权限

    5)设置一些线程参数

    6)设置TCP缓存大小

    android文件系统制作:

    splash1 :开机画面,Nandroid备份为splash1.img
    recovery :设备序列号为mtd1,该分区是恢复模式(即开机按Home+End进入的界面),Nandroid备份为recovery.img
    boot :设备序列号为mtd2,底层操作系统内核启动分区,挂载 为/目录,Nandroid备份为boot.img
    system :设备序列号为mtd3,G1的Android核心平台,挂 载为/system目录,通常为只读,Nandroid备份为system.img
    cache :设备序列号为mtd4,G1的缓存临时文件夹,挂载为 /cache目录,事实上除了T-mobile的OTA更新外,别无用处,Nandroid备份为cache.img
    userdata :设备序列号为mtd5,G1中用户安装的软件以及各种 数据,挂载为/data目录,Nandroid备份为data.img

     

    android文件系统制作教程(2) —- 常用的fastboot命令

    • 重启G1:
      $ fastboot reboot
    • 刷所有分区并重启手机
      $ fastboot flashall
    • 刷指定分区:
      $ fastboot flash {partition} {file.img}
      如:fastboot flash system /备份/system.img
    • 擦除分区:
      $ fastboot erase {partition}
      如:fastboot erase system
    • 使用update.zip整体刷新
      $ fastboot update {update.zip}
    • 刷自定义开机画面:
      $ fasboot flash splash1 mysplash.rgb565

      android文件系统制作教程(3) —- 利用Makefile制作update.zip

      从update.zip这个刷机包反推的介绍整个android文件系统的制作过程

      并编写了一个Makefile文件,利用 Makefile的”依赖检查”机制管理各种文件的生成步骤和依赖关系;

      -1.前期准备

      将所有的文件都放在/home/xiaoliang/workspace 目录下,目录下有这些文件夹:

      auto-sign data system META-INF root

      两个环境变量含义和必须的目录:

      SRC_HOME : android源代码所在的目录,例如我放在 /home/xiaoliang/android_src 下

      JAVA_HOME: JAVA SDK的目录,我的是 /server/jdk1.5.0_21

      0.进行一次源代码编译
      1.然后看下面的Makefile

      #设置环境变量,JAVA_HOME默认就有
      SRC_HOME=/home/liangwei/android_src
        
      #它依赖于system,data,META-INF三个目录和一个boot.img镜像,并且它需要签名
      update.zip : boot.img $(shell find system data META-INF)
          #生成update_unsign.zip
          zip -qr update_unsign.zip system data META-INF boot.img
          #签名
          $(JAVA_HOME)/bin/java -jar auto-sign/signapk.jar auto-sign/testkey.x509.pem auto-sign/testkey.pk8 update_unsign.zip update.zip
          #删除中间文件
          rm -f update_unsign.zip
        
      #依赖于ramdisk.img 和 kernel.img 两个镜像
      boot.img:ramdisk.img kernel.img
          #使用mkbootimg制作
          $(SRC_HOME)/out/host/linux-x86/bin/mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel kernel.img --ramdisk ramdisk.img -o boot.img
        
      #其实它就是源码编译后生成的zImage,拷贝过来改个名字
      kernel.img:$(SRC_HOME)/kernel/msm/arch/arm/boot/zImage
          cp -f $(SRC_HOME)/kernel/msm/arch/arm/boot/zImage ./kernel.img
        
      #是将root文件夹使用mkbootfs制作的镜像
      ramdisk.img:$(shell find root)
          $(SRC_HOME)/out/host/linux-x86/bin/mkbootfs ./root |gzip > ramdisk.img

      2.总结一下,其实update.zip主要就是三个部分组成:

      启动部分: root文件夹 + zImage内核镜像 = boot.img
      系统文件部分: system文件夹
      用户文件部分: data文件夹

      就是:root + system + data + zIamage = update.zip

      3.文件的出处

      root,system,data文件夹: 来自”$(SRC_HOME)/out/target/product/generic”
      zIamage: 来自”$(SRC_HOME)/kernel/msm/arch/arm/boot/zImage”

      4.刷机脚本:META-INF文件夹

      该需要自己创建,并且里面包含1个文件 : com/google/android/update-script ,内容为:

      show_progress 0.500000 0
      format SYSTEM:
      copy_dir PACKAGE:system SYSTEM:
      set_perm_recursive 0 0 0755 0644 SYSTEM:
      set_perm_recursive 0 2000 0755 0755 SYSTEM:bin
      set_perm 0 3003 02755 SYSTEM:bin/netcfg
      set_perm 0 3004 02755 SYSTEM:bin/ping
      set_perm 0 0 04755 SYSTEM:bin/su
      set_perm 1002 1002 0440 SYSTEM:etc/dbus.conf
      set_perm 1014 2000 0550 SYSTEM:etc/dhcpcd/dhcpcd-run-hooks
      set_perm 0 2000 0550 SYSTEM:etc/init.goldfish.sh
      set_perm_recursive 0 0 0755 0555 SYSTEM:etc/ppp
      show_progress 0.200000 0
      delete_recursive DATA:dalvik-cache
      copy_dir PACKAGE:data DATA:
      set_perm_recursive 1000 1000 0771 0555 DATA:dalvik-cache
      write_raw_image PACKAGE:boot.img BOOT:
      show_progress 0.200000 10

       

      android文件系统制作教程(4) —- makefile脚本,制作各种单独的分区文件ramdisk.img,system.img,boot.img

      #***********************************
      #    build android rom script
      #***********************************
      SRC_HOME=/home/liangwei/android_src
        
      update.zip : boot.img $(shell find system data META-INF)
          rm -rf update_unsign.zip
          zip -qr update_unsign.zip system data META-INF boot.img
          $(JAVA_HOME)/bin/java -jar auto-sign/signapk.jar auto-sign/testkey.x509.pem auto-sign/testkey.pk8 update_unsign.zip update.zip
          rm -f update_unsign.zip
        
      boot.img:ramdisk.img kernel.img
          $(SRC_HOME)/out/host/linux-x86/bin/mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel kernel.img --ramdisk ramdisk.img -o boot.img
        
      kernel.img:$(SRC_HOME)/kernel/msm/arch/arm/boot/zImage
          cp -f $(SRC_HOME)/kernel/msm/arch/arm/boot/zImage ./kernel.img
        
      kernel-qemu:$(SRC_HOME)/kernel/common/arch/arm/boot/zImage
          cp -f $(SRC_HOME)/kernel/common/arch/arm/boot/zImage ./kernel-qemu
        
      ramdisk.img:$(shell find root)
          $(SRC_HOME)/out/host/linux-x86/bin/mkbootfs ./root |gzip > ramdisk.img
        
      system.img : $(shell find system)
          $(SRC_HOME)/out/host/linux-x86/bin/mkyaffs2image ./system system.img
        
      userdata.img:$(shell find data)
          $(SRC_HOME)/out/host/linux-x86/bin/mkyaffs2image ./data userdata.img
        
      userdata-qemu.img:userdata.img
          rm -rf userdata-qemu.img
          cp userdata.img userdata-qemu.img

      initlogo.rle:logo.png
          convert -depth 8 logo.png rgb:logo.raw
          $(SRC_HOME)/out/host/linux-x86/bin/rgb2565 -rle <logo.raw >initlogo.rle
          cp -rf initlogo.rle data/data/com.android.mysplash/
          rm -rf logo.raw
        
      .PHONY:run
      run:system.img ramdisk.img kernel-qemu userdata-qemu.img
          /server/android-sdk-linux_86/tools/emulator -show-kernel -sysdir ./

       

      android文件系统制作教程(5) —- 两行命令从png制作启动界面initlogo.rle

      用图片工具编辑好想要的png之后,保存为logo.png

      在logo.png所在命令下执行命令:

      #使用ImageMagick自带的convert命令,进行raw格式转换
      convert -depth 8 logo.png rgb:logo.raw
        
      #android自带的rgb2565工具,对raw文件进行rle565格式转换
      $(SRC_HOME)/out/host/linux-x86/bin/rgb2565 -rle <logo.raw >initlogo.rle
        
      #然后将initlogo.rle拷贝到android系统根目录,也就是root目录底下
      cp initlogo.rle root/
        
      #删除中间文件
      rm -f logo.raw

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值