The CommonsBlog


New Jetpack Artifacts: 15 Jan 2025

Let me be the 384,120th person to welcome you to 2025!

After a few weeks off, we got a big ol’ wave of artifacts.

The highlight is a new group, androidx.performance, with several artifacts:

  • androidx.performance:performance-annotation
  • androidx.performance:performance-annotation-android
  • androidx.performance:performance-annotation-iosarm64
  • androidx.performance:performance-annotation-iossimulatorarm64
  • androidx.performance:performance-annotation-iosx64
  • androidx.performance:performance-annotation-jvm
  • androidx.performance:performance-annotation-linuxarm64
  • androidx.performance:performance-annotation-linuxx64
  • androidx.performance:performance-annotation-macosarm64
  • androidx.performance:performance-annotation-macosx64
  • androidx.performance:performance-annotation-mingwx64
  • androidx.performance:performance-annotation-tvosarm64
  • androidx.performance:performance-annotation-tvossimulatorarm64
  • androidx.performance:performance-annotation-tvosx64
  • androidx.performance:performance-annotation-watchosarm32
  • androidx.performance:performance-annotation-watchosarm64
  • androidx.performance:performance-annotation-watchosdevicearm64
  • androidx.performance:performance-annotation-watchossimulatorarm64
  • androidx.performance:performance-annotation-watchosx64
  • androidx.performance:performance-unsafe

(that last one seems a trifle scary — could we focus on safe performance first?)

New artifacts include:

  • androidx.datastore:datastore-preferences-external-protobuf
  • androidx.datastore:datastore-preferences-proto
  • androidx.window:window-core-watchosdevicearm64

