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

使用方法:http://blog.csdn.net/asmcvc/article/details/11770851 工具: unyaffs,mkyaffs2image 其中unyaffs有windows版本和linux版本,mkyaffs2image只有linux版本。 windows版本的unyaffs用法: 把system.img复制到unyaffs的相同目录下,cmd命令下cd到unyaffs的目录下,然后执行命令:unyaffs system.img unyaffs会把system.img解压到其目录下。 linux版本的unyaffs用法: 把unyaffs复制到/usr/bin目录下,并修改权限为可执行。 然后cd到system.img目录下(假定目录为system目录),执行命令:unyaffs system.img 然后对system目录下的文件进行修改。 注意:修改完后的文件要修改一下权限,尽量和其他文件的权限保持一致。例如:chmod 644 framework-res.apk mkyaffs2image用法: 复制到/usr/bin目录下,并修改权限为可执行。 这里以打包system目录为system.img为例,执行命令: mkyaffs2image system system.img 然后把新生成的system.img复制替换掉原:adt-bundle-windows-x86\sdk\system-images\android-17\armeabi-v7a\system.img 执行bat批处理命令启动模拟器: D:\adt-bundle-windows-x86\sdk\tools\emulator-arm.exe -avd AndroidVM -partition-size 128 这里以修改android系统启动画面为例: 打开解包目录下的\framework\framework-res.apk 替换图片:framework-res.apk\assets\images\android-logo-mask.png为下图: 然后对\framework\framework-res.apk文件重新签名,复制到linux下后修改文件权限和原来一致。 然后mkyaffs2image system system.img打包生成新的system.img,替换原来的system.img,并启动模拟器,效果图如下: 修改代码: 工具:odextools(参考:《一键odex批量合并工具odextools的重新整理与使用》)、dexopt-wrapper 其中odextools.bat的代码: 批处理有一处bug:每打包一次会把odex文件删除掉,导致在后面的打包过程中会出现找不到:system/framework/core.odex类似的错误,因此只需要在打包完后不删除odex文件即可,找到del /f !apkx!.odex 1>nul 2>nul改为:::del /f !apkx!.odex 1>nul 2>nul,也就是注释掉这一行代码。 具体使用方法(操作在windows下): 在odextools\romdir目录下创建文件夹:system 利用unyaffs解包system.img后,把所有文件复制到system目录下。 然后运行odextools.bat,如图: 选择一个需要整合odex的目录选项即可。odextools.bat会自动设置环境变量,使用baksmali.jar来反编译odex为smali,然后再调用smali.jar打包为classes.dex, 然后再打包到相应的apk包(framework目录下对应的是jar后缀的,实际上也是个apk包),最后再重新签名。 如果要修改代码,则需要把上面重新打包生成的apk文件,利用常规方法反编译后修改smali代码,例如插桩输入log信息。然后再回编译并重新签名。 最后一步:因为system.img中的apk是优化过的,apk主目录下是没有classes.dex文件的,而是一个被优化过的odex文件,用于优化启动速度。 因此需要将修改后的apk包再用dexopt-wrapper优化apk包后生成出odex文件,然后删除apk包里的classes.dex,并在相同目录下放置与apk包同名的odex文件。 按照原system目录的文件结构组织好后,目录复制到linux环境下使用mkyaffs2image重新打包成system.img。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值