← Back to list

The Android Process That Creates Almost Every App: Zygote Explained

After understanding SystemServer and Binder, one question naturally appears:

Vikram Singh · 2026-05-28 15:20 · 60 claps · 2.7 min read
#aosp #zygote-process #zygote #android #androiddev
Open on Medium ↗

The Android Process That Creates Almost Every App: Zygote Explained

Photo by Denny Müller on Unsplash

Photo by Denny Müller on Unsplash

After understanding SystemServer and Binder, one question naturally appears:

How does Android actually create applications?

When we tap an app icon, the application suddenly appears in a few milliseconds.

But internally, Android performs several operations:

  • Create process
  • Initialize runtime
  • Load application
  • Attach framework components
  • Start Activity

The interesting part is this:

Android does not create every process from scratch.

Instead, almost every Android application starts from a process called:

Zygote

This process quietly runs in the background and plays a central role in Android startup.

In this article we will cover:

  • What Zygote is
  • Why Android needed Zygote
  • Android boot flow
  • How applications are created
  • Zygote forking mechanism
  • Copy-on-Write optimization
  • SystemServer relationship
  • AOSP source code locations
  • Debugging commands

Why Android Needed Zygote

Creating a Linux process from scratch repeatedly is expensive.

Every application would need:

  • Runtime initialization
  • Framework class loading
  • Resource loading
  • VM setup

If Android repeated this work for every app launch:

Open app
 ↓
Initialize everything
 ↓
Launch app

startup would become slower.

Android solved this by creating one pre-initialized process:

Zygote

Applications are later cloned from it.

Android Startup Flow

High-level Android boot sequence:

Linux Kernel
      ↓
init process
      ↓
Zygote
      ↓
system_server
      ↓
Launcher
      ↓
Applications

Zygote starts very early during boot.

What Exactly Is Zygote?

Zygote is a special process responsible for:

  • Starting Android Runtime
  • Preloading framework classes
  • Preloading resources
  • Starting SystemServer
  • Forking applications

Instead of creating apps from zero:

Zygote
   ↓
fork()
   ↓
App process

Verify Zygote Process

Run:

adb shell ps -A | grep zygote

Example:

root      701     1 zygote64
root      702     1 zygote

Modern Android devices often run:

  • zygote
  • zygote64

for different architectures.

Zygote Startup Configuration

Init starts Zygote through:

init.rc

Example:

service zygote /system/bin/app_process

Eventually:

app_process
     ↓
ZygoteInit

gets executed.

Important AOSP Source Locations

Zygote initialization:

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

Runtime startup:

frameworks/base/cmds/app_process/

Zygote process:

frameworks/base/core/java/com/android/internal/os/

ZygoteInit Flow

Simplified sequence:

public static void main(String argv[])

Internally:

preload()
startSystemServer()
runSelectLoop()

What Happens During preload()

Zygote preloads:

  • Framework classes
  • Drawables
  • Resources
  • Common libraries

Reason:

These components are shared across applications.

Without preload:

every application loads everything independently.

SystemServer Starts From Zygote Too

One surprising detail:

Even system_server starts from Zygote.

Flow:

Zygote
    ↓
startSystemServer()
    ↓
fork()
    ↓
system_server

This directly connects with the previous SystemServer article.

Application Launch Flow

Suppose user clicks:

Spotify

Internally:

Launcher
    ↓
ActivityManagerService
    ↓
Socket request
    ↓
Zygote
    ↓
fork()
    ↓
App process created
    ↓
ActivityThread
    ↓
Application launched

Zygote Socket Communication

Zygote listens on:

/dev/socket/zygote

ActivityManagerService sends launch requests.

Example flow:

AMS
 ↓
Socket request
 ↓
Zygote
 ↓
fork()

Why fork() Matters

Android uses Linux:

fork()

fork creates child process from parent.

Instead of:

Create process from zero

Android performs:

Clone existing process

which is much faster.

Copy-On-Write Optimization

Question:

If applications are cloned, does Android duplicate all memory?

No.

Android relies on:

Copy-On-Write

Flow:

Shared memory
      ↓
Read operations share pages
      ↓
Write operation
      ↓
Create new copy

Benefits:

  • lower RAM usage
  • faster startup
  • memory optimization

ActivityThread Joins the Flow

After process creation:

ActivityThread.main()

starts.

This initializes:

  • Application
  • Activities
  • Services
  • Receivers

Real Flow End To End

Tap app icon
      ↓
Launcher
      ↓
AMS
      ↓
Zygote socket
      ↓
fork()
      ↓
Application process
      ↓
ActivityThread
      ↓
onCreate()

Useful Debug Commands

Check zygote:

adb shell ps -A | grep zygote

Check system_server:

adb shell ps -A | grep system_server

Check process:

adb shell ps -A | grep <package>

Inspect startup:

adb logcat

Common Interview Questions

  1. Why does Android use Zygote?

To avoid repeated runtime initialization.

  1. Who starts SystemServer?

Zygote.

  1. Which Linux API creates app process?
fork()
  1. What is Copy-On-Write?

Memory sharing optimization.

  1. Where does Zygote listen?
/dev/socket/zygote

Final Thoughts

SystemServer explains where Android services live.

Binder explains how they communicate.

Zygote explains where application processes come from.

Once these three pieces connect together:

Zygote
     ↓
SystemServer
     ↓
Binder

Android architecture starts looking much less mysterious.

Applications are later cloned from it.


메타데이터
post_id
18541b9372bb
slug
the-android-process-that-creates-almost-every-app-zygote-explained-18541b9372bb
url
https://medium.com/@codewithvikram/the-android-process-that-creates-almost-every-app-zygote-explained-18541b9372bb
canonical_url
https://medium.com/@codewithvikram/the-android-process-that-creates-almost-every-app-zygote-explained-18541b9372bb
author_url
https://medium.com/@codewithvikram
status
ok
fetched_at
2026-06-09 15:37:30