Vor ein paar Tagen wollte ich eine neue Abhaengigkeit, das AWS SDK, zu meiner Jetpack Compose App hinzufuegen - und ploetzlich kam alles zum Stillstand.

Was wie eine leicht zu behebende Fehlermeldung aussah, verwandelte sich in eine Kette von Fehlern, die einer nach dem anderen geloest werden mussten. Es fuehlte sich buchstaeblich so an, als haette ich die Buechse der Pandora geoeffnet und kaempfte darum, sie wieder zu schliessen.

Kotlin Update

Beginnen wir mit der ersten Fehlermeldung direkt nach dem Hinzufuegen der Abhaengigkeit und dem Versuch, erneut zu kompilieren.

Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.5.1.

Dieser Fehler tritt auf, wenn die Kotlin-Version, mit der ein Modul kompiliert wurde, sich von der in der build.gradle deines Projekts angegebenen Kotlin-Version unterscheidet.

Um dies zu beheben, aktualisiere die in build.gradle angegebene Kotlin-Version, damit sie mit der Version uebereinstimmt, die zum Kompilieren des Moduls verwendet wurde.

In der Projekt-build.gradle habe ich

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"

geaendert zu

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"

Das war jedoch ein aelteres Projekt, das ich vor einem Jahr erstellt hatte.

Wenn ich heute ein neues Projekt erstelle, ist die Struktur der build.gradle anders:

buildscript {
...
}
plugins {
...
 id 'org.jetbrains.kotlin.android' version '1.5.21' apply false
}
...

Hier wuerde ich folgende Aenderung vornehmen:

id 'org.jetbrains.kotlin.android' version '1.7.10' apply false

Einer erledigt. Weiter zum naechsten.

Gradle Update

In der Hoffnung, dass alles wieder in Ordnung war, versuchte ich zu kompilieren, bekam aber diese Meldung:

Minimum supported Gradle version is 7.5. Current version is 7.2.

Das schien einfach zu sein - dachte ich zumindest. Das Surfen auf Stack Overflow lieferte zahlreiche Loesungen und ich war mir nicht sicher, welche ich verwenden sollte. Ich probierte die einfachste als akzeptiert markierte Loesung: Caches invalidieren.

Nach dem Neustart von Android Studio versuchte ich erneut zu bauen und bekam eine andere Fehlermeldung.

Android Studio Update

Das Problem schien groesser zu sein. Waehrend der Arbeit in den letzten Monaten hatte ich meine Entwicklungsumgebung vernachlaessigt. Das Ergebnis war dieser Fehler beim Kompilieren:

This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2021.2.1 or newer.

Ja - meine Version von Android Studio war veraltet.

Nach der Suche nach Updates und der Installation der neuesten Version bekam ich eine Version, die erst vor ein paar Tagen veroeffentlicht wurde. Neuer ging es nicht.

Der Dialog zum Loeschen der Caches hatte auch ein paar mehr Optionen bekommen.

Sie haben es vielleicht erraten - es war nicht das Ende. Die Geschichte geht weiter.

Aktualisierung der Build-Dateien

Der naechste Fehler zeigte sich als:

Caused by: org.gradle.api.GradleException: Compilation error. See log for more details

Leider gab es keine andere Meldung, die mich in die richtige Richtung wies.

Also aenderte ich die Struktur der build.gradle, um der Struktur neuer Jetpack Compose Projekte zu entsprechen, in der Hoffnung, dass dies helfen wuerde. Es war nur ein Bauchgefuehl, aber es erwies sich als richtig.

Das bedeutete nicht, dass ich fertig war. Das waere zu einfach gewesen.

Die naechste Huerde:

Plugin [id: 'com.android.application', version: '7.4.0', apply: false] was not found in any of the following sources:

Ich loeste dies, indem ich folgenden Block zu settings.gradle hinzufuegte:

pluginManagement {
 repositories {
  gradlePluginPortal()
  google()
  mavenCentral()
 }
}

Aenderung der Abhaengigkeitsversionen

Offensichtlich hatte ich beim Refactoring der build.gradle-Dateien ein paar Dinge verpasst.

Der naechste Fehler sagte, dass mein Dagger- und Hilt-Plugin fehlte:

Plugin [id: 'dagger.hilt.android.plugin'] was not found in any of the following sources:

Einfache Loesung. In der Projekt-build.gradle fuegte ich die entsprechende Abhaengigkeit hinzu:

plugins {
...
 id 'com.google.dagger.hilt.android' version '2.44.2' apply false
}

Jetzt schien die Jetpack Compose Version nicht zu passen:

e: This version (1.0.1) of the Compose Compiler requires Kotlin version 1.5.21 but you appear to be using Kotlin version 1.7.10 which is not known to be compatible. Please fix your configuration (or `suppressKotlinVersionCompatibilityCheck` but don't say I didn't warn you!).

Ich pruefte die Compose-zu-Kotlin-Kompatibilitaetskarte und entschied mich, die Modul-build.gradle zu aendern von

kotlinCompilerExtensionVersion = "1.0.1"

zu

kotlinCompilerExtensionVersion = "1.4.0"

Der naechste Fehler deutete auf ein weiteres Abhaengigkeitsproblem hin:

The compiler option dagger.hilt.android.internal.projectType is not a recognized Hilt option. Is there a typo?

Ich musste die Versionsnummer aller meiner Dagger-Hilt-Abhaengigkeiten auf die neueste Version, 2.44.2, in der App-build.gradle erhoehen.

Beim erneuten Hinzufuegen des Dagger-Hilt-Plugins nach der Umstrukturierung der Build-Dateien hatte ich bereits die neueste Version verwendet - daher die Nichtubereinstimmung.

Weiter zum naechsten Fehler…

Hey - warten Sie mal! Ich konnte wieder kompilieren.

Die Bereitstellung auf dem Simulator funktionierte, die App startete und…

Bumm!

Meine Hoffnungen wurden mit einer Runtime-Exception zerschlagen:

java.lang.IllegalArgumentException: CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`

Dies stammte aus der Klasse, die den gesamten navigationsbezogenen Code meiner Anwendung enthaelt; ein bisschen SO-Surfen bestaetigte meine Annahme.

Also aktualisierte ich eine weitere Abhaengigkeit in meiner Projekt-build.gradle, diesmal die fuer Navigation:

implementation 'androidx.navigation:navigation-compose:2.5.1'

Kompilieren! Bereitstellen! Ausfuehren!

Es funktionierte wieder!

Was fuer eine Reise. Es hat mich viel Zeit gekostet, die App wieder zum Kompilieren zu bringen. Ich frage mich wirklich, wie ich das alles haette vermeiden und von Anfang an verhindern koennen.

Wie haeltst du deine Projekte aktuell? Pruefst du aktiv auf neue Abhaengigkeitsversionen, oder hoffst du, dass das Hinzufuegen oder Aktualisieren von Abhaengigkeiten das ganze Projekt nicht in Flammen aufgehen laesst?

Normalerweise muss ich nur hier und da eine Abhaengigkeitsversion erhoehen, aber dieses Mal war es anders - eine echte Lernerfahrung.

Vielen Dank fuers Lesen!

Ressourcen