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.