From 0816c89cbef08b9c8cf4fa364726e867e8c95f2e Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 3 Jul 2025 16:45:32 -0400 Subject: [PATCH 1/9] [Infra] Bump kotlin and related deps to 2.0.21 Jump to the kotlin 2.x badgawon. Beyond updating the stdlib, related dependencies are bumped to the latest version they released that also depends on 2.0.x Includse: - coroutines - serialization - mockk --- gradle/libs.versions.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64682610bd7..3b634412d01 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ cardview = "1.0.0" checkerQual = "2.5.2" constraintlayout = "2.1.4" coreKtx = "1.12.0" -coroutines = "1.7.3" +coroutines = "1.9.0" dagger = "2.43.2" datastore = "1.1.3" dexmaker = "2.28.1" @@ -45,8 +45,8 @@ javalite = "3.25.5" jsonassert = "1.5.0" kotest = "5.9.0" # Do not use 5.9.1 because it reverts the fix for https://github.com/kotest/kotest/issues/3981 kotestAssertionsCore = "5.8.1" -kotlin = "1.8.22" -ktorVersion = "2.3.2" +kotlin = "2.0.21" +ktorVersion = "3.0.3" legacySupportV4 = "1.0.0" lifecycleProcess = "2.3.1" material = "1.12.0" @@ -54,7 +54,7 @@ mavenResolverApi = "1.9.23" mavenResolverProvider = "3.9.9" mockito = "5.2.0" mockitoAndroid = "3.4.0" -mockk = "1.13.11" +mockk = "1.14.2" # Do not use 1.14.3 or above since it bumps kotlin to 2.1.x playServicesCloudMessaging = "17.2.0" playServicesStats = "17.0.2" playServicesVision = "20.1.3" @@ -68,7 +68,7 @@ robolectric = "4.12" runner = "1.0.2" rxandroid = "2.0.2" rxjava = "2.1.14" -serialization = "1.5.1" +serialization = "1.7.3" slf4jNop = "2.0.9" spotless = "7.0.4" testServices = "1.2.0" From fecdf64e02b75e205eff97ba90af8c9dae9a83bc Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 3 Jul 2025 17:25:34 -0400 Subject: [PATCH 2/9] Update kapt to a version supporting kotlin2 --- build.gradle.kts | 1 + firebase-sessions/firebase-sessions.gradle.kts | 2 +- gradle/libs.versions.toml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a10ac0119ea..ef66a75f530 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,6 +22,7 @@ plugins { alias(libs.plugins.protobuf) apply false alias(libs.plugins.errorprone) alias(libs.plugins.crashlytics) apply false + alias(libs.plugins.kapt) apply false id("PublishingPlugin") id("firebase-ci") id("smoke-tests") diff --git a/firebase-sessions/firebase-sessions.gradle.kts b/firebase-sessions/firebase-sessions.gradle.kts index b136a281660..7557a2c17da 100644 --- a/firebase-sessions/firebase-sessions.gradle.kts +++ b/firebase-sessions/firebase-sessions.gradle.kts @@ -20,7 +20,7 @@ plugins { id("firebase-library") id("firebase-vendor") id("kotlin-android") - id("kotlin-kapt") + alias(libs.plugins.kapt) } firebaseLibrary { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3b634412d01..9950854801d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -240,3 +240,4 @@ protobuf = { id = "com.google.protobuf", version.ref = "protobufGradlePlugin" } errorprone = { id = "net.ltgt.errorprone", version.ref = "gradleErrorpronePlugin" } google-services = { id = "com.google.gms.google-services", version.ref = "googleServices" } crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebaseCrashlyticsGradle" } +kapt = { id = "org.jetbrains.kotlin.kapt", version = "2.1.20"} From 062d564ff12d1be6ac12975f663e9da41ede13b4 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Thu, 3 Jul 2025 17:51:49 -0400 Subject: [PATCH 3/9] Bump dagger to the last version supporting kotlin 2.0 --- gradle/libs.versions.toml | 2 +- subprojects.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9950854801d..868e00f9d97 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ checkerQual = "2.5.2" constraintlayout = "2.1.4" coreKtx = "1.12.0" coroutines = "1.9.0" -dagger = "2.43.2" +dagger = "2.55" datastore = "1.1.3" dexmaker = "2.28.1" dexmakerVersion = "1.2" diff --git a/subprojects.cfg b/subprojects.cfg index 72e06c9248f..329cd7f117a 100644 --- a/subprojects.cfg +++ b/subprojects.cfg @@ -24,7 +24,7 @@ firebase-config:test-app firebase-config-interop firebase-crashlytics firebase-crashlytics:ktx -firebase-crashlytics-ndk +# firebase-crashlytics-ndk firebase-database firebase-database:ktx firebase-database-collection From a0c44ca0d610dc51927d28b21535062a08ed6c3b Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Fri, 4 Jul 2025 13:10:37 -0400 Subject: [PATCH 4/9] Fix issue preveting crashlytics-ndk from compile --- .../firebase/gradle/plugins/GradleExtensions.kt | 15 ++++++++++++++- subprojects.cfg | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt index 88cd9927045..dc77497030a 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt @@ -39,7 +39,8 @@ import org.gradle.kotlin.dsl.apply import org.gradle.workers.WorkAction import org.gradle.workers.WorkParameters import org.gradle.workers.WorkQueue -import org.jetbrains.kotlin.gradle.utils.provider +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty /** * Creates a file at the buildDir for the given [Project]. @@ -307,3 +308,15 @@ val Provider.nestedFile: Provider */ val Directory.nestedFile: File get() = asFileTree.single { it.isFile } + + +/** + * Creates a delegated provider. + * + * Useful to expose a provide via delegated properties. See [tempFile] for a reference usage. + */ +internal fun provider(provider: () -> T) = object: ReadOnlyProperty { + override operator fun getValue(thisRef: Any?, property: KProperty<*>): T { + return provider() + } +} diff --git a/subprojects.cfg b/subprojects.cfg index 329cd7f117a..72e06c9248f 100644 --- a/subprojects.cfg +++ b/subprojects.cfg @@ -24,7 +24,7 @@ firebase-config:test-app firebase-config-interop firebase-crashlytics firebase-crashlytics:ktx -# firebase-crashlytics-ndk +firebase-crashlytics-ndk firebase-database firebase-database:ktx firebase-database-collection From d4f9752bdcc37d2b29ffa8650f64ef7207c6159d Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Fri, 4 Jul 2025 13:17:59 -0400 Subject: [PATCH 5/9] Fix format --- .../firebase/gradle/plugins/GradleExtensions.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt index dc77497030a..90d4e3fc50b 100644 --- a/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt +++ b/plugins/src/main/java/com/google/firebase/gradle/plugins/GradleExtensions.kt @@ -22,6 +22,8 @@ import java.io.BufferedOutputStream import java.io.File import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task @@ -39,8 +41,6 @@ import org.gradle.kotlin.dsl.apply import org.gradle.workers.WorkAction import org.gradle.workers.WorkParameters import org.gradle.workers.WorkQueue -import kotlin.properties.ReadOnlyProperty -import kotlin.reflect.KProperty /** * Creates a file at the buildDir for the given [Project]. @@ -309,14 +309,14 @@ val Provider.nestedFile: Provider val Directory.nestedFile: File get() = asFileTree.single { it.isFile } - /** * Creates a delegated provider. * * Useful to expose a provide via delegated properties. See [tempFile] for a reference usage. */ -internal fun provider(provider: () -> T) = object: ReadOnlyProperty { - override operator fun getValue(thisRef: Any?, property: KProperty<*>): T { - return provider() +internal fun provider(provider: () -> T) = + object : ReadOnlyProperty { + override operator fun getValue(thisRef: Any?, property: KProperty<*>): T { + return provider() + } } -} From b44962d5236faf0be4cbde06c6357211b85cd70f Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Fri, 4 Jul 2025 14:26:39 -0400 Subject: [PATCH 6/9] Fix smoke-tests --- smoke-tests/build.gradle | 26 +++++++++++++------------- smoke-tests/configure.gradle | 2 +- smoke-tests/gradle.properties | 1 - 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/smoke-tests/build.gradle b/smoke-tests/build.gradle index 0df93b49a47..572c52cdff8 100644 --- a/smoke-tests/build.gradle +++ b/smoke-tests/build.gradle @@ -23,10 +23,10 @@ buildscript { } dependencies { - classpath "com.android.tools.build:gradle:8.3.2" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" - classpath "com.google.gms:google-services:4.3.14" - classpath "com.google.firebase:firebase-crashlytics-gradle:2.8.1" + classpath "com.android.tools.build:gradle:8.6.1" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21" + classpath "com.google.gms:google-services:4.4.3" + classpath "com.google.firebase:firebase-crashlytics-gradle:3.0.4" } } @@ -69,33 +69,33 @@ apply from: "configure.gradle" dependencies { implementation libs.androidx.test.core // Common utilities (application side) - implementation "androidx.test:rules:1.4.0" - implementation "androidx.test:runner:1.4.0" + implementation "androidx.test:rules:1.5.0" + implementation "androidx.test:runner:1.6.2" // Firebase implementation "com.google.firebase:firebase-analytics" implementation "com.google.firebase:firebase-annotations" - implementation "com.google.firebase:firebase-appdistribution:16.0.0-beta03" - implementation "com.google.firebase:firebase-appdistribution-api:16.0.0-beta03" + implementation "com.google.firebase:firebase-appdistribution:16.0.0-beta15" + implementation "com.google.firebase:firebase-appdistribution-api:16.0.0-beta15" implementation "com.google.firebase:firebase-auth" implementation "com.google.firebase:firebase-common" implementation "com.google.firebase:firebase-config" - implementation "com.google.firebase:firebase-crashlytics:18.6.4" + implementation "com.google.firebase:firebase-crashlytics:19.4.4" implementation "com.google.firebase:firebase-database" implementation "com.google.firebase:firebase-firestore" implementation "com.google.firebase:firebase-functions" // TODO(yifany): remove after the issue is fixed // https://github.com/firebase/firebase-android-sdk/issues/4206 - implementation "com.google.firebase:firebase-iid:21.1.0" + implementation "com.google.firebase:firebase-iid" implementation "com.google.firebase:firebase-inappmessaging" implementation "com.google.firebase:firebase-messaging" - implementation "com.google.firebase:firebase-ml-modeldownloader:24.2.3" + implementation "com.google.firebase:firebase-ml-modeldownloader:25.0.1" implementation "com.google.firebase:firebase-perf" implementation "com.google.firebase:firebase-storage" - implementation "com.google.truth:truth:1.0.1" + implementation "com.google.truth:truth:1.4.4" implementation libs.junit // Common utilities (instrumentation side) - androidTestImplementation "androidx.test:runner:1.4.0" + androidTestImplementation "androidx.test:runner:1.6.2" androidTestImplementation libs.junit // Desugaring library diff --git a/smoke-tests/configure.gradle b/smoke-tests/configure.gradle index 65e5aac2690..44fee11f4f8 100644 --- a/smoke-tests/configure.gradle +++ b/smoke-tests/configure.gradle @@ -14,7 +14,7 @@ def configurePlatform() { - def bom = "com.google.firebase:firebase-bom:20.0.0" + def bom = "com.google.firebase:firebase-bom:33.16.0" if (project.hasProperty("firebase-bom")) { bom = project.getProperty("firebase-bom") } diff --git a/smoke-tests/gradle.properties b/smoke-tests/gradle.properties index 372e31337a0..21666b332ee 100644 --- a/smoke-tests/gradle.properties +++ b/smoke-tests/gradle.properties @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -android.enableR8=true android.useAndroidX=true org.gradle.jvmargs=-Xmx8g From f144e57c98be77d7a7e5e71587d61e5e9468acb6 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Sat, 5 Jul 2025 07:20:11 -0400 Subject: [PATCH 7/9] Fix errors in lint tests --- tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt b/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt index 535c9c2befa..48c1f958d81 100644 --- a/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt +++ b/tools/lint/src/test/kotlin/FirebaseAppGetDetectorTests.kt @@ -120,7 +120,7 @@ class FirebaseAppGetDetectorTests : LintDetectorTest() { val instance = FirebaseApp.getInstance().get(Foo::class.java) @JvmStatic - fun getInstance(app: FirebaseApp) = app.get(Foo::class.java) + fun getInstance(app: FirebaseApp): Foo = app.get(Foo::class.java) } } """ @@ -145,7 +145,7 @@ class FirebaseAppGetDetectorTests : LintDetectorTest() { val instance = FirebaseApp.getInstance().get(FooImpl::class.java) @JvmStatic - fun getInstance(app: FirebaseApp) = app.get(FooImpl::class.java) + fun getInstance(app: FirebaseApp): Foo = app.get(FooImpl::class.java) } } class FooImpl : Foo() From aa3df90d241d2a59c6a57ce2160fc8cf5179aa87 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Sat, 5 Jul 2025 07:44:35 -0400 Subject: [PATCH 8/9] Address usage of API 24 within perf Error was Error: The type of the for loop iterated value is java.util.concurrent.ConcurrentHashMap.KeySetView, which requires API level 24, or core library desugaring (current min is 21); to work around this, add an explicit cast to (Map) before the keySet call. [NewApi] for (String existingKey : allRcConfigMap.keySet()) { ~~~~~~~~~~~~~~~~~~~~~~~ Explanation for issues of type "NewApi": This check scans through all the Android API calls in the application and warns about any calls that are not available on all versions targeted by this application (according to its minimum SDK attribute in the manifest). If you really want to use this API and don't need to support older devices just set the minSdkVersion in your build.gradle or AndroidManifest.xml files. If your code is deliberately accessing newer APIs, and you have ensured (e.g. with conditional execution) that this code will only ever be called on a supported platform, then you can annotate your class or method with the @TargetApi annotation specifying the local minimum SDK to apply, such as @TargetApi(11), such that this check considers 11 rather than your manifest file's minimum SDK as the required API level. If you are deliberately setting android: attributes in style definitions, make sure you place this in a values-vNN folder in order to avoid running into runtime conflicts on certain devices where manufacturers have added custom attributes whose ids conflict with the new ones on later platforms. Similarly, you can use tools:targetApi="11" in an XML file to indicate that the element will only be inflated in an adequate context. --- .../com/google/firebase/perf/config/RemoteConfigManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java index 36d8c272aef..8065997974d 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java @@ -363,7 +363,7 @@ private void triggerFirebaseRemoteConfigFetchAndActivateOnSuccessfulFetch() { @VisibleForTesting protected void syncConfigValues(Map newlyFetchedMap) { allRcConfigMap.putAll(newlyFetchedMap); - for (String existingKey : allRcConfigMap.keySet()) { + for (String existingKey : ((Map) allRcConfigMap).keySet()) { if (!newlyFetchedMap.containsKey(existingKey)) { allRcConfigMap.remove(existingKey); } From 0cab42a39b0bb42f0849d26dc20913d891c2f7d5 Mon Sep 17 00:00:00 2001 From: Rodrigo Lazo Paz Date: Sat, 5 Jul 2025 08:10:45 -0400 Subject: [PATCH 9/9] Reduce mockk bump to prevent bug in spyk --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 868e00f9d97..4bb7117378c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ mavenResolverApi = "1.9.23" mavenResolverProvider = "3.9.9" mockito = "5.2.0" mockitoAndroid = "3.4.0" -mockk = "1.14.2" # Do not use 1.14.3 or above since it bumps kotlin to 2.1.x +mockk = "1.14.0" # Do not use 1.14.2 or above due to a bug in spyK and bumps kotlin to 2.1.x playServicesCloudMessaging = "17.2.0" playServicesStats = "17.0.2" playServicesVision = "20.1.3"