A single DEX file indexed method references with 16 bits, so it could hold at most 65,536 of them. Apps that grew past t…
The Curiosity Cabinet
207 small facts, each one a door into a bigger mechanism. Every card is sourced, and every card links to the page that explains the thing it is teasing.
Because resources and code are separate inputs: AAPT2 produces the compiled resource table and the R class, then the com…
Feature flags. The aconfig system declares flags that a release configuration sets, allowing one codebase to produce dif…
It means the platform assumes apps must work at any window size. Apps targeting Android 17 have their orientation and re…
Adaptive icons separate a foreground and a background so launchers can mask them into different shapes without the devel…
Because the Android Gradle Plugin is a Gradle plugin, and each AGP version supports a specific range of Gradle versions.…
A stable AIDL interface has a frozen version, so vendor and system code can evolve independently without breaking each o…
Because exact alarms wake the device at a specific moment, which is expensive when many apps do it. Batching alarms into…
A hidden, separately encrypted profile introduced in Android 15. Its apps do not appear in the normal launcher, and it c…
Android 17 enforces strict per-app memory limits based on the device's RAM and terminates processes that exceed them. Th…
Open Settings, go to About phone, and tap the Android version row repeatedly. Each release hides a small interactive toy…
Andy Rubin, Rich Miner, Nick Sears and Chris White founded Android Inc. in 2003. Google acquired the company in 2005, an…
It runs the Linux kernel, but almost nothing else matches a desktop distribution: no GNU coreutils by default, a differe…
Around ten seconds for a foreground broadcast and sixty for a background one. Exceeding it produces an ANR. The limits e…
When an app fails to respond, the system dumps every thread's stack into /data/anr/traces.txt (or a per-ANR file). It is…
Hours on a fast machine with plenty of RAM, and it needs hundreds of gigabytes of disk for the source and output. That i…
At boot, apexd mounts each active APEX from the APEX data directory as a loopback filesystem, and its libraries become a…
An APK is an app package installed into the app data model. An APEX is a container mounted at boot as its own filesystem…
The API diff reports on developer.android.com list every class, method and field added, changed or removed between two l…
Almost. It is a ZIP archive with a specific layout: binary AndroidManifest.xml, classes.dex files, resources.arsc, res/,…
Bundled resources, native libraries per ABI, uncompressed assets and unused code. App Bundles solve the ABI and density …
In Android 17, yes: a user can long-press any app's launcher icon and turn it into a floating bubble, and the system tas…
A base APK plus configuration splits for ABI, screen density and language, generated for the target device. The device i…
It is Android 17's mechanism for exposing app capabilities to on-device AI agents. An app annotates a class and its meth…
Android 11 added app hibernation: an app that has gone unused for months is put into a state where its permissions are r…
An App Link is verified: the app publishes an assetlinks.json file on its domain that names its signing certificate, and…
No. Service callbacks run on the main thread unless you create your own worker thread. A Service is a lifecycle componen…
Because the platform's security model depends on each app having a distinct, unprivileged identity. Root would collapse …
Android 9 introduced standby buckets: active, working set, frequent, rare and restricted. The system moves an app betwee…
Isolated processes need a different security context and a different startup path, so Android has an app zygote to fork …
Yes. ART became a Mainline module, which means the runtime ships as an APEX and can be updated through Google Play Syste…
Hundreds of thousands, and the number changes every release. The API Explorer on this site charts the growth per level f…
Ashmem was an Android kernel driver for shared memory, used for graphics buffers and other cross-process data. It was re…
Because the end-to-end path — app, AudioFlinger, the audio HAL, the DAC — carries buffers at each stage, and their sizes…
Because it is a way to hijack the user's attention, and it was heavily abused. Android 10 restricted background activity…
It is a list of hot classes and methods generated by benchmarking real user journeys, shipped inside the APK. ART compil…
With Battery Historian, which visualised a bug report's batterystats data as a timeline of wakelocks, radio state and CP…
Each process's Binder transactions share one mapped buffer, limited to about 1 MB, so that the kernel can guarantee a re…
Binder link-to-death: the client registers a DeathRecipient on the Binder object, and the driver notifies it when the ob…
It is not copied. The driver creates a handle — a reference — in the receiving process that points back to the original …
The kernel maps a region of the target process's address space into the sender temporarily, so the driver writes the tra…
Because a server thread doing work for a high-priority client should run at that priority, or the client's latency suffe…
The pool grows on demand up to a maximum (often 15 or 16), then reuses threads. A slow service can exhaust its pool, at …
The name reflects the goal: a library built specifically for Android rather than ported from a desktop. It is smaller an…
Before BLAST, a new window's first buffer could arrive after the transaction that positioned it, producing a visible fla…
Before Android 12, an app that wanted to connect to a BLE device asked for location permission, because scanning could r…
A bootanimation.zip of PNG frames and a description file is drawn by a native binary while the framework starts. It is o…
With eBPF programs attached to sockets in the kernel. The framework updates maps that the programs read, so filtering an…
A way to surface a conversation as a floating, movable window. Introduced with Android 10 for messaging and Android 11 a…
The robot mascot, often called Bugdroid, was designed by Irina Blok and her team at Google. It is deliberately simple an…
Every task's inputs are hashed, and the cache key is that hash plus the task's configuration. If the inputs are the same…
Because it exposes the real pipeline: you submit capture requests, and results arrive asynchronously with metadata and i…
Each update had to pass through Google, the SoC vendor (which supplied drivers and kernel support), the phone maker, and…
The Compatibility Definition Document and the Compatibility Test Suite. A device must implement the documented behaviour…
Cgroups group processes so the kernel can apply resource limits and accounting to them as a unit. Android groups foregro…
Android 9 blocks cleartext traffic by default for apps targeting it, to prevent accidental unencrypted connections. Apps…
No. Hardware codecs handle common formats efficiently, while software codecs cover everything else at higher CPU cost. M…
Process fork from Zygote, runtime initialisation, Application creation, activity creation, first layout and first frame.…
No. You cannot target a behaviour level you did not compile against, because the manifest values and constant definition…
It injects a Composer parameter, adds group markers around the function body so the runtime can skip or restart it, and …
With Android 17, Google stated that new platform APIs, Jetpack libraries and developer guidance target Jetpack Compose e…
Yes, in Android 17: ACTION_PICK_CONTACTS gives session-scoped access to specific fields the user chooses, such as an ema…
Because the system must make providers available before any component that might use them starts, including other apps. …
Because the singleton outlives the Activity, and the Activity references its whole view hierarchy. That keeps the window…
Android 17's handoff feature. A tablet taskbar shows the most recent app from your phone, and tapping it launches the ap…
A function with a hidden Continuation parameter, plus a state machine that lets it resume after a suspension point. The …
The main Looper. Coroutines do not create a new UI thread; they post continuations to the same Handler-backed queue that…
It is a virtual Android device that runs on a Linux host or in the cloud, with virtualised hardware instead of a phone. …
They are successive rewrites: dx became D8, and ProGuard's replacement became R8. The names follow the Android toolchain…
Almost never on Android. Deprecated APIs stay for compatibility, often for many releases, because removing them would br…
The dessert naming began informally with Cupcake, Donut and Eclair, and the team kept it going because it was memorable …
Core library desugaring rewrites calls to newer Java library APIs into Android-compatible implementations that ship in t…
DEX packs many classes into one file, sharing strings, types and prototypes across them. That makes the file much smalle…
During idle maintenance, usually while charging. Background dexopt reads the app's execution profile and compiles the ho…
Yes, slightly: every block read needs a hash-tree check. The cost is small enough to be hidden behind I/O on modern flas…
A short periodic window when Doze lets deferred work run: jobs, network access, alarms. The windows widen over time as t…
Basically everything. Almost every system service implements a dump() method, and dumpsys calls it over Binder and print…
To let system, vendor and product share one resizable pool instead of fixed partition sizes. Space can move to where an …
Android 15 made edge-to-edge the default and deprecated the old ways of hiding system bars; Android 16 removed the opt-o…
Because apps used them to wake the device constantly for non-urgent work, which destroyed battery life. Android 12 requi…
A WorkManager feature that runs work as soon as possible with a short execution window, using JobScheduler's expedited j…
Android 17 adds ACTION_OPEN_EYE_DROPPER, a system-rendered colour picker. The app launches it, the system reads the pixe…
File-Based Encryption splits storage into a device-encrypted area, available during Direct Boot, and a credential-encryp…
Because one persistent connection shared by every app uses far less battery and radio time than each app keeping its own…
Because a foreground service can keep an app running indefinitely, so the platform wants to know why. Android 10 introdu…
The HTC Dream, sold by T-Mobile as the G1, launched in September 2008 running Android 1.0. It had a slide-out keyboard a…
Because the user has a right to know that an app is running continuously and using battery. The notification is the cont…
Android 10 implemented /sdcard with FUSE, a userspace filesystem that enforces per-app views. That added a context switc…
Because the platform's LocationManager and Google's Fused Location Provider do different jobs. The fused provider blends…
Dalvik used mark-sweep with stop-the-world pauses. ART introduced Concurrent Mark-Sweep, then Concurrent Copying, then C…
Usually because the requested service does not exist on that device or was not registered in that context. Some services…
dumpsys gfxinfo <package>. It reports frame timings and jank counts for recent frames, and framestats gives per-frame de…
Before GKI, every device carried its own kernel, compiled by the SoC vendor with its own patches. A kernel security fix …
Drawing the same pixel more than once in a frame. A background, then a card, then text on the card means some pixels are…
That a device really implements the vendor interface. If a stock AOSP system image boots on the phone, the OEM's vendor …
Android originally used Apache Harmony for its core library. Android 7.0 moved to an OpenJDK-based libcore, which improv…
It means Canvas drawing operations are recorded into display lists and replayed on the GPU by RenderThread, instead of r…
The Linux kernel starts exactly one userspace process at boot, and Android's is called init. It gets PID 1 because it is…
init restarts it. Each service in an .rc file has restart behaviour, and init supervises them with a four-state machine.…
With triggers. init processes actions whose trigger fires — boot, property changes, or an explicit trigger — and service…
The input dispatch timeout is about five seconds. If the app does not consume the event in that window, the system decla…
Insets are the numbers that tell an app how much of its window is covered by the status bar, navigation bar, display cut…
When an app takes an intent from an untrusted source and launches it without validating the target, an attacker can reac…
Running code that should not be trusted with app data or permissions, such as some WebView renderers and untrusted effec…
A 2017 flaw that let an attacker craft an APK that the v1 signature scheme would verify while the runtime executed diffe…
Because the system decides when to run deferred work. Jobs are batched with other apps' jobs, constrained by battery and…
kapt runs the full Java annotation-processing pipeline, including generating stubs for Kotlin sources. KSP reads Kotlin …
On hardware-backed devices, the private key never exists in memory the app can read: the secure environment performs the…
No, and it usually costs more. Android deliberately keeps recently used processes cached because starting a process from…
Yes — Compose Multiplatform shares UI across Android, iOS, desktop and web — but Google's own guidance is to share busin…
Google announced first-class Kotlin support at I/O 2017, and moved to "Kotlin-first" at I/O 2019. Compose made it a prac…
Mostly, at compile time, for Kotlin code talking to Kotlin code. It cannot protect you at the boundary with Java or with…
Because four launch modes interact with intent flags, task affinity and the recents model, and the outcome depends on th…
Android 16 introduced a notification style for ongoing, progress-based work — deliveries, rides, timers — that the syste…
The in-kernel killer only knew thresholds and adj scores, not what the processes were doing. Userspace lmkd can see impo…
The local network can reveal a lot about a home and its devices, and it was previously reachable without an explicit gra…
Because it activates radios. GPS needs satellite acquisition, Wi-Fi scanning needs radio time, and cell location needs t…
It blocks inside nativePollOnce, an epoll wait in the native message queue. It is not spinning or polling: the kernel wa…
It selects the product, device and build variant — for example aosp_cf_x86_64_phone-trunk_staging-userdebug — which dete…
Dozens. Modules cover media codecs, Wi-Fi, Bluetooth, the DNS resolver, Conscrypt, the permission controller, ART, time …
Android 12 extracts a palette from the user's wallpaper and derives a full tonal set from it, then exposes those colour …
It is a Material 3 update that leans harder on bold typography, shape and motion, with components designed to be more em…
Because an app with a media session publishes its state to the system, and SystemUI renders controls for it. The app doe…
A busy message queue with many threads contending for a lock wastes time and can miss frames. Android 17 uses a lock-fre…
Binder is a kernel driver with a low-level API. AIDL generates the plumbing for typed calls, and Messenger offers someth…
Apps do not reach the camera or microphone hardware directly; they go through a system service, which records the access…
Not primarily. The main isolation is UIDs plus SELinux, not namespaces, which is why processes see the same filesystem b…
It is loading code at runtime rather than from the APK, historically used to ship updates or plugins. It became a malwar…
Host card emulation: an app or secure element presents an emulated card over the NFC radio, and the terminal talks to it…
Soong, which describes modules in Android.bp files, and Ninja, which executes the resulting build graph. The Make build …
They do, but it is not yours. The system starts a process from Zygote and calls ActivityThread.main(), which prepares th…
It determines whether a notification makes a sound, appears as a heads-up, or is silently listed. The user, not the app,…
Android 13 made POST_NOTIFICATIONS a runtime permission. On earlier versions, an app could post notifications as soon as…
An .oat file holds compiled native code plus metadata, and the matching .vdex holds the original DEX. ART runs from the …
Since Android 11, a user can grant camera, microphone or location access for a single session. The permission is revoked…
It is less safe, and Android says so visibly. Verified boot reports an unlocked state (orange) and some apps refuse to r…
Because the Binder driver enforces flow control on oneway transactions to prevent unbounded buffer growth. When the targ…
In 2021 the US Supreme Court ruled that Google's use of Java API declarations in Android was fair use, ending a decade o…
Because they patch only the blocks that changed, rather than rewriting the whole partition. The catch is that they requi…
Because a mutable PendingIntent lets the receiving app change the intent's contents, which can redirect a privileged act…
Because the default used to depend on whether the component had an intent filter, and misreading it exposed components. …
Groups mostly exist for the user interface: a request for any permission in the contacts group shows one contacts dialog…
It gives an app access to the specific photos a user selects, through a URI, without any media permission. The app canno…
With Play App Signing, Google does. The developer holds an upload key, and Google re-signs the artifact with the app sig…
Because behaviour changes are gated on targetSdk, so an app that never targets a new level never gets its security and p…
Android 17 adds APK Signature Scheme v3.2, which pairs a classical signature with an ML-DSA signature. An attacker with …
Predictive back runs the back navigation animation during the gesture, so the user can see where they are going before c…
From data access auditing: the platform records camera, microphone and location accesses with timestamps and attributing…
Plain DNS queries are visible to the network and can be altered. Private DNS over TLS encrypts them, either opportunisti…
Android 4.1 synchronised rendering to the display's vsync signal, added triple buffering, and introduced the Choreograph…
Because shared pages — above all the framework classes inherited from Zygote — would be counted once per process in RSS,…
Resource IDs are packed into 32 bits: the package ID, the type ID and the entry ID. The package 0x7f is reserved for res…
An app widget is rendered by the launcher or lock screen, not by your app, so your classes are not loaded in that proces…
RenderScript was Android's compute API from Android 3.0, but driver support was inconsistent and the toolchain was hard …
Because every modem is different. The radio interface layer is a vendor implementation behind a HAL, and the details of …
Runtime resource overlays. An overlay APK supplies replacement resources for a target package, and the overlay manager a…
Rust is used for new platform code in areas where memory safety matters, including parts of the Bluetooth stack and, thr…
Android's SELinux policy applies to root too. A process running as root still lives in a domain, and the policy decides …
It was a one-release escape hatch in Android 10 that let apps keep the old broad storage model while supporting the rele…
When Android devices shipped with real SD cards, /sdcard was a symlink to the removable volume. As internal storage grew…
SELinux controls access to labelled objects; seccomp controls which system calls exist at all for a process. An app proc…
Android creates separate app domains such as untrusted_app, untrusted_app_25, untrusted_app_27 and so on, each with poli…
It names the source context, the target context, the object class and the permission that policy refused. It is the star…
Enforcement started behind the scenes in Android 4.2 and 4.3 and became mandatory in Android 5.0. The phased rollout — p…
Sensor batching. The sensor hardware buffers events and delivers them in batches when the app wakes or when a FIFO fills…
They are Binder service names registered with servicemanager. The framework's getSystemService calls resolve to these na…
Android 8.0 made unknown sources a per-app permission rather than a global setting. Android 13 added restricted settings…
v1 signed individual entries inside the ZIP, leaving parts of the archive unprotected — a weakness that enabled the Janu…
The API level identifies the platform interface, not the marketing version. Android 12L is Android 12 for large screens …
Because reading all SMS messages is one of the most abused permissions. Android 17 delays standard OTP access for three …
Because the system started drawing a splash screen for every app, to avoid a blank window during cold start. Custom laun…
It covers the gap between the moment the system knows an app is launching and the moment the app has drawn its first fra…
Because Play generates splits per ABI, screen density and language, and the device downloads only what it needs. A phone…
The 2015 media-framework vulnerabilities let a specially crafted file compromise a device during processing, often with …
Because they are supposed to be constant, and the runtime can optimise much more aggressively when it can rely on that. …
Because the zygote is the one process every app descends from — a single point where the whole platform meets the code y…
Accidental main-thread work: disk reads, network calls, leaked cursors and unclosed resources. It is a debug tool, not a…
A Surface is the producer end of a BufferQueue: a set of memory buffers that an app draws into, which a consumer — usual…
SurfaceView has its own buffer queue and a separate layer, so it is cheap and can update independently of the view hiera…
A barrier blocks synchronous messages from being delivered while letting asynchronous ones through. Choreographer uses i…
init notices the process died and restarts it. The kernel keeps running, but every framework service is gone, so the sys…
Debug builds skip optimisation and shrinking, enable debugging hooks, and often run without a Baseline Profile. They can…
It throttles. The platform reduces CPU and GPU performance, dims the display, and limits charging to stay within thermal…
The name refers to musical treble — the higher register — because the project raised the abstraction level between hardw…
With two, the producer must wait when the consumer holds one and the other is still in flight, so a slow frame stalls th…
Keeping all platform work on one main branch and selecting behaviour at build time with release configurations and featu…
Starting with Android 16, Google moved the major release to Q2 and added a second SDK release in Q4, while feature drops…
It keeps a set of pre-forked Zygote children ready so that launching an app only needs to specialise one rather than for…
The v4 signature exists to support incremental installation: the device can verify chunks of the APK as they arrive, rat…
Green means the device is locked and everything verified. Yellow means the bootloader is locked but the OS is signed by …
It puts every dependency and plugin version in one TOML file, so a build has a single source of truth for versions and t…
It is one of the largest files in the framework — tens of thousands of lines covering measurement, layout, drawing, inpu…
Only what is written into the saved instance state bundle, plus anything the app persisted itself. A ViewModel survives …
Because the system image's compatibility matrix did not match the vendor manifest. VINTF checks at boot that the HAL ver…
Virtual A/B creates the inactive slot as a copy-on-write snapshot rather than a full copy. After the device boots succes…
8.33 milliseconds. The budget is the refresh period: 16.67 ms at 60 Hz, 11.11 ms at 90 Hz and 8.33 ms at 120 Hz. It cove…
With Android 7.0, as an alternative to OpenGL ES. It gives explicit control over the GPU with lower driver overhead, at …
It checks that key threads and services are making progress. If one is blocked for too long, it kills system_server, whi…
Because it is a large attack surface — a full browser engine inside almost every app — and fixing it through OS updates …
Widevine security levels. L1 keeps keys and decoding in a trusted environment and allows HD and 4K; L3 is software-only …
Android 12 added cross-window blur, letting an app blur what is behind its window, with a fallback when the device canno…
Yes, through a work profile: a separate Android user managed by IT. Apps in the profile cannot see personal data and vic…
JobScheduler on modern Android, with an alarm-based fallback on very old versions. It adds persistence, constraints, cha…
Because aligned uncompressed entries can be memory-mapped directly, without copying them into RAM. The platform relies o…
Zygote has already loaded the framework classes and resources when the device boots. When you launch an app, the system …