On Linux OSes kernel starts init
which starts getty
which starts login
process on virtual console(s). There a user can login on CLI and a shell (like bash
) is opened for command execution. In windowing system, init
starts a Display Server like Xorg or Wayland and login
is replaced with a graphical Display Manager like SDDM or GDM which asks for user credential on GUI. After authentication a Desktop Environment e.g. KDE or GNOME is started which starts its Window Manager and shows components like Desktop, Task Bar / Panel, Widgets, Notifications, and windows of applications such as a File Explorer, Web Browser, Terminal Emulator etc.
Android is primarily designed for a single user, so there's no concept of CLI login. In fact virtual terminals/consoles are disabled in kernel by default. init
- after starting all native services including Surface Flinger (Android's Display Server) - starts a service named zygote
which is a special process to fork Java-like Virtual Machines. Android's core framework (system_server
) and all apps run in separate instances of VMs. system_server
starts apps which are configured to run on boot, including many system apps.
So what we see after the boot animation ends is System UI app. This app is responsible for showing lock screen, status bar, notifications etc. system_server
has 100+ Java services running inside it including Activity Manager, Permissions Manager and Window Manager. WM communicates with Surface Flinger to draw surfaces on screen as requested by system_server
and apps. Another core component we see is a Home or Launcher app which is somewhat like a Desktop. It shows, at least, icons of all installed apps and forwards the request to system_server
for launching/showing the app when we tap an app icon. So everything we see on an Android device is an app.