Zygote
Jetpackintermediate

Support Library to AndroidX

For ten years, one library existed to backport new APIs to old Android versions. In 2018 it was renamed, reset and split into sixty independently versioned artifacts — and that reset is what made the modern ecosystem possible.

11 minAPI 1–37 · 17interactivequizverified 2026-10-27

The is the reason an app written in 2014 could use RecyclerView on a device running Android 2.3. is the reason an app written in 2026 can use Compose, Hilt and a navigation graph without waiting for a platform release. The rename was not cosmetic; it changed how Android libraries ship.

TL;DR#

  • The Support Library (android.support.*) backported new APIs to older Android versions, starting with support-v4 in 2011.
  • AndroidX (androidx.*) replaced it in 2018 with the same idea, but with independent versioning per artifact.
  • The migration was a package rename with a mechanical mapping, plus a flag in gradle.properties during the transition.
  • The important change was structural: one library became dozens of separately versioned artifacts, which is what allows any of them to ship a release without waiting for the others.
  • The old namespace is frozen; it still exists on devices but receives no updates.1

Mental model#

Think of a city's public transport.

The Support Library was a single bus route that served every neighbourhood. It worked, but a change to one stop meant repainting the whole route. AndroidX is a network of routes, each with its own timetable, so a change to one line does not reschedule the others.

Where the analogy breaks#

The bus network still shares a map and a fare system. AndroidX artifacts share only a BOM (a bill of materials listing compatible versions) and a general policy of compatibility. They are genuinely independent — which is why androidx.core can be at a different version from androidx.compose.ui and nobody is surprised.

The big picture#

Loading diagram…
Text description of this diagram

A force-directed graph of replacement edges recorded in the Jetpack dataset. Old APIs and libraries sit on the left and the AndroidX artifacts that supersede them on the right. support-v4 is replaced by androidx.core; android.support.v7.appcompat by androidx.appcompat; android.support.v7.recyclerview by androidx.recyclerview; android.support.constraint by androidx.constraintlayout; android.support.annotation by androidx.annotation; SharedPreferences by DataStore; android.hardware.Camera by CameraX; ExoPlayer by Media3; firebase-jobdispatcher and GcmNetworkManager by WorkManager; and android.view.View by Compose UI. Clicking a node shows what it superseded and what superseded it.

Deep dive#

Why the Support Library existed#

RecyclerView shipped in 2014 with Android 5.0's design language. It was useful to every app, including those whose users were on Android 2.3. Shipping it in the platform would have limited it to API 21+.

The Support Library packaged it as an app dependency instead, so it ran on any device where the app installed. That is the entire concept: ship the new code with the app, not with the OS.

// 2016-era build.gradle
dependencies {
    implementation 'com.android.support:appcompat-v7:25.3.1'
    implementation 'com.android.support:recyclerview-v7:25.3.1'
    implementation 'com.android.support:design:25.3.1'
}

The version numbers were identical across every artifact. That was the defining constraint: a fix in recyclerview required a release of appcompat, design, support-v4 and everything else, because they were tested and shipped as a unit.

The AndroidX reset#

In 2018, Google renamed the packages and split the release trains:

Support LibraryAndroidX
namespaceandroid.support.*androidx.*
versionsone shared versionindependent per artifact
releaseone trainone per artifact
minimum SDKvariedgenerally 14+, now 21+
futurefrozenactive

The mechanical part was handled by Android Studio's Refactor → Migrate to AndroidX, which rewrote imports and dependency coordinates. The android.useAndroidX=true and android.enableJetifier=true flags let a project with a mix of old and new dependencies build during the transition.1

# gradle.properties, during migration only
android.useAndroidX=true
android.enableJetifier=true

enableJetifier rewrote third-party libraries' android.support references to androidx at build time. It was essential for the transition and is a build-time cost that should be removed once every dependency has migrated — it is now widely disabled.

What the split enabled#

Once artifacts version independently, several things become possible that were not before:

Faster fixes. A bug in RecyclerView ships in androidx.recyclerview without touching anything else.

Faster adoption of new Kotlin versions. androidx.core:core-ktx can require a newer Kotlin without forcing every other library to.

New libraries without a platform release. Compose, Hilt and the navigation libraries could not have existed under a single-version model; they would have had to wait for a platform train.

A BOM to manage the complexity. Because versions are independent, Google publishes a bill of materials that pins a compatible set:

