安卓启动与镜像刷机

这篇具有很好参考价值的文章主要介绍了安卓启动与镜像刷机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Boot Loader

简称ABL,是Android设备的第一阶段引导程序。它的主要作用是:

  • 初始化硬件设备,设置内存等
  • 加载并校验Android Boot Image(boot.img)
  • 传递控制权给boot.img继续下一阶段的引导

ABL由设备厂商提供,需要适配具体的硬件平台。它使用专用的二进制格式,而不是标准的elf格式。
关于这几个概念,我们可以总结如下:

  • elf格式:一种常见的二进制可执行文件格式,定义了文件内容和布局。gcc编译的程序默认使用此格式。
  • Android Boot Loader(ABL):Android设备的第一阶段引导程序,由设备厂商提供,用于初始化硬件和加载boot.img。使用专有的二进制格式,而不是elf。
  • boot.img:Android的第二阶段引导程序,包含Linux内核和ramdisk。ABL将其加载并执行,引导进入Linux系统。
  • gcc:Linux下常用的编译器,生成的可执行程序默认为elf格式。
    所以,elf格式定义了标准的二进制文件布局和执行信息;ABL作为 Android启动的第一步,使用专有格式执行硬件初始化和加载boot.img;boot.img然后引导Linux系统启动;gcc生成的程序为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的主要功能是:

  1. 初始化硬件设备 - 初始化CPU、内存控制器、时钟等硬件设备。
  2. 加载操作系统内核 - 从存储设备(硬盘、NAND Flash等)读取操作系统内核并加载到内存。
  3. 转交控制权给内核 - 将控制权转交给操作系统内核,BootLoader的工作至此完成。

所以,简而言之,BootLoader是连接系统上电与操作系统内核启动之间的重要一环。它屏蔽了底层硬件差异,为操作系统提供统一的加载入口。
BootLoader通常存放在以下几种地方:

  1. ROM - 集成在主板上的ROM芯片中,内容无法修改。
  2. Flash - 独立的非易失性Flash芯片中,内容可以通过烧写程序更新。
  3. 硬盘分区 - 保存在硬盘的特定分区中,内容可以通过工具更新

fastboot:

fastboot,它是bootloader后期进入的一个特殊阶段。可以通过数据线与电脑连接,然后在电脑上执行一些命令,刷系统镜像到手机上。fastboot可以理解为实现了一个简单的通信协议,接收命令并更新镜像文件,其他什么的干不了。
须有一个PC机并且USB线要始终联着。所以这种方式称为线刷。
fastboot需要bootloader的支持,所以不是每家手机都会支持这种模式。

recovery:

如果没有进入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卡里,所以这里刷机一般称为卡刷。

安卓系统的镜像文件

  • abl.elf:
    Android Boot Loader,第一阶段的引导程序。用于初始化设备并加载Bootloader。是一个可执行文件,包含启动相关的代码,通常由芯片厂商提供,用于加载 Bootloader。
  • boot.img:
    Boot Image,第二阶段的引导程序。包含Kernel和Ramdisk,用于加载Linux内核并挂载系统分区。负责启动 Android 系统的核心部分.
  • dtbo.img:
    Device Tree Blob Overlay Image。包含设备树覆盖数据,提供对原设备树的修补和定制。
    设备树和其他硬件相关的二进制文件,通常与 Android 版本匹配;
  • metadata.img:
    包含系统分区表和分区信息,用于引导过程中查找正确的分区。文件系统的元数据信息,用于指导 super.img 的创建和管理
  • persist.img:
    用于存储系统设置等持久化数据的分区镜像。存储设备的数据和状态,包括 WiFi、蓝牙、屏幕亮度等信息,通常不会随着系统重置而被删除
  • super.img:
    system_root分区镜像,包含操作系统根文件系统和内核。包含系统镜像(system)、供应商镜像(vendor)和产品镜像(product)等内容,以动态分区的形式组装成一个文件
  • userdata.img:
    用于存储用户数据和应用数据的分区镜像。用户数据分区,包含用户安装的应用程序、配置信息、照片、音乐等个人数据;
  • vbmeta.img:
    Verified Boot Metadata Image。包含设备的Verified Boot信息,用于启动验证过程。针对 Android 9 及以上版本,包含公钥,用于验证系统分区的完整性;
  • vbmeta_system.img:
    system分区对应的Verified Boot Metadata Image。
  • vendor_boot.img:
    厂商定制的引导镜像,包含硬件相关的内核和驱动。
    包含 Android 系统所需的驱动程序和二进制文件,通常用于更新和修复系统。
    所以,这些img文件主要用于Android系统的启动过程和分区组织。abl.elf、boot.img和vendor_boot.img参与系统引导;super.img和userdata.img分别提供操作系统和用户数据;persist.img存储设置;vbmeta.img和vbmeta_system.img用于启动验证。
    理解这些img文件的作用有助于我们深入研究Android启动机制和文件系统布局。我们会继续深入分析这些组件及其在启动过程中的配合关系。