Here is the roster of all the new artifact versions:

  • androidx.activity:activity:1.10.0
  • androidx.activity:activity-compose:1.10.0
  • androidx.activity:activity-ktx:1.10.0
  • androidx.appsearch:appsearch:1.1.0-beta01
  • androidx.appsearch:appsearch-builtin-types:1.1.0-beta01
  • androidx.appsearch:appsearch-compiler:1.1.0-beta01
  • androidx.appsearch:appsearch-debug-view:1.1.0-beta01
  • androidx.appsearch:appsearch-external-protobuf:1.1.0-beta01
  • androidx.appsearch:appsearch-ktx:1.1.0-beta01
  • androidx.appsearch:appsearch-local-storage:1.1.0-beta01
  • androidx.appsearch:appsearch-platform-storage:1.1.0-beta01
  • androidx.appsearch:appsearch-play-services-storage:1.1.0-beta01
  • androidx.camera:camera-camera2:1.5.0-alpha05
  • androidx.camera:camera-compose:1.5.0-alpha05
  • androidx.camera:camera-core:1.5.0-alpha05
  • androidx.camera:camera-effects:1.5.0-alpha05
  • androidx.camera:camera-extensions:1.5.0-alpha05
  • androidx.camera:camera-feature-combination-query:1.5.0-alpha05
  • androidx.camera:camera-feature-combination-query-play-services:1.5.0-alpha05
  • androidx.camera:camera-lifecycle:1.5.0-alpha05
  • androidx.camera:camera-mlkit-vision:1.5.0-alpha05
  • androidx.camera:camera-video:1.5.0-alpha05
  • androidx.camera:camera-view:1.5.0-alpha05
  • androidx.camera.viewfinder:viewfinder-compose:1.4.0-alpha12
  • androidx.camera.viewfinder:viewfinder-core:1.4.0-alpha12
  • androidx.camera.viewfinder:viewfinder-view:1.4.0-alpha12
  • androidx.car.app:app:1.7.0-rc01
  • androidx.car.app:app-automotive:1.7.0-rc01
  • androidx.car.app:app-projected:1.7.0-rc01
  • androidx.car.app:app-testing:1.7.0-rc01
  • androidx.collection:collection:1.5.0-beta02
  • androidx.collection:collection-iosarm64:1.5.0-beta02
  • androidx.collection:collection-iossimulatorarm64:1.5.0-beta02
  • androidx.collection:collection-iosx64:1.5.0-beta02
  • androidx.collection:collection-js:1.5.0-beta02
  • androidx.collection:collection-jvm:1.5.0-beta02
  • androidx.collection:collection-ktx:1.5.0-beta02
  • androidx.collection:collection-linuxarm64:1.5.0-beta02
  • androidx.collection:collection-linuxx64:1.5.0-beta02
  • androidx.collection:collection-macosarm64:1.5.0-beta02
  • androidx.collection:collection-macosx64:1.5.0-beta02
  • androidx.collection:collection-mingwx64:1.5.0-beta02
  • androidx.collection:collection-tvosarm64:1.5.0-beta02
  • androidx.collection:collection-tvossimulatorarm64:1.5.0-beta02
  • androidx.collection:collection-tvosx64:1.5.0-beta02
  • androidx.collection:collection-wasm-js:1.5.0-beta02
  • androidx.collection:collection-watchosarm32:1.5.0-beta02
  • androidx.collection:collection-watchosarm64:1.5.0-beta02
  • androidx.collection:collection-watchosdevicearm64:1.5.0-beta02
  • androidx.collection:collection-watchossimulatorarm64:1.5.0-beta02
  • androidx.collection:collection-watchosx64:1.5.0-beta02
  • androidx.compose:compose-bom:2025.01.00
  • androidx.compose:compose-bom-alpha:2025.01.00
  • androidx.compose:compose-bom-beta:2025.01.00
  • androidx.compose.animation:animation:1.8.0-alpha08
  • androidx.compose.animation:animation-android:1.8.0-alpha08
  • androidx.compose.animation:animation-core:1.8.0-alpha08
  • androidx.compose.animation:animation-core-android:1.8.0-alpha08
  • androidx.compose.animation:animation-core-jvmstubs:1.8.0-alpha08
  • androidx.compose.animation:animation-core-lint:1.8.0-alpha08
  • androidx.compose.animation:animation-core-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.animation:animation-graphics:1.8.0-alpha08
  • androidx.compose.animation:animation-graphics-android:1.8.0-alpha08
  • androidx.compose.animation:animation-graphics-jvmstubs:1.8.0-alpha08
  • androidx.compose.animation:animation-graphics-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.animation:animation-jvmstubs:1.8.0-alpha08
  • androidx.compose.animation:animation-lint:1.8.0-alpha08
  • androidx.compose.animation:animation-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.animation:animation-tooling-internal:1.8.0-alpha08
  • androidx.compose.foundation:foundation:1.8.0-alpha08
  • androidx.compose.foundation:foundation-android:1.8.0-alpha08
  • androidx.compose.foundation:foundation-jvmstubs:1.8.0-alpha08
  • androidx.compose.foundation:foundation-layout:1.8.0-alpha08
  • androidx.compose.foundation:foundation-layout-android:1.8.0-alpha08
  • androidx.compose.foundation:foundation-layout-jvmstubs:1.8.0-alpha08
  • androidx.compose.foundation:foundation-layout-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.foundation:foundation-lint:1.8.0-alpha08
  • androidx.compose.foundation:foundation-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.material:material:1.8.0-alpha08
  • androidx.compose.material3:material3:1.4.0-alpha06
  • androidx.compose.material3:material3-adaptive-navigation-suite:1.4.0-alpha06
  • androidx.compose.material3:material3-adaptive-navigation-suite-android:1.4.0-alpha06
  • androidx.compose.material3:material3-adaptive-navigation-suite-jvmstubs:1.4.0-alpha06
  • androidx.compose.material3:material3-android:1.4.0-alpha06
  • androidx.compose.material3:material3-jvmstubs:1.4.0-alpha06
  • androidx.compose.material3:material3-lint:1.4.0-alpha06
  • androidx.compose.material3:material3-linuxx64stubs:1.4.0-alpha06
  • androidx.compose.material3:material3-window-size-class:1.4.0-alpha06
  • androidx.compose.material3:material3-window-size-class-android:1.4.0-alpha06
  • androidx.compose.material3:material3-window-size-class-jvmstubs:1.4.0-alpha06
  • androidx.compose.material3:material3-window-size-class-linuxx64stubs:1.4.0-alpha06
  • androidx.compose.material3.adaptive:adaptive:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-android:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-jvmstubs:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-layout:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-layout-jvmstubs:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-navigation:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-navigation-android:1.1.0-alpha09
  • androidx.compose.material3.adaptive:adaptive-navigation-jvmstubs:1.1.0-alpha09
  • androidx.compose.runtime:runtime:1.8.0-alpha08
  • androidx.compose.runtime:runtime-android:1.8.0-alpha08
  • androidx.compose.runtime:runtime-jvmstubs:1.8.0-alpha08
  • androidx.compose.runtime:runtime-lint:1.8.0-alpha08
  • androidx.compose.runtime:runtime-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.runtime:runtime-livedata:1.8.0-alpha08
  • androidx.compose.runtime:runtime-rxjava2:1.8.0-alpha08
  • androidx.compose.runtime:runtime-rxjava3:1.8.0-alpha08
  • androidx.compose.runtime:runtime-saveable:1.8.0-alpha08
  • androidx.compose.runtime:runtime-saveable-android:1.8.0-alpha08
  • androidx.compose.runtime:runtime-saveable-jvmstubs:1.8.0-alpha08
  • androidx.compose.runtime:runtime-saveable-lint:1.8.0-alpha08
  • androidx.compose.runtime:runtime-saveable-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.runtime:runtime-tracing:1.8.0-alpha08
  • androidx.compose.ui:ui:1.8.0-alpha08
  • androidx.compose.ui:ui-android:1.8.0-alpha08
  • androidx.compose.ui:ui-android-stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-geometry:1.8.0-alpha08
  • androidx.compose.ui:ui-geometry-android:1.8.0-alpha08
  • androidx.compose.ui:ui-geometry-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-geometry-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-graphics:1.8.0-alpha08
  • androidx.compose.ui:ui-graphics-android:1.8.0-alpha08
  • androidx.compose.ui:ui-graphics-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-graphics-lint:1.8.0-alpha08
  • androidx.compose.ui:ui-graphics-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-lint:1.8.0-alpha08
  • androidx.compose.ui:ui-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-test:1.8.0-alpha08
  • androidx.compose.ui:ui-test-android:1.8.0-alpha08
  • androidx.compose.ui:ui-test-junit4:1.8.0-alpha08
  • androidx.compose.ui:ui-test-junit4-android:1.8.0-alpha08
  • androidx.compose.ui:ui-test-junit4-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-test-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-test-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-test-manifest:1.8.0-alpha08
  • androidx.compose.ui:ui-test-manifest-lint:1.8.0-alpha08
  • androidx.compose.ui:ui-text:1.8.0-alpha08
  • androidx.compose.ui:ui-text-android:1.8.0-alpha08
  • androidx.compose.ui:ui-text-google-fonts:1.8.0-alpha08
  • androidx.compose.ui:ui-text-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-text-lint:1.8.0-alpha08
  • androidx.compose.ui:ui-text-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-android:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-data:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-data-android:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-data-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-preview:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-preview-android:1.8.0-alpha08
  • androidx.compose.ui:ui-tooling-preview-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-unit:1.8.0-alpha08
  • androidx.compose.ui:ui-unit-android:1.8.0-alpha08
  • androidx.compose.ui:ui-unit-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-unit-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-util:1.8.0-alpha08
  • androidx.compose.ui:ui-util-android:1.8.0-alpha08
  • androidx.compose.ui:ui-util-jvmstubs:1.8.0-alpha08
  • androidx.compose.ui:ui-util-linuxx64stubs:1.8.0-alpha08
  • androidx.compose.ui:ui-viewbinding:1.8.0-alpha08
  • androidx.coordinatorlayout:coordinatorlayout:1.3.0-alpha03
  • androidx.credentials:credentials:1.5.0-rc01
  • androidx.credentials:credentials-play-services-auth:1.5.0-rc01
  • androidx.datastore:datastore:1.1.2
  • androidx.datastore:datastore-android:1.1.2
  • androidx.datastore:datastore-core:1.1.2
  • androidx.datastore:datastore-core-android:1.1.2
  • androidx.datastore:datastore-core-iosarm64:1.1.2
  • androidx.datastore:datastore-core-iossimulatorarm64:1.1.2
  • androidx.datastore:datastore-core-iosx64:1.1.2
  • androidx.datastore:datastore-core-jvm:1.1.2
  • androidx.datastore:datastore-core-linuxx64:1.1.2
  • androidx.datastore:datastore-core-macosarm64:1.1.2
  • androidx.datastore:datastore-core-macosx64:1.1.2
  • androidx.datastore:datastore-core-okio:1.1.2
  • androidx.datastore:datastore-core-okio-iosarm64:1.1.2
  • androidx.datastore:datastore-core-okio-iossimulatorarm64:1.1.2
  • androidx.datastore:datastore-core-okio-iosx64:1.1.2
  • androidx.datastore:datastore-core-okio-jvm:1.1.2
  • androidx.datastore:datastore-core-okio-linuxx64:1.1.2
  • androidx.datastore:datastore-core-okio-macosarm64:1.1.2
  • androidx.datastore:datastore-core-okio-macosx64:1.1.2
  • androidx.datastore:datastore-iosarm64:1.1.2
  • androidx.datastore:datastore-iossimulatorarm64:1.1.2
  • androidx.datastore:datastore-iosx64:1.1.2
  • androidx.datastore:datastore-jvm:1.1.2
  • androidx.datastore:datastore-linuxx64:1.1.2
  • androidx.datastore:datastore-macosarm64:1.1.2
  • androidx.datastore:datastore-macosx64:1.1.2
  • androidx.datastore:datastore-preferences:1.1.2
  • androidx.datastore:datastore-preferences-android:1.1.2
  • androidx.datastore:datastore-preferences-core:1.1.2
  • androidx.datastore:datastore-preferences-core-iosarm64:1.1.2
  • androidx.datastore:datastore-preferences-core-iossimulatorarm64:1.1.2
  • androidx.datastore:datastore-preferences-core-iosx64:1.1.2
  • androidx.datastore:datastore-preferences-core-jvm:1.1.2
  • androidx.datastore:datastore-preferences-core-linuxx64:1.1.2
  • androidx.datastore:datastore-preferences-core-macosarm64:1.1.2
  • androidx.datastore:datastore-preferences-core-macosx64:1.1.2
  • androidx.datastore:datastore-preferences-external-protobuf:1.1.2
  • androidx.datastore:datastore-preferences-iosarm64:1.1.2
  • androidx.datastore:datastore-preferences-iossimulatorarm64:1.1.2
  • androidx.datastore:datastore-preferences-iosx64:1.1.2
  • androidx.datastore:datastore-preferences-jvm:1.1.2
  • androidx.datastore:datastore-preferences-linuxx64:1.1.2
  • androidx.datastore:datastore-preferences-macosarm64:1.1.2
  • androidx.datastore:datastore-preferences-macosx64:1.1.2
  • androidx.datastore:datastore-preferences-proto:1.1.2
  • androidx.datastore:datastore-preferences-rxjava2:1.1.2
  • androidx.datastore:datastore-preferences-rxjava3:1.1.2
  • androidx.datastore:datastore-rxjava2:1.1.2
  • androidx.datastore:datastore-rxjava3:1.1.2
  • androidx.exifinterface:exifinterface:1.4.0-beta01
  • androidx.games:games-activity:4.0.0-beta01
  • androidx.games:games-text-input:4.0.0-beta01
  • androidx.gradle:gradle-version-catalog:2025.01.00
  • androidx.gradle:gradle-version-catalog-alpha:2025.01.00
  • androidx.gradle:gradle-version-catalog-beta:2025.01.00
  • androidx.health.connect:connect-client:1.1.0-alpha11
  • androidx.health.connect:connect-client-external-protobuf:1.1.0-alpha11
  • androidx.health.connect:connect-client-proto:1.1.0-alpha11
  • androidx.heifwriter:heifwriter:1.1.0-alpha04
  • androidx.mediarouter:mediarouter:1.8.0-alpha02
  • androidx.mediarouter:mediarouter-testing:1.8.0-alpha02
  • androidx.performance:performance-annotation:1.0.0-alpha01
  • androidx.performance:performance-annotation-android:1.0.0-alpha01
  • androidx.performance:performance-annotation-iosarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-iossimulatorarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-iosx64:1.0.0-alpha01
  • androidx.performance:performance-annotation-jvm:1.0.0-alpha01
  • androidx.performance:performance-annotation-linuxarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-linuxx64:1.0.0-alpha01
  • androidx.performance:performance-annotation-macosarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-macosx64:1.0.0-alpha01
  • androidx.performance:performance-annotation-mingwx64:1.0.0-alpha01
  • androidx.performance:performance-annotation-tvosarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-tvossimulatorarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-tvosx64:1.0.0-alpha01
  • androidx.performance:performance-annotation-watchosarm32:1.0.0-alpha01
  • androidx.performance:performance-annotation-watchosarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-watchosdevicearm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-watchossimulatorarm64:1.0.0-alpha01
  • androidx.performance:performance-annotation-watchosx64:1.0.0-alpha01
  • androidx.performance:performance-unsafe:1.0.0-alpha01
  • androidx.recyclerview:recyclerview:1.4.0
  • androidx.tv:tv-foundation:1.0.0-alpha12
  • androidx.tv:tv-material:1.1.0-alpha01
  • androidx.wear.compose:compose-foundation:1.5.0-alpha08
  • androidx.wear.compose:compose-material:1.5.0-alpha08
  • androidx.wear.compose:compose-material-core:1.5.0-alpha08
  • androidx.wear.compose:compose-material3:1.0.0-alpha31
  • androidx.wear.compose:compose-navigation:1.5.0-alpha08
  • androidx.wear.compose:compose-ui-tooling:1.5.0-alpha08
  • androidx.wear.protolayout:protolayout:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-expression:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-expression-pipeline:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-external-protobuf:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-material:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-material-core:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-material3:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-proto:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-renderer:1.3.0-alpha06
  • androidx.wear.protolayout:protolayout-testing:1.3.0-alpha06
  • androidx.wear.tiles:tiles:1.5.0-alpha06
  • androidx.wear.tiles:tiles-material:1.5.0-alpha06
  • androidx.wear.tiles:tiles-proto:1.5.0-alpha06
  • androidx.wear.tiles:tiles-renderer:1.5.0-alpha06
  • androidx.wear.tiles:tiles-testing:1.5.0-alpha06
  • androidx.wear.tiles:tiles-tooling:1.5.0-alpha06
  • androidx.wear.tiles:tiles-tooling-preview:1.5.0-alpha06
  • androidx.wear.watchface:watchface:1.3.0-alpha05
  • androidx.wear.watchface:watchface-client:1.3.0-alpha05
  • androidx.wear.watchface:watchface-client-guava:1.3.0-alpha05
  • androidx.wear.watchface:watchface-complications:1.3.0-alpha05
  • androidx.wear.watchface:watchface-complications-data:1.3.0-alpha05
  • androidx.wear.watchface:watchface-complications-data-source:1.3.0-alpha05
  • androidx.wear.watchface:watchface-complications-data-source-ktx:1.3.0-alpha05
  • androidx.wear.watchface:watchface-complications-rendering:1.3.0-alpha05
  • androidx.wear.watchface:watchface-data:1.3.0-alpha05
  • androidx.wear.watchface:watchface-editor:1.3.0-alpha05
  • androidx.wear.watchface:watchface-editor-guava:1.3.0-alpha05
  • androidx.wear.watchface:watchface-guava:1.3.0-alpha05
  • androidx.wear.watchface:watchface-style:1.3.0-alpha05
  • androidx.webkit:webkit:1.13.0-alpha03
  • androidx.window:window:1.4.0-beta01
  • androidx.window:window-core:1.4.0-beta01
  • androidx.window:window-core-android:1.4.0-beta01
  • androidx.window:window-core-iosarm64:1.4.0-beta01
  • androidx.window:window-core-iossimulatorarm64:1.4.0-beta01
  • androidx.window:window-core-iosx64:1.4.0-beta01
  • androidx.window:window-core-jvm:1.4.0-beta01
  • androidx.window:window-core-linuxarm64:1.4.0-beta01
  • androidx.window:window-core-linuxx64:1.4.0-beta01
  • androidx.window:window-core-macosarm64:1.4.0-beta01
  • androidx.window:window-core-macosx64:1.4.0-beta01
  • androidx.window:window-core-tvosarm64:1.4.0-beta01
  • androidx.window:window-core-tvossimulatorarm64:1.4.0-beta01
  • androidx.window:window-core-tvosx64:1.4.0-beta01
  • androidx.window:window-core-watchosarm32:1.4.0-beta01
  • androidx.window:window-core-watchosarm64:1.4.0-beta01
  • androidx.window:window-core-watchosdevicearm64:1.4.0-beta01
  • androidx.window:window-core-watchossimulatorarm64:1.4.0-beta01
  • androidx.window:window-core-watchosx64:1.4.0-beta01
  • androidx.window:window-java:1.4.0-beta01
  • androidx.window:window-rxjava2:1.4.0-beta01
  • androidx.window:window-rxjava3:1.4.0-beta01
  • androidx.window:window-testing:1.4.0-beta01