dependencies {
    implementation(platform("androidx.compose:compose-bom:$composeBomVersion"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.material3:material3")
    // no versions specified; the BOM decides
}

The BOM is the pragmatic answer to independent versioning: independence is good for release cadence and bad for "which combination works?".

What came with the rename#

The AndroidX era also brought a change in minimum SDK policy. The Support Library supported very old versions; AndroidX's floor has risen over time (21 for many libraries, higher for Compose-era ones). That is a trade Google made deliberately: supporting API 14 forever held back the libraries.

android {
    defaultConfig {
        minSdk = 26        // most AndroidX libraries are comfortable here
        compileSdk = 37
        targetSdk = 37
    }
}

The three SDK numbers do different jobs: minSdk is the lowest device that can install the app, compileSdk is the API surface the code compiles against, and targetSdk is the compatibility contract the app opts into.2

The migration lessons#

Three things the migration taught that still apply:

  1. Package names are API. Renaming android.support.v4.app.Fragment to androidx.fragment.app.Fragment broke every third-party library that referenced the old type. That is why the transition needed Jetifier.
  2. A single version number is a scalability failure. It works for five artifacts and fails for sixty.
  3. A mechanical migration needs a mechanical tool. The rename was done by a refactoring tool, not by hand, which is why it happened over months rather than years.

What the reset meant for libraries that were not Google's#

Third-party libraries had to migrate too, and the migration exposed a structural problem: a library that depended on android.support.v4 could not be used by an app that had moved to AndroidX. Jetifier solved it by rewriting the library's bytecode at build time, which worked and was slow.

Some libraries took the opportunity to split their own artifacts. Others used the moment to drop old support. The pattern was consistent: the reset forced the whole ecosystem to re-declare its dependencies, and a lot of accidental coupling was removed in the process.

The lesson for anyone designing a library today: depend on the narrowest AndroidX artifact that provides what you need. A library that depends on androidx.appcompat forces every consumer to include AppCompat, which is a large dependency for a utility that needed one helper.

What did not change#

It is worth being clear about the limits of the reset. AndroidX did not:

  • Change the platform's own class names (android.app.Activity is still android.app.Activity).
  • Remove the need for minSdk checks.
  • Make new platform APIs available on old devices.

What it did was give libraries a release mechanism independent of the OS. That is a build and distribution change, not an API change — and it is the change that made everything after 2018 possible.

Reading a version number#

AndroidX versions are not semantic in the way most libraries are. A version like 1.9.0 means: major, minor, patch — and a major bump does not necessarily mean a breaking change, while a minor bump can include one behind a flag. The stable/beta/alpha channel is the signal that matters, and it is in the artifact name (-beta01, -alpha07).

The practical consequence: upgrading a Compose artifact across a minor version deserves a release note read, not just a build. The library's own changelog is the only reliable guide, because the version number does not carry the compatibility promise a semantic version would.

The migration in one afternoon#

For a small app, the migration is genuinely mechanical:

  1. Bump the Android Gradle Plugin.
  2. Run Android Studio's "Migrate to AndroidX" refactor.
  3. Set android.useAndroidX=true and, if any dependency still uses the old namespace, android.enableJetifier=true.
  4. Build, fix the handful of APIs that changed rather than moved (Fragment's getUserVisibleHint, some NotificationCompat signatures).
  5. Remove Jetifier once every dependency has migrated, and measure the build time difference.

The step people skip is 5, and it is the one with a measurable payoff: Jetifier rewrites bytecode for every dependency on every build.

Where the namespace shows up today#

import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.compose.NavHost
import androidx.room.Room
import androidx.work.WorkManager

Every import is a separate artifact with its own version, its own release notes, and its own minimum SDK. That is the world the 2018 reset created.

How it evolved#

Architecture changes29 releases
APIVersionWhat changed
11.0
  • Initial AOSP platform: Linux kernel, Dalvik VM, core libraries
  • The first zygote-based app spawning model
41.6 Donut
  • Support for different screen densities via resource qualifiers
52.0 Eclair
  • First multi-core-friendly scheduling and graphics work
82.2 Froyo
  • Trace-based JIT compiler added to Dalvik
  • Support for x86 and ARMv7 optimisations
92.3 Gingerbread
  • Concurrent garbage collector added to Dalvik (GC pause reduction)
113.0 Honeycomb
  • Hardware acceleration for the View system (opt-in per app)
133.2 Honeycomb
  • New screen-size resource qualifiers for compatibility scaling
144.0 Ice Cream Sandwich
  • One system image for phones and tablets
  • Hardware acceleration on by default
164.1 Jelly Bean
  • Project Butter: vsync, triple buffering, Choreographer
  • RenderThread architecture begins
174.2 Jelly Bean
  • Multi-user support on tablets
  • SELinux enforcement begins in the kernel (behind the scenes)
184.3 Jelly Bean
  • SELinux enforcement rolled out more broadly
  • Binder changes for restricted profiles
194.4 KitKat
  • Android Runtime (ART) appears as an experimental runtime
  • Kernel moved under a tighter vendor control
204.4W KitKat (Wear)
  • First time the platform shipped for a new form factor
215.0 Lollipop
  • ART becomes the only runtime: ahead-of-time compilation at install
  • 64-bit ARM and x86 support
  • RenderThread and OpenGL ES 3.1
  • Project Volta and JobScheduler
  • SELinux fully enforcing
225.1 Lollipop
  • Device protection ties verified boot to Google accounts
236.0 Marshmallow
  • Runtime permission model changes how every app asks for access
  • Doze batches background work
  • Fingerprint HAL
  • Adoptable storage
247.0 Nougat
  • Project Treble groundwork
  • A/B seamless updates
  • Hybrid JIT + AOT compilation in ART
  • MediaServer split into sandboxed processes
268.0 Oreo
  • Project Treble: the vendor interface separates vendor and system code
  • Background execution limits
  • Broadcast and service restrictions
  • HIDL for HALs
278.1 Oreo
  • Android Go: a lighter configuration of the same platform
289 Pie
  • App Standby Buckets
  • Mainline groundwork
  • Non-SDK interface restrictions (greylists) begin
  • BiometricPrompt
2910
  • Project Mainline: APEX and updatable system modules
  • Scoped storage
  • Bubbles
  • Project Mainline starts shipping through Play
3011
  • GKI: the Generic Kernel Image splits the kernel into core + vendor modules
  • App hibernation
  • Package visibility filtering
  • Incremental app installs
3112
  • Bluetooth permissions split into the nearby-devices family
  • Exact alarm permissions
  • Foreground service launch restrictions
3212L
  • Window size classes and activity embedding
3313 Tiramisu
  • Granular media permissions replace READ_EXTERNAL_STORAGE
  • The notification permission becomes a runtime permission
  • Predictive back gesture
3414 Upside Down Cake
  • Foreground service types are mandatory
  • Selected photos access via READ_MEDIA_VISUAL_USER_SELECTED
3515 Vanilla Ice Cream
  • 16 KB page size support for native libraries
  • Edge-to-edge is enforced when targeting 35
3616 Baklava
  • The release moves to Q2 (June) with a Q4 feature drop
  • Two SDK releases per year starting with 36
  • Desktop windowing arrives in developer options then stable
3717 Cinnamon Bun
  • Strict per-device app memory limits are enforced by the system
  • Generational garbage collection is added to ART's Concurrent Mark-Compact collector
  • A lock-free MessageQueue for apps targeting API 37
  • Compose-first: new platform and Jetpack APIs target Compose only; View libraries enter maintenance mode
  • Hybrid APK signing (v3.2) combines classical and ML-DSA post-quantum signatures
  • Native library dynamic code loading must be read-only

The dates: support-v4 in 2011, the design library in 2015, AndroidX in 2018, Compose in 2021. The pattern is that each era widened the gap between "what the OS provides" and "what an app can use".

Under the hood#

Curiosity corner#

  • support-v4 meant "support down to API 4". The name was a minimum SDK, not a version number.
  • Jetifier slowed builds measurably because it rewrote bytecode for every dependency. Its removal is one of the quiet wins of the AndroidX migration.
  • The BOM is a pom with dependency management, not a library. It contributes no code to the APK.

Try it#

Find any remaining support-library references

grep -rn "android.support" --include=.kt --include=.xml --include=*.gradle .

See the resolved AndroidX versions

./gradlew :app:dependencies --configuration debugRuntimeClasspath | grep androidx

Check yourself#

Check yourself

1 / 12

What changed structurally when the Support Library became AndroidX?

0 answered · 0 correct

Sources#

Sources

Every version number, API level, class name and date on this page is traced to one of these. Pages are re-verified against them; last_verified above says when.

  1. docsMigrar para o AndroidX | Jetpackdeveloper.android.comaccessed 2026-10-27↩
  2. docsAndroidX রিলিজ | Jetpackdeveloper.android.comaccessed 2026-10-27↩
  3. docsJetpackdeveloper.android.comaccessed 2026-10-27↩
  4. docsExplore the Jetpack libraries by typedeveloper.android.comaccessed 2026-10-27↩
  5. docsAbout Android App Bundlesdeveloper.android.comaccessed 2026-10-27↩
  6. docsOptimize your build speeddeveloper.android.comaccessed 2026-10-27↩