在AOSP系统中,/vendor分区用于存放设备厂商提供的二进制文件和资源。将可执行程序放入/vendor/bin目录需要遵循以下步骤:

  1. 添加程序到/vendor分区
    先将编译好的程序二进制文件复制到/vendor分区下合适的位置,一般是/vendor/bin目录。
  2. 添加执行权限
    程序文件需要有执行权限,我们可以通过以下命令为其添加:
    bash
    chmod 755 /path/to/vendor/bin/your_program
  3. 添加到/vendor/etc/init/hw/init.rc 文件
    如果程序是一个系统服务,需要在init.rc文件中添加其启动脚本以在系统启动时启动。
    例如:
service your_program /vendor/bin/your_program 
    class main 
    user system 
    group system
  1. 在Android.mk添加LOCAL_MODULE定义
    如果程序由设备厂商编译得到,那么必须在编译流程的Android.mk中添加LOCAL_MODULE定义,以指定程序名和最终安装位置。
    例如:
makefile
LOCAL_MODULE := your_program 
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/bin
  1. 添加权限(可选)
    如果程序需要访问系统权限或硬件资源,需要在/vendor/etc/permissions/* 文件下添加相应权限声明。
  2. 添加与初始化 (可选)
    如果程序是一个系统服务,可能还需要添加初始化脚本文件在/vendor/etc/init/hw/下和Android init配置项。
  3. 重新编译系统映像
    添加完程序和资源后,需要重新编译生成vendor.img和其它系统映像。烧录到设备上后即可使用添加的程序。
    所以,将可执行程序添加到AOSP系统的/vendor/bin主要涉及添加必要的文件与权限,定义编译流程,以及完成初始化配置。理解这个过程有助于我们熟练定制AOSP的/vendor映像,在系统中集成第三方二进制程序和驱动。

根文件系统镜像通常会包含大部分系统所需要的二进制程序和文件,但不一定会包含所有的bin程序。这主要有以下几个原因:

  1. 空间限制
    根文件系统的空间是有限的,不可能包含所有的程序,特别是第三方的应用程序。一般只会包含基本的系统工具和服务。
  2. 权限限制
    一些程序需要访问系统低级权限或硬件资源,不适合直接在用户空间运行。这类程序通常作为系统服务在更低级别运行。
  3. 定制需求
    某些bin程序可能由设备厂商自行开发和提供,更适合放在/vendor分区而不是根文件系统。
  4. 功能划分
    基于功能和安全考虑,一些程序被划分到不同的分区运行,如/system分区的程序只能访问Java API等。
  5. 模块设计
    为了实现模块化设计和更好维护,某些功能会被划分到不同的软件包中,这些软件包的程序文件也不会直接在根文件系统。
    所以,根文件系统中通常只包含基本的系统工具和服务,而更高级和定制的功能会被划分到不同的分区和软件包中实现。这有助于实现权限隔离、模块化设计以及更好的系统维护。

安卓系统的分区

分区主要包括以下三种

  • 通用Android分区
  • 高通或其他硬件专有分区
  • 定制ROM系统增加的专有分区

通用的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的情况下变得很流行。大小在刷机或首次启动时确定,不可热插拔。

而其他一些分区属于具体硬件专有分区,如:

  • abl - Qualcomm芯片引导加载程序分区。
  • hyp - Qualcomm hypervisorvisor分区。
  • dtbo - 设备树 Blob分区,某些高通平台专有。
  • vbmeta - 验证元数据分区,高通AVB实现专有。
  • super - ext4分区,一些高通平台使用。
  • vendor_boot - 第三方供应商boot镜像分区,高通AVB实现专有。
  • metadata - 不常见,某些高通平台使用,作用未详。

定制ROM系统增加的专有分区
定制ROM会在Android系统中新增一些专有分区,主要用于存储定制的数据与设置。常见的有:

  1. META分区 - 用于存储ROM版本信息、ROM定制功能与设置等数据。该分区只能在该ROM下使用,升级其他ROM会格式化该分区。
  2. CSC分区 - 用于存储ROM国家与carrier相关的个性化定制包。OTA更新会保留该分区数据。
  3. USERDATA分区 - 用于存储用户数据与应用数据。OTA升级会保留该分区数据。
  4. CACHE分区 - 用于存储更新包、居 Evolution X 系统更新数据以实现无缝更新。OTA升级会格式化该分区。
  5. PERSIST分区 - 用于永久存储ROM与device相关的设置。OTA升级会保留该分区数据。

所以,这些专有分区主要用于:

  • 存储ROM自身的版本、定制与个性化数据。
  • 存储用户数据与设置,可保留避免数据丢失。
  • 辅助ROM更新与功能实现。
  • 提供ROM专有的存储空间。
    定制ROM会根据自身的功能与需求,选择性地增加适当的分区。并非每款ROM都会增加所有的这些分区,部分定制ROM甚至不增加任何专有分区。
    这需要基于该ROM的设计与用途进行判断。

在Android系统中,大多数重要分区都会设置主备分区,用于实现备份与恢复的功能。

Android通常设置主备分区的分区有:

  • boot - 包含内核与ramdisk,设置为boot_a和boot_b。
  • system - 包含系统应用与库,设置为system_a和system_b。
  • userdata - 包含用户数据,设置为userdata_a和userdata_b。
  • persist- 包含设置信息,设置为persist_a和persist_b。
  • recovery - 包含恢复包,设置为recovery_a和recovery_b。
  • abl - Qualcomm引导程序,设置为abl_a和abl_b。
  • vbmeta - 验证元数据,设置为vbmeta_a和vbmeta_b等。
    具体的主备分区数量和名称会根据不同设备和定制系统有所不同,但基本原理相同。

设置主备分区的好处是:

  1. 防止单点失败:如果主分区数据损坏,可以从备分区恢复,保证系统可用性。
  2. 方便OTA:可以烧写OTA包到主分区,如果出现问题可以从备分区恢复,然后重新推送OTA。
  3. A/B测试:可以在主分区和备分区运行不同版本的系统或配置进行测试,选择更稳定的版本使用。

fastboot刷机

fastboot与QFIL是两种对Android设备进行刷机的方法:
fastboot刷机:

  1. 设备进入fastboot模式,通常通过按住音量键+电源键。
  2. 使用fastboot工具,给设备下发flash/update命令,烧写对应分区的镜像文件。
  3. fastboot刷机操作简单,但仅能刷主要分区,且要求设备能正常进入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刷机

QFIL刷机:

  1. 设备进入EDL模式(紧急下载),通常通过短接EDL引脚或按键组合。
  2. 使用Qualcomm Flash Image Loader(QFIL)工具,加载令牌、分区表与镜像,进行烧写操作。
  3. QFIL可以完全重新编程设备,支持更底层分区,但操作较复杂,且要求设备能进入EDL模式。

两种方式对比:
优点:

  • fastboot - 操作简单,不需要额外工具。
  • QFIL - 支持更底层分区,可以使用还原镜像彻底修复设备。

缺点:

  • fastboot - 仅支持fastboot可见的主要分区,无法修复bootloop设备。
  • QFIL - 操作复杂,需要额外的QFIL工具与镜像文件。

所以,总结来说:
如果只是常规系统更新,fastboot方式简单高效。
如果系统损坏无法进入系统,需要彻底修复,QFIL方式更强大。文章来源地址https://www.toymoban.com/news/detail-802056.html

到了这里,关于安卓启动与镜像刷机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原生安卓aosp源码,实现硬改以及定位

    第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓手机环境检测软件分享

    2024年02月03日
    浏览(108)
  • I.MX RT1170加密启动详解(1):加密Boot镜像组成

    使用RT1170芯片构建的所有平台一般都是高端场合,我们需要考虑软件的安全需求。该芯片集成了一系列安全功能。这些特性中的大多数提供针对特定类型攻击的保护,并且可以根据所需的保护程度配置为不同的级别。这些特性可以协同工作,也可以独立工作。它们还可以与适

    2024年02月07日
    浏览(36)
  • 从安卓系统USB升级包里提取system.img、boot.img和recovery.img在内的镜像文件

    如果你拿到一个USB升级包,你会发现升级包的结构基本相似。 但是里面并不是直接就有包括system.img、boot.img和recovery.img在内的镜像文件。 如果我们需要在Android手机上获取Magisk。提取内核(boot.img)就至关重要。当然其他镜像根据你的需要也有其他用处。 这时,如果你需要这

    2024年02月02日
    浏览(47)
  • [rk3588]Linux下docker运行安卓镜像

    关于在Linux下docker运行Android拿来挂机玩游戏一类的一直感觉很有意思,后面就在网上搜集了一下资料,资料有点少且乱,总的尝试下来也踩了不少的坑,这里我记录一下我部署的过程,有感兴趣的朋友可以直接拿去用。 开发板:ArmSoM-sige7 Kernel:5.10.160 OS:Debian11 开源docker镜像

    2024年01月23日
    浏览(62)
  • 红米8a,刷机到安卓调用之路

    什么是BL锁? https://baijiahao.baidu.com/s?id=1614459630284912892wfr=spiderfor=pc bl锁简单来说,就是厂商为了自己的目的,为了避免刷机,而人为设置的一道障碍,我的第一步就需要等待168小时,经过测试,不用说一直都把sm卡插起来,绑定账号必须要插入sm卡,之后就可以不用 了,进入解

    2024年02月06日
    浏览(49)
  • 安卓账户锁(解密码,刷机,忘记密码,手机工程向)华为,小米等

    手机的密码分为两种:密码锁和账户锁 这里用的是P30-鸿蒙系统 密码锁太简单了,不作赘述,需要的找我。刷机后的账户才是比较麻烦的。 准备的工具:工程线、菊花三代、手机一部 软件: 华为OEM版本查询用于查看被锁手机的信息-Android文档类资源-CSDN下载 步骤:手机不连

    2024年02月11日
    浏览(53)
  • 安卓手机ROOT和刷机基本操作——以红米Note7刷安卓原生系统并Root为例

    学习安卓逆向需要进行调试,虽然之前对测试机root过可以进行一些调试,但是某些软件不能正常运行调试,遂选择刷安卓原生系统(PixelExperience) 软件权限(第三方软件) 权限最低,要向用户请求权限 用户权限 高于第三方软件,可以进行授权 ROOT权限 最高权限 Boot分区 包括了内核(Ker

    2024年02月10日
    浏览(75)
  • 安卓盒子 魔百盒311-1a YST 刷Armbian系统刷机教程

    中国移动魔百盒311-1a YST 刷Armbian系统,总体过程分以下几步: 1、将盒子底层刷安卓系统 2、将安卓系统设置为开机从U盘启动 3、制作刷机U盘(Armbian系统) 4、将刷机U盘插入盒子后开机,盒子进入U盘中的Armbian系统,完成Armbian系统开机后的简单设置 5、在Armbian系统中使用命令

    2024年02月04日
    浏览(75)
  • Windows 7:安装刷机驱动教程,适用于安卓智能手机的智能硬件

    在本教程中,我们将详细介绍如何在Windows 7操作系统上安装刷机驱动程序,以便与安卓智能手机进行交互并进行刷机操作。刷机驱动程序是连接计算机和智能手机之间的桥梁,确保正常的数据传输和通信。请按照以下步骤进行操作: 步骤1:准备工作 在开始安装刷机驱动程序

    2024年01月25日
    浏览(41)
  • [安卓刷机实战]小米/红米手机刷机降系统图文教程-解锁小米手机-K30 5G版[开箱可用][解锁+刷机全步骤教程]

    吐槽一下,最近的小米MIUI13和MIUI12实在是太费电了,我去官方换电池都是一天2冲…所以想到了老办法,刷机降系统到MIUI11.1.18 刷机步骤参考 Mi社区K30专区 Mi刷机Flash2020.X版本 Mi解锁Flash6.5.X版本 K30 5G MIUI线刷包11.1.18.0 小米手机助手 2.1安装小米手机助手 2.2安装MiFlash2020.X 3.1刷机前资

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包