Jan 15, 2025


Compose Design Systems: Have a Plan

We run into questions like this one a lot. They boil down to “I’m trying to use Compose Material/Material3, and it’s not letting me change this aspect”. The stock response is “Material Design is an opinionated design system”, which is simultaneously fairly accurate and often unhelpful.

So, let’s see why we’re in this situation.

What Came Before

In the beginning in Android development, there was the View system.

This attempted to be malleable to a wide range of circumstances. Given sufficient fussing with styles/themes, calling configuration methods, and the occasional subclass, developers could hammer the framework widgets into shapes that largely met what designers might request. Not everything was configurable, though, and what aspects could and could not be configured wound up being semi-random from the standpoint of consumers of that UI toolkit.

When Google created Material Design, they first attempted to implement it purely through themes for existing widgets, along with a few brand-new widgets. Later, via appcompat, they would mostly-seamlessly switch you to subclasses of widgets (e.g., AppCompatButton instead of Button). This did provide the Material look and feel, but it did so on the open View system. As a result, most of what Material implemented could be overridden, using the same techniques that Google used to implement Material in the first place.

As a result, while Material Design is indeed opinionated, the implementation of Material Design was based on a leaky foundation, such that those opinions often could be ignored.

Compose = Structured Flexibility

Lots of things changed when we moved to Jetpack Compose. One of the big-but-subtle differences, though, is in how widgets are defined. We look at the switch from Java classes plus styles/themes to Kotlin functions and tend to focus on syntax (e.g., no more XML layouts). The “subtle” aspect is that our ability to configure widgets is now limited to the composable’s function parameters, plus composition locals to a lesser extent. Compose lends itself towards structured flexibility, rather than the more ad hoc flexibility of the View system.

