When you press the power button on an Android device, a carefully orchestrated sequence of stages brings the entire OS to life. Understanding this sequence is essential for AOSP debugging, custom ROM development, and diagnosing boot failures.
The Boot Sequence - Overview
Android Boot Stages
Power Button Pressed
│
▼
┌─────────────────┐
│ Boot ROM │ ← hardcoded in chip, loads bootloader
└────────┬────────┘
│
▼
┌─────────────────┐
│ Bootloader │ ← verifies & loads kernel (e.g. U-Boot, LK)
│ (e.g. ABoot) │ ← also handles fastboot / recovery mode
└────────┬────────┘
│
▼
┌─────────────────┐
│ Linux Kernel │ ← initializes CPU, memory, drivers
│ │ ← mounts root filesystem
└────────┬────────┘
│
▼
┌─────────────────┐
│ Init │ ← PID 1, reads init.rc files
│ (first process)│ ← starts daemons & services
└────────┬────────┘
│
▼
┌─────────────────┐
│ Zygote │ ← Android VM starter process
│ │ ← pre-loads classes & resources
└────────┬────────┘
│
▼
┌─────────────────┐
│ System Server │ ← starts all framework services
│ │ ← ActivityManager, PackageManager...
└────────┬────────┘
│
▼
┌─────────────────┐
│ Home Screen │ ← Launcher app started by ActivityManager
└─────────────────┘Stage 1: Boot ROM
The Boot ROM is a small piece of read-only memory baked into the chip by the manufacturer. It runs the moment power is applied, performs basic hardware initialization, and loads the bootloader from a fixed storage location (usually eMMC or UFS).
Stage 2: Bootloader
The bootloader is the first user-programmable code. Its job is to verify the integrity of the kernel (via verified boot / AVB), set up basic hardware, and load the kernel into RAM. It also intercepts key combinations to enter fastboot or recovery mode.
- ▸Fastboot mode - allows flashing images over USB (adb flash, fastboot flash)
- ▸Recovery mode - minimal environment for OTA updates and factory reset
- ▸Normal boot - loads the kernel and hands off control
Stage 3: Linux Kernel
The kernel initializes CPU cores, sets up memory management, loads device drivers, and mounts the root filesystem. Once ready, it hands control to the first userspace process: init.
Stage 4: Init (PID 1)
Init is the first process started by the kernel (PID 1). It reads .rc files (init.rc, vendor init.rc, etc.) to know which services to start, what properties to set, and which file systems to mount. It stays running forever, restarting crashed services.
Stage 5: Zygote
Zygote is the parent of every Android app process. It pre-loads the entire Java framework and common resources into memory once, then forks a copy of itself for each new app. This fork-on-demand model makes app launch dramatically faster - no need to reload the framework each time.
Stage 6: System Server
System Server is the most important process in Android. Zygote spawns it first, and it starts all the core framework services that apps depend on.
- ▸ActivityManagerService - manages app lifecycle and task stack
- ▸PackageManagerService - manages installed apps and permissions
- ▸WindowManagerService - manages windows and display
- ▸PowerManagerService - controls wake locks and screen state
- ▸InputManagerService - routes touch and key events