赞
踩
简称ABL,是Android设备的第一阶段引导程序。它的主要作用是:
ABL由设备厂商提供,需要适配具体的硬件平台。它使用专用的二进制格式,而不是标准的elf格式。
关于这几个概念,我们可以总结如下:
ABL代码示例(伪代码):
c
void abl_start(void)
{
/* Initialize hardware */
init_mem();
init_devices();
/* Load and verify boot.img */
bootimg = read_boot_partition();
if(!verify_bootimg(bootimg)) {
error();
}
/* Boot into boot.img */
jump_to_kernel(bootimg->kernel_addr, bootimg->ramdisk_addr,
bootimg->kernel_cmdline);
}
├── boot.img
│ ├── kernel (Linux内核)
│ ├── ramdisk (用于根文件系统)
│ ├── kernel_cmdline (内核启动参数)
│ ├── recovery_dtbo (Recovery设备树覆盖)
│ └── header
│ ├── kernel_size
│ ├── kernel_addr
│ ├── ramdisk_size
│ ├── ramdisk_addr
│ ├── second_size
│ ├── second_addr
│ ├── tags_addr
│ └── page_size
机器首先要启动,CPU 最先执行的一段程序就是 BootLoader,这和电脑上的BIOS是一个玩意儿。BootLoader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
BootLoader既然要做硬件初始化之类的,必然和硬件相关,所以它的代码并非通用的,不同的硬件需要不同的BootLoader代码,各大厂商可能都有自己的,并且加入开机画面之类的。最常听说的是uboot。我们常说的刷机,是不会动bootloader的,只会动这之后的系统部分。
BootLoader的主要功能是:
所以,简而言之,BootLoader是连接系统上电与操作系统内核启动之间的重要一环。它屏蔽了底层硬件差异,为操作系统提供统一的加载入口。
BootLoader通常存放在以下几种地方:
fastboot,它是bootloader后期进入的一个特殊阶段。可以通过数据线与电脑连接,然后在电脑上执行一些命令,刷系统镜像到手机上。fastboot可以理解为实现了一个简单的通信协议,接收命令并更新镜像文件,其他什么的干不了。
须有一个PC机并且USB线要始终联着。所以这种方式称为线刷。
fastboot需要bootloader的支持,所以不是每家手机都会支持这种模式。
如果没有进入fastboot,bootloader继续执行,如果又发现有特殊的按键组合,比如htc g2上是home键和开机键,则会进入recovery模式。分析recovery.img镜像文件就会发现,它里面包含了一个kernel以及一个可执行程序recovery,以及一些初始化文件。从某种意义来说,这就是一个小型操作系统,和正常启动进入的系统的kernel是一样的,只是init及之后干的事情不同。
这里的kernel和我们常说的linux内核还是有差异的,linux内核是包括kernel以及调度器内存管理等,除了显示界面外的完整系统。而kernel只是指内核init进程启动前的那一段逻辑。
在recovery模式下,会加载了部分文件系统,所以才可以读sdcard中的update.zip进行刷机,当然,也可以清除cache和用户数据。
Recovery恢复时,刷机包通常放在SD卡里,所以这里刷机一般称为卡刷。
在AOSP系统中,/vendor分区用于存放设备厂商提供的二进制文件和资源。将可执行程序放入/vendor/bin目录需要遵循以下步骤:
service your_program /vendor/bin/your_program
class main
user system
group system
makefile
LOCAL_MODULE := your_program
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/bin
根文件系统镜像通常会包含大部分系统所需要的二进制程序和文件,但不一定会包含所有的bin程序。这主要有以下几个原因:
分区主要包括以下三种
通用的Android分区包括:/boot /system /recovery /data /cache /misc
boot - 包含Linux内核、ramdisk和设备树,用于初始化系统。Linux嵌入式系统内核,这个分区上有Android的引导启动程序,包括内核和内存操作程序。没有这个分区设备就不能被引导。恢复系统的时候会擦除这个分区,并且必须重新安装引导程序和ROM才能重启系统,由boot.img烧录。包括.bootloader、内核、ramdisk根文件系统。 负责挂载,LinuxKernel,负载system,cache,userdata等。
system - 包含系统应用和库,是Android系统核心部分。系统文件、应用,这个分区上是除了内核和内存操作之外的整个操作系统。里面包含了Android用户接口和预先安装的系统应用。擦除了这个分区就会删除掉Andorid系统,所以你需要进入recovery模式或者bootloader模式去安装一个新的ROM。
recovery - 包含恢复系统的镜像。系统故障时负责恢复,recovery分区被认为是另一个启动分区,你可以启动设备进入recovery控制台去执行高级的系统恢复和管理操作。
userdata - 存储用户数据,如应用数据、下载的文件等。用户使用APP产生的缓存数据,这个分区保存着用户数据。通讯录、短信、设置和你安装的apps都在这个分区上。擦除这个分区相当于恢复出厂设置,当你第一次启动设备的时候或者在安装了官方或者客户的ROM之后系统会自动重建这个分区。当你执行恢复出厂设置时,就是在擦除这个分区。
缓存/cache - 存储缓存数据,用于提高系统性能。系统运行时产生的缓存,这个分区是Android系统存储频繁访问的数据和app的地方。擦除这个分区不影响你的个人数据,当你继续使用设备时,被擦除的数据就会自动被创建,一般用来OTA升级进入recovery前,临时存放OTA包升级的存放文件。
persist - 持久数据分区,存储系统设置信息。
/misc:临时数据分区 ,这个分区包含各种复杂的类似于on/off的系统设置。这些设置可能是USB配置和某些硬件配置信息。这是一个重要的分区,如果该分区损坏或者丢失,设备的功能可能就工作不正常。
/sdcard:这个分区不是内部的存储区,而是SD card。这是你个人存储大文件的地方,存储多媒体文件、文档、ROM文件等等。如果你备份了这个分区上文件,那么擦除这个分区将会很安全。不过请注意一些用户安装的apps会存储数据和设置参数到SD card上,擦除这个分区会掉的这些数据。大小根据SD卡容量而定,可热插拔。。
/sd-ext:这个分区不是Android设备的标准分区,位于手机存储器上,但是在修改版的自定义ROM的情况下变得很流行。大小在刷机或首次启动时确定,不可热插拔。
而其他一些分区属于具体硬件专有分区,如:
定制ROM系统增加的专有分区
定制ROM会在Android系统中新增一些专有分区,主要用于存储定制的数据与设置。常见的有:
所以,这些专有分区主要用于:
在Android系统中,大多数重要分区都会设置主备分区,用于实现备份与恢复的功能。
Android通常设置主备分区的分区有:
设置主备分区的好处是:
fastboot与QFIL是两种对Android设备进行刷机的方法:
fastboot刷机:
fastboot命令烧写:
fastboot flash boot boot.img #这个是刷入boot的命令。
fastboot flash recovery recovery.img #刷入recovery 已有recovery的可以跳过。
fastboot erase boot #擦除boot分区
fastboot erase system -w #擦除system分区 擦除 userdata分区和cache分区
fastboot erase system #擦除system分区
fastboot erase cache #擦除cache分区
fastboot erase userdata #擦除userdata分区
fastboot update update.zip #将update.zip刷入
fastboot reboot #重启手机
path: img所在路径
fastboot flash abl_a path\abl.elf
fastboot flash abl_b path\abl.elf
fastboot flash boot_a path\boot.img
fastboot flash boot_b path\boot.img
fastboot flash dtbo_a path\dtbo.img
fastboot flash dtbo_b path\dtbo.img
fastboot flash metadata path\metadata.img
fastboot flash persist path\persist.img
fastboot flash super path\super.img
fastboot flash userdata path\userdata.img
fastboot flash vbmeta_a path\vbmeta.img
fastboot flash vbmeta_b path\vbmeta.img
fastboot flash vbmeta_system_a path\vbmeta_system.img
fastboot flash vbmeta_system_b path\vbmeta_system.img
fastboot flash vendor_boot_a path\vendor_boot.img
QFIL刷机:
两种方式对比:
优点:
缺点:
所以,总结来说:
如果只是常规系统更新,fastboot方式简单高效。
如果系统损坏无法进入系统,需要彻底修复,QFIL方式更强大。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。