The net: while Material Design itself did not change and is still opinionated, the Compose implementation of Material Design does a much better job of enforcing those opinions.

In terms of steering developers to better adhere to Material Design, this is wonderful. In terms of allowing developers to get their work done, this is rather less wonderful.

Let the Complaints Commence

The reason that we get these sorts of questions is because developers use Compose Material/Material3, as they feel that they have no choice. Quoting a comment on that question:

making every view of an app customized with base composables (box, column, etc…) seems an enormous and tedious job

This is an understandable reaction. We have limited documentation on implementing design systems. We have even less tooling support for implementing design systems. On the whole, Compose itself does a fairly good job of making custom design systems possible, but it feels like there has been little work done for making custom design systems approachable.

Personally, I have not found that building a bespoke design system in Compose is all that bad. Having support from things like Compose Theme helps. I recognize that I may be more comfortable with these sorts of things than are a lot of developers, though.

Have a Plan

If you are embarking upon a new Compose or Compose Multiplatform project, it behooves you to spend time considering your approach for a design system.

(if you are already knee-deep in the project, may the deity of your choice have mercy on your soul)

If You Have a Designer

Many professional projects have a graphic designer who will say what the app will look like. If you ask that designer what the project will do for a design system, you are likely to get one of three main responses:

  1. “We will use this official design system: …”, where “…” might be “Material Design” or “Apple’s design system” or “Microsoft’s design system” or “IBM’s design system” or something else. With luck, there already is a Compose implementation of that design system that you can use, such as Compose Cupertino or compose-fluent-ui or Carbon Compose. If there is, make sure that the designer understands that in those places where the designer deviates from the official design system, the implementation of those places will be substantially more expensive to build and maintain. If we can limit how many of those places exist, the app UI will be as inexpensive as possible.

  2. “We like design systems, and we will create our own”. In this case, make sure that software engineering management understands that the implementation of that design system will be expensive, both to build and to maintain. However, since you are using some structured design system, screens and panels based on that design system implementation will be comparatively inexpensive.

  3. “What’s a design system?”. In this case, make sure that software engineering management knows that building the UI of the app will be expensive. Maintenance will be expensive if the design changes after the initial implementation. Using a design system would reduce those costs, and using an official-and-implemented design system would be the least expensive from a software engineering standpoint.

