Android is a mobile operating system built on the Linux kernel, maintained by Google and the Android Open Source Project (AOSP). Calling it "an app framework" undersells it — Android is the full stack: a modified Linux kernel at the bottom, a set of native libraries and a runtime in the middle, and the Java/Kotlin application framework most engineers actually write code against on top.
The reason this matters for an app developer: almost every Android quirk — why a Service can get killed, why permissions are enforced the way they are, why an app can't just read another app's files — traces back to a decision made at the OS layer, not the framework layer.
The four layers, top to bottom
Android is usually drawn as four layers. Each one exists because the layer above it needs something the layer below can't provide directly.
- Applications — the apps themselves, system apps and third-party apps treated almost identically
- Application Framework — ActivityManager, PackageManager, WindowManager, ContentResolver — the APIs you actually call
- Native libraries + Android Runtime (ART) — libc (Bionic), SQLite, OpenGL, and the runtime that executes your compiled app code
- Linux kernel — process isolation, memory management, drivers, power management, and Binder IPC
Why this is one project, not a Linux distro with apps bolted on
A regular Linux desktop distro assumes a shared, mostly-trusting multi-user system. Android assumes every app is a stranger: no two apps trust each other by default, every app runs as its own Linux user ID, and inter-app communication happens through narrow, mediated channels (Binder, Content Providers) instead of shared memory or files. That single assumption — apps are mutually distrusting — shapes almost everything else on this page and the ones that follow.
In this note
References & resources