The Android Terminology Tangle: SDK, NDK, Framework, and Native Are Not on the Same Axis
Mislabeling a crash as an NDK problem when it is a system native daemon failure, or treating the SDK as the runtime Framework, sends debugging in the wrong direction and wastes hours. The distinction determines whether you reach for Gradle configs, JNI bindings, system_server traces, or HAL/vendor tombstones.
Android's core terminology mixes four distinct dimensions: development toolkits (SDK, NDK), delivery units (APP), system layers (Framework, Native), and runtime implementations (Java/Kotlin, C/C++, JNI). Calling the SDK the Framework, or the NDK the Native layer, creates confusion that breaks down during debugging. A native crash in an app's .so is not a system native layer problem; using the NDK does not mean you are doing AOSP-level native development.
The SDK is a compile-time API contract and toolset; the Framework is the runtime implementation spread across system_server, Binder, and native services. The NDK compiles C/C++ into app-native libraries that still run inside the app sandbox, not as system daemons. An APP remains an APP regardless of whether it contains .so files, because its identity is defined by its package, UID, permissions, and sandbox, not its implementation language.
A practical decision tree separates issues into five categories: SDK/build-tool problems, NDK/ABI/JNI problems, app runtime identity problems, Framework/system_server problems, and system native/HAL problems. The key is always asking whether you are looking at a toolkit, a deliverable, or a runtime layer before assigning blame.
The confusion is structural, not accidental: Android's documentation and tooling names reuse the word native across toolkits, language keywords, system layers, and product categories without disambiguation.
Treating android.jar as the Framework is a category error that persists because compile-time API surfaces and runtime implementations share class names but live in entirely different processes and trust boundaries.
The NDK's name invites the misconception that it targets the system native layer, when its actual scope is app-local native libraries — a much narrower and sandboxed role.
A practical litmus test for any Android term is asking whether it describes a toolkit, a deliverable, a system layer, or a runtime implementation; most confusion collapses once the dimension is identified.
Explained very clearly [thumbs up]. I think a program only needs two core concepts. 1: compile-time / run-time. The SDK is just what's publicly exposed for you to call; as long as the runtime exists, even without the SDK you can craft your own API to fool the compiler, or use reflection to call it successfully. 2: in-process or out-of-process. Inside the process, the entire memory is visible to you, theoretically nothing can stop you. Framework code in Android, however, is loaded into your process.