In effect, not going with a standard design system means that the designer is imposing software development and maintenance costs upon the organization. That should be an explicit decision, often by upper management, rather than a designer just deciding on his or her own.

If You Design Things Yourself

Good news: you get to choose your own level of pain!

Bad news: you have to choose your own level of pain!

Just understand that the same sort of breakdown applies as in the professional designer case:

  • Choosing an official-and-implemented design system is cheap, easy, and inflexible

  • Rolling your own design system incurs up-front costs, but ongoing work (screens) and adjustments are comparatively easy, and you have tons of flexibility

  • Not creating a design system, and instead going with “spray and pray” of UI elements, requires least initial mental energy but may make things a lot worse for you over time

Jan 05, 2025


New Jetpack Artifacts: 26 Dec 2024

Nope, we’re not done with 2024 yet. Media3 released 1.5.1 and 1.6.0-alpha01 artifacts:

  • androidx.media3:media3-cast:1.5.1
  • androidx.media3:media3-cast:1.6.0-alpha01
  • androidx.media3:media3-common:1.5.1
  • androidx.media3:media3-common:1.6.0-alpha01
  • androidx.media3:media3-common-ktx:1.5.1
  • androidx.media3:media3-common-ktx:1.6.0-alpha01
  • androidx.media3:media3-container:1.5.1
  • androidx.media3:media3-container:1.6.0-alpha01
  • androidx.media3:media3-database:1.5.1
  • androidx.media3:media3-database:1.6.0-alpha01
  • androidx.media3:media3-datasource:1.5.1
  • androidx.media3:media3-datasource:1.6.0-alpha01
  • androidx.media3:media3-datasource-cronet:1.5.1
  • androidx.media3:media3-datasource-cronet:1.6.0-alpha01
  • androidx.media3:media3-datasource-okhttp:1.5.1
  • androidx.media3:media3-datasource-okhttp:1.6.0-alpha01
  • androidx.media3:media3-datasource-rtmp:1.5.1
  • androidx.media3:media3-datasource-rtmp:1.6.0-alpha01
  • androidx.media3:media3-decoder:1.5.1
  • androidx.media3:media3-decoder:1.6.0-alpha01
  • androidx.media3:media3-effect:1.5.1
  • androidx.media3:media3-effect:1.6.0-alpha01
  • androidx.media3:media3-exoplayer:1.5.1
  • androidx.media3:media3-exoplayer:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-dash:1.5.1
  • androidx.media3:media3-exoplayer-dash:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-hls:1.5.1
  • androidx.media3:media3-exoplayer-hls:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-ima:1.5.1
  • androidx.media3:media3-exoplayer-ima:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-midi:1.5.1
  • androidx.media3:media3-exoplayer-midi:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-rtsp:1.5.1
  • androidx.media3:media3-exoplayer-rtsp:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-smoothstreaming:1.5.1
  • androidx.media3:media3-exoplayer-smoothstreaming:1.6.0-alpha01
  • androidx.media3:media3-exoplayer-workmanager:1.5.1
  • androidx.media3:media3-exoplayer-workmanager:1.6.0-alpha01
  • androidx.media3:media3-extractor:1.5.1
  • androidx.media3:media3-extractor:1.6.0-alpha01
  • androidx.media3:media3-muxer:1.5.1
  • androidx.media3:media3-muxer:1.6.0-alpha01
  • androidx.media3:media3-session:1.5.1
  • androidx.media3:media3-session:1.6.0-alpha01
  • androidx.media3:media3-test-utils:1.5.1
  • androidx.media3:media3-test-utils:1.6.0-alpha01
  • androidx.media3:media3-test-utils-robolectric:1.5.1
  • androidx.media3:media3-test-utils-robolectric:1.6.0-alpha01
  • androidx.media3:media3-transformer:1.5.1
  • androidx.media3:media3-transformer:1.6.0-alpha01
  • androidx.media3:media3-ui:1.5.1
  • androidx.media3:media3-ui:1.6.0-alpha01
  • androidx.media3:media3-ui-leanback:1.5.1
  • androidx.media3:media3-ui-leanback:1.6.0-alpha01

Dec 26, 2024


Random Musings on the Android 16 Developer Preview 2

(I really wanted to open this post with an Android development-themed riff on “Twas the Night Before Christmas”, but the rhyming part of my brain is malfunctioning right now…)

So, we got our second and final developer preview for Android 16. I say “final developer preview” because the next round should be classified as a beta.

Google actually talked a bit more about this release, which is a significant improvement over DP1. The “new features and APIs page” and blog post highlight several changes. Some of those are also explored by Mishaal Rahman in this Android Police post.

Google still has not documented “app functions”. To me, that feels like it might be running late and not make the Android 16 cut.

Beyond that, here is what else caught my eye:

What Might Make Work Wobbly

All apps on Android 16 are subject to “JobScheduler quota optimizations”. To be blunt, this section is not well-written. For example, it refers to “active standby buckets”, which (at present) aren’t a thing, at least in terms of the SDK. Still, from the tone, it feels like background jobs (including WorkManager work) might get stopped more frequently. Fortunately, they did add getStopReason() methods so we can find out why work got stopped, with corresponding stop reason constants (e.g., STOP_REASON_APP_STANDBY, STOP_REASON_QUOTA).

Also, if you had been relying upon the deprecated setImportantWhileForeground() option on JobInfo.Builder, that no longer does anything. While they were at it, they also deprecated and nerfed isImportantWhileForegound() on JobInfo.

What Might Be Key

There is a new KeyStoreManager system service, retrieved via getSystemService() and KEYSTORE_SERVICE.

Among other things, KeyStoreManager has grantKeyAccess(), which allows App A to grant access to a key to App B. While I can see possible use cases, this does not seem to be defended by a permission or anything, and it seems like an obvious thing for malware to want to use. 🤷🏻

What You Might Find Interesting

What Happens Next?

We should get Android 16 Beta 1 in January.

Dec 18, 2024


New Jetpack Artifacts: 12 Dec 2024

OK, yesterday was not the final artifact wave for 2024.

Coinciding with the announcement of Android XR, we got a few new artifact groups:

  • androidx.xr.arcore
  • androidx.xr.compose
  • androidx.xr.compose.material3
  • androidx.xr.runtime
  • androidx.xr.scenecore

And, in those groups, we got some new artifacts:

  • androidx.xr.arcore:arcore
  • androidx.xr.compose:compose
  • androidx.xr.compose:compose-testing
  • androidx.xr.compose.material3:material3
  • androidx.xr.runtime:runtime
  • androidx.xr.runtime:runtime-openxr
  • androidx.xr.runtime:runtime-testing
  • androidx.xr.scenecore:scenecore
  • androidx.xr.scenecore:scenecore-testing

We also got new Compose Material3 alphas and a couple of new BOMs:

  • androidx.compose:compose-bom-alpha:2024.12.00
  • androidx.compose.material3:material3:1.4.0-alpha05
  • androidx.compose.material3:material3-adaptive-navigation-suite:1.4.0-alpha05
  • androidx.compose.material3:material3-adaptive-navigation-suite-android:1.4.0-alpha05
  • androidx.compose.material3:material3-adaptive-navigation-suite-jvmstubs:1.4.0-alpha05
  • androidx.compose.material3:material3-android:1.4.0-alpha05
  • androidx.compose.material3:material3-jvmstubs:1.4.0-alpha05
  • androidx.compose.material3:material3-lint:1.4.0-alpha05
  • androidx.compose.material3:material3-linuxx64stubs:1.4.0-alpha05
  • androidx.compose.material3:material3-window-size-class:1.4.0-alpha05
  • androidx.compose.material3:material3-window-size-class-android:1.4.0-alpha05
  • androidx.compose.material3:material3-window-size-class-jvmstubs:1.4.0-alpha05
  • androidx.compose.material3:material3-window-size-class-linuxx64stubs:1.4.0-alpha05
  • androidx.compose.material3.adaptive:adaptive:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-android:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-jvmstubs:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-layout:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-layout-jvmstubs:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-navigation:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-navigation-android:1.1.0-alpha08
  • androidx.compose.material3.adaptive:adaptive-navigation-jvmstubs:1.1.0-alpha08
  • androidx.gradle:gradle-version-catalog-alpha:2024.12.00
  • androidx.xr.arcore:arcore:1.0.0-alpha01
  • androidx.xr.compose:compose:1.0.0-alpha01
  • androidx.xr.compose:compose-testing:1.0.0-alpha01
  • androidx.xr.compose.material3:material3:1.0.0-alpha01
  • androidx.xr.runtime:runtime:1.0.0-alpha01
  • androidx.xr.runtime:runtime-openxr:1.0.0-alpha01
  • androidx.xr.runtime:runtime-testing:1.0.0-alpha01
  • androidx.xr.scenecore:scenecore:1.0.0-alpha01
  • androidx.xr.scenecore:scenecore-testing:1.0.0-alpha01

Dec 12, 2024


Older Posts