Starting March 27, 2025, we recommend using android-latest-release instead of aosp-main to build and contribute to AOSP. For more information, see Changes to AOSP.
Stay organized with collections
Save and categorize content based on your preferences.
To implement the over-the-air (OTA) updates, the
bootloader must be able to access a recovery RAM disk during boot. If the device
uses an unmodified AOSP recovery image, the bootloader reads the first 32 bytes
on the misc partition; if the data there matches boot-recovery, the
bootloader boots into the recovery image. This method enables any pending
recovery work (for example, applying an OTA or removing data) to continue to
completion.
To support OTA updates on devices that use A/B
updates, ensure that the device bootloader meets
the following criteria.
General criteria
All partitions updated through an OTA should be updatable while the main
system is booted (and not updated in recovery).
To boot the system partition, the bootloader passes the following value on
kernel command line: ro root=/dev/[node] rootwait init=/init.
It's the responsibility of the Android framework to call markBootSuccessful
from the HAL. The bootloader should never mark a partition as successfully
booted.
Support for boot control HAL
The bootloader must support the boot_control HAL as defined in
hardware/libhardware/include/hardware/boot_control.h. The updater queries the
boot control
HAL,
updates the boot slot not in use, changes the active slot using the
HAL, and reboots into the updated operating system. For details, see
Implementing the boot control
HAL.
Support for slots
The bootloader must support functionality related to partitions and slots,
including:
Partition names must include a suffix that identifies which partitions
belong to a particular slot in the bootloader. For each such partition,
there's a corresponding variable
has-slot:partition base name with a value of
yes. Slots are named alphabetically as a, b, c, etc. corresponding to
partitions with the suffix _a, _b, _c, etc. The bootloader should inform
the operating system which slot was booted using the command line property
androidboot.slot_suffix. This property is set through bootconfig for devices
launching with Android 12 or higher.
The slot-retry-count value is reset to a positive value (usually 3),
either by the boot control HAL through the setActiveBootSlot callback or
through the fastboot set_active command. When modifying a partition that's
part of a slot, the bootloader clears "successfully booted" and resets the
retry count for the slot.
The bootloader should also determine which slot to load. The figure shows an
example decision process.
Figure 1. Bootloader slotting flow
Determine which slot to attempt. Don't attempt to load a slot marked
slot-unbootable. This slot should be consistent with the values returned by
fastboot, and is referred to as the current slot.
If the current slot isn't marked as slot-successful and has a
slot-retry-count = 0, mark the current slot as slot-unbootable. Then
select a different slot that is not marked unbootable and is marked as
slot-successful; this slot is now the selected slot. If no current slot is
available, boot to recovery or display a meaningful error message to the
user.
Select the appropriate boot.img and include the path to correct system
partition on the kernel command line.
Populate the kernel command line slot_suffix parameter.
Boot. If not marked slot-successful, decrement slot-retry-count.
The fastboot utility determines which partition to flash when running any
flash commands. For example, running the fastboot flash system system.img
command first queries the current-slot variable then concatenates the result
to system to generate the name of the partition that should be flashed
(system_a, system_b, etc.).
When setting the current slot using the fastboot set_active command or the
boot control HAL setActiveBootSlot command, the bootloader should update
the current slot, clear slot-unbootable and slot-successful, and reset the
retry count (this is the only way to clear slot-unbootable).
Devices without A/B updates
To support OTA updates on devices that don't use A/B updates (see Non-A/B
updatable devices), ensure that the device
bootloader meets the following criteria.
The recovery partition should contain an image that is capable of reading a
system image from some supported partition (cache, userdata) and writing
it to the system partition.
The bootloader should support booting directly into recovery mode.
If radio image updates are supported, the recovery partition should also be
able to flash the radio. This can be accomplished in one of two ways:
The bootloader flashes the radio. In this case, it should be possible to
reboot from the recovery partition back into the bootloader to complete the
update.
The recovery image flashes the radio. This functionality can be provided as
a binary library or utility.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-08-29 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 UTC."],[],[],null,["# Implement OTA updates\n\nTo implement the [over-the-air (OTA) updates](/docs/core/ota), the\nbootloader must be able to access a recovery RAM disk during boot. If the device\nuses an unmodified AOSP recovery image, the bootloader reads the first 32 bytes\non the `misc` partition; if the data there matches `boot-recovery`, the\nbootloader boots into the `recovery` image. This method enables any pending\nrecovery work (for example, applying an OTA or removing data) to continue to\ncompletion.\n\nFor details on the content of a block in flash used for communications by\nrecovery and the bootloader, refer to\n[bootable/recovery/bootloader_message/bootloader_message.h](https://android.googlesource.com/platform/bootable/recovery/+/android16-release/bootloader_message/include/bootloader_message/bootloader_message.h#64).\n\nDevices with A/B updates\n------------------------\n\nTo support OTA updates on devices that use [A/B\nupdates](/docs/core/ota/ab), ensure that the device bootloader meets\nthe following criteria.\n\n### General criteria\n\n- All partitions updated through an OTA should be updatable while the main\n system is booted (and not updated in recovery).\n\n- To boot the `system` partition, the bootloader passes the following value on\n kernel command line: `ro root=/dev/[node] rootwait init=/init`.\n\n- It's the responsibility of the Android framework to call `markBootSuccessful`\n from the HAL. The bootloader should never mark a partition as successfully\n booted.\n\n### Support for boot control HAL\n\nThe bootloader must support the `boot_control` HAL as defined in\n`hardware/libhardware/include/hardware/boot_control.h`. The updater queries the\n[boot control\nHAL](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/boot/1.0/IBootControl.hal),\nupdates the boot slot not in use, changes the active slot using the\nHAL, and reboots into the updated operating system. For details, see\n[Implementing the boot control\nHAL](/docs/core/ota/ab/ab_implement#bootcontrol).\n\n### Support for slots\n\nThe bootloader must support functionality related to partitions and slots,\nincluding:\n\n- Partition names must include a suffix that identifies which partitions\n belong to a particular slot in the bootloader. For each such partition,\n there's a corresponding variable\n `has-slot:`\u003cvar translate=\"no\"\u003epartition base name\u003c/var\u003e with a value of\n `yes`. Slots are named alphabetically as a, b, c, etc. corresponding to\n partitions with the suffix `_a`, `_b`, `_c`, etc. The bootloader should inform\n the operating system which slot was booted using the command line property\n `androidboot.slot_suffix`. This property is set through bootconfig for devices\n launching with Android 12 or higher.\n\n- The `slot-retry-count` value is reset to a positive value (usually `3`),\n either by the boot control HAL through the `setActiveBootSlot` callback or\n through the `fastboot set_active` command. When modifying a partition that's\n part of a slot, the bootloader clears \"successfully booted\" and resets the\n retry count for the slot.\n\nThe bootloader should also determine which slot to load. The figure shows an\nexample decision process.\n**Figure 1.** Bootloader slotting flow\n\n1. Determine which slot to attempt. Don't attempt to load a slot marked\n `slot-unbootable`. This slot should be consistent with the values returned by\n fastboot, and is referred to as the current slot.\n\n2. If the current slot isn't marked as `slot-successful` and has a\n `slot-retry-count = 0`, mark the current slot as `slot-unbootable`. Then\n select a different slot that is not marked `unbootable` and is marked as\n `slot-successful`; this slot is now the selected slot. If no current slot is\n available, boot to recovery or display a meaningful error message to the\n user.\n\n3. Select the appropriate `boot.img` and include the path to correct system\n partition on the kernel command line.\n\n4. Populate the kernel command line `slot_suffix` parameter.\n\n5. Boot. If not marked `slot-successful`, decrement `slot-retry-count`.\n\nThe `fastboot` utility determines which partition to flash when running any\nflash commands. For example, running the `fastboot flash system system.img`\ncommand first queries the `current-slot` variable then concatenates the result\nto system to generate the name of the partition that should be flashed\n(`system_a`, `system_b`, etc.).\n\nWhen setting the current slot using the fastboot `set_active` command or the\nboot control HAL `setActiveBootSlot` command, the bootloader should update\nthe current slot, clear `slot-unbootable` and `slot-successful`, and reset the\nretry count (this is the only way to clear `slot-unbootable`).\n\nDevices without A/B updates\n---------------------------\n\nTo support OTA updates on devices that don't use A/B updates (see [Non-A/B\nupdatable devices](/docs/core/ota/nonab)), ensure that the device\nbootloader meets the following criteria.\n\n- The `recovery` partition should contain an image that is capable of reading a\n system image from some supported partition (`cache`, `userdata`) and writing\n it to the `system` partition.\n\n- The bootloader should support booting directly into recovery mode.\n\n- If radio image updates are supported, the `recovery` partition should also be\n able to flash the radio. This can be accomplished in one of two ways:\n\n - The bootloader flashes the radio. In this case, it should be possible to\n reboot from the recovery partition back into the bootloader to complete the\n update.\n\n - The recovery image flashes the radio. This functionality can be provided as\n a binary library or utility."]]