转自http://yueguc.javaeye.com/blog/820675

android文件系统制作教程(1) —- 认识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 initlogo.rle
  
#然后将initlogo.rle拷贝到android系统根目录,也就是root目录底下
cp initlogo.rle root/
  
#删除中间文件
rm -f logo.raw

更多相关文章

  1. android通过USB的MTP模式下,禁止用户在根目录有任何操作(重命名 删
  2. android 驱动文件权限设置
  3. Android zip文件压缩解压
  4. xml文件中xmlns含义
  5. android中webView JS调用Android的方法、webView的下拉刷新(Swipe
  6. Android根据文件路径加载指定文件
  7. Android 7.0 使用FileProvider 在应用间共享文件
  8. android 实用sax 读取xml文件内容
  9. Android 打开相机、相册获取图片文件,支持Android 9.0系统

随机推荐

  1. Android(安卓)TextView 设置行间距字间距
  2. android中颜色参考
  3. Android布局属性讲解标签属性
  4. Android(安卓)Animation无限循环动画
  5. Android(安卓)漂浮的Activity
  6. Android中有关布局的几个问题
  7. android 更新列表
  8. TextView滚动效果
  9. Android消息机制浅析——原理探究
  10. Android之GridView