Android Boot Process

Budhdi Sharma
AndroidPub
Published in
5 min readOct 25, 2018

--

android booting

When switching off the power of the Android device and switch on it again, this process is known as the Android Booting sequence.

Above Image showing 5 stages of Booting process for an Android-powered device:

  • 1st Stage is Boot ROM and Boot Loader
  • 2nd Stage is Kernel
  • 3rd Stage is Init
  • 4th Stage is Zygote and DVM
  • 5th Stage is SystemServer and Managers

Boot ROM and Boot Loader

On pressing the POWER button, the Boot ROM code starts executing from a predefined location which is hardwired in ROM. It loads the Bootloader into RAM. The bootloader is code that is executed before any Operating System starts to run. The bootloader is a low-level code contains the instructions that tell a device how to start up and find the system kernel. The bootloader usually lives on the system board in non-volatile memory and is often specific to a device.

The bootloader is usually split into stages. Primary Boot Loader and Secondary Boot Loader. The bootloader can be found at:
<android source>/bootable/bootloader/legacy/usbloader

This legacy loader contains 2 important files:

1- Init.s :: Initializes stacks, zeros the BSS segments and call_main() in main.c
2- Main.c:: Initializes hardware (clocks, board, keyboard, console) and creates Linux tags

Primary Boot Loader will load Secondary Boot Loader from a specific sector on the disk, then Secondary Boot Loader will initialize the system and load the kernel from ‘boot’ flash partition into RAM.

Android Kernel

The Android kernel starts in a similar way as the Linux kernel. As the kernel launches, it starts to setup cache, protected memory, scheduling, and loads drivers. When the kernel finishes the system setup, it looks for “init” in the system files.

Here one question came into the picture. What is the difference between the Linux and Android kernels?

Here’s a list of changes/addons that the Android Project made to the Linux kernels:-

  1. Binder: It is an Android-specific interprocess communication mechanism and remote method invocation system.
  2. ashmem: “Android Shared Memory”. It is a new shared memory allocator, similar to POSIX SHM but with different behavior and sporting a simpler file-based API.
  3. pmem: “Process memory allocator”: It is used to manage large (1–16+ MB) physically contiguous regions of memory shared between userspace and kernel drivers.
  4. logger: This is the kernel support for the logcat command.
  5. wakelocks: It is used for power management files. It holds the machine awake on a per-event basis until the wake lock is released.
  6. oom handling: It kills processes as available memory becomes low.
  7. alarm manager: It lets userspace tell the kernel when it would like to wake up.
  8. RAM_CONSOLE: Allows to save kernel printk messages to a buffer in RAM, so that after a kernel panic they can be viewed in the next kernel invocation.
  9. USB gadget driver for ADB
  10. yaffs2: flash filesystem

Init Process

Init is the very first process, we can say it is a root process or the grandfather of all processes. The init process has two responsibilities.
1- Mounts directories like /sys , /dev or /proc
2- Runs init.rc script

  • The init process can be found at /init :: <android source>/system/core/init
  • Init.rc file can be found at :: <android source>/system/core/rootdir/

Android has a specific format and rules for init.rc files. At this stage, We can finally see the Android logo on our device screen.

Zygote and Dalvik

In Java, As we know that a separate Virtual Machine instance will pop up in memory for separate per app. But in the case of Android, the VM should run as quickly as possible for an app. Here is one question that comes in mind what happens if we have several apps thus launching several instances of the Dalvik (VM)? it would consume an immense amount of memory.

To overcome this problem, the Android OS has a system called “Zygote”. The Zygote enables code sharing across the Dalvik VM, achieving a lower memory footprint and minimal startup time. The zygote is a virtual machine process that starts at system boot. The Zygote preloads and initializes core library classes.

The Zygote loading process: Load Zygote Init class:

<android source>/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

registerZygoteSocket() :: It registers a server socket for zygote command connections.
preloadClasses():: Is a simple text file that contains a list of classes that need to be preloaded, you can find the file at <android source>/framework/base
preloadResources():: Everything that is included in the android.R file will be loaded with this method (themes and layouts).

At this time, we can see the boot animation.

SystemServer and Managers

After zygote preloads all necessary Java classes and resources, The Zygote forks a new process to launch the System Server.

  • The system server is the core of the Android system and it is started as soon as Dalvik is initialized and running.
  • The other system services will be running in the context of the System Server process.
  • The first thing that happens is that the server will load a native library called android_servers that provides interfaces to native functionality.
  • Then the native init method that will set up native services is called.
  • After setting up the native services it creates the server thread. This thread will start the remaining services in the system according to the necessary start order.
  • Each service is running in a separate Dalvik thread in the system server process.

Once System Services up and running in memory, Android has completed booting process, At this time “ACTION_BOOT_COMPLETED” standard broadcast action will fire.

Following is the Services started by SystemServer:-
Core services:

Starting power manager
Creating the Activity Manager
Starting telephony registry
Starting package manager
Set activity manager service as the system process
Starting context manager
Starting system contact providers
Starting battery service
Starting alarm manager
Starting sensor service
Starting window manager
Starting Bluetooth service
Starting mount service
Other services:
Starting status bar service
Starting hardware service
Starting NetStat service
Starting connectivity service
Starting Notification Manager
Starting DeviceStorageMonitor service
Starting Location Manager
Starting Search Service
Starting Clipboard Service
Starting check-in service
Starting Wallpaper service
Starting Audio Service
Starting HeadsetObserver
Starting AdbSettingsObserver

Need to analyze the Android Bootup?

The logcat :: Use adb to get the booting process events from the logcat.
‘adb logcat –d –b events | grep “boot”
‘adb logcat –d | grep preload’

Please write a comment if you have any queries.

I will write some more articles on android so to know about that please keep following.

I hope you enjoyed this article. If you have any comments or questions, please join the forum discussion below!

Thanks for the support!

--

--

Budhdi Sharma
AndroidPub

As an AOSP developer, I specialize in creating robust framework and system applications that seamlessly integrate with embedded systems on various SOCs