From 94e3e394afc37bc463f1153ecc4bc993b7f984e6 Mon Sep 17 00:00:00 2001 From: KremeCN <3265494849@qq.com> Date: Wed, 26 Aug 2026 06:24:16 +0800 Subject: [PATCH] build: modernize Android Compose toolchain --- android/app/build.gradle.kts | 19 +++++------ android/core/designsystem/build.gradle.kts | 15 ++++---- android/core/session/build.gradle.kts | 11 +++--- .../manager/session/CredentialStoreTest.kt | 3 ++ .../session/ProviderProfileStoreTest.kt | 3 ++ android/feature/infrared/build.gradle.kts | 15 ++++---- build.gradle.kts | 2 +- gradle.properties | 3 ++ gradle/libs.versions.toml | 34 +++++++++++++------ gradle/wrapper/gradle-wrapper.properties | 4 +-- 10 files changed, 65 insertions(+), 44 deletions(-) rename android/core/session/src/{test => androidTest}/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt (97%) rename android/core/session/src/{test => androidTest}/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt (92%) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 464ffd4..f34df9c 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,18 +1,21 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.hilt.android) } android { namespace = "com.flagship.abox.manager" - compileSdk = 34 + compileSdk = 37 defaultConfig { applicationId = "com.flagship.abox.manager" minSdk = 26 - targetSdk = 34 + targetSdk = 36 versionCode = 1 versionName = "0.1.0" @@ -33,19 +36,11 @@ android { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get() - } - compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" - } - packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" @@ -57,6 +52,10 @@ android { } } +kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } +} + kapt { correctErrorTypes = true } diff --git a/android/core/designsystem/build.gradle.kts b/android/core/designsystem/build.gradle.kts index 18a7dfe..5148944 100644 --- a/android/core/designsystem/build.gradle.kts +++ b/android/core/designsystem/build.gradle.kts @@ -1,11 +1,14 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) } android { namespace = "com.flagship.abox.manager.designsystem" - compileSdk = 34 + compileSdk = 37 defaultConfig { minSdk = 26 @@ -15,18 +18,14 @@ android { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get() - } - compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } +} - kotlinOptions { - jvmTarget = "17" - } +kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } dependencies { diff --git a/android/core/session/build.gradle.kts b/android/core/session/build.gradle.kts index 2fb4697..d0e15e2 100644 --- a/android/core/session/build.gradle.kts +++ b/android/core/session/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) @@ -5,7 +7,7 @@ plugins { android { namespace = "com.flagship.abox.manager.session" - compileSdk = 34 + compileSdk = 37 defaultConfig { minSdk = 26 @@ -16,10 +18,10 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } +} - kotlinOptions { - jvmTarget = "17" - } +kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } dependencies { @@ -31,4 +33,5 @@ dependencies { testImplementation(libs.kotlinx.coroutines.test) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.test.runner) + androidTestImplementation(libs.kotlinx.coroutines.test) } diff --git a/android/core/session/src/test/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt b/android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt similarity index 97% rename from android/core/session/src/test/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt rename to android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt index b912d27..829689d 100644 --- a/android/core/session/src/test/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt +++ b/android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/CredentialStoreTest.kt @@ -1,6 +1,7 @@ package com.flagship.abox.manager.session import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.test.ext.junit.runners.AndroidJUnit4 import com.flagship.abox.manager.domain.DomainResult import com.flagship.abox.manager.domain.LoginCredentials import com.flagship.abox.manager.domain.Password @@ -13,7 +14,9 @@ import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Test +import org.junit.runner.RunWith +@RunWith(AndroidJUnit4::class) class CredentialStoreTest { @Test fun storesClearsAndIsolatesCredentials() = runTest { diff --git a/android/core/session/src/test/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt b/android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt similarity index 92% rename from android/core/session/src/test/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt rename to android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt index 8616cd5..f32d788 100644 --- a/android/core/session/src/test/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt +++ b/android/core/session/src/androidTest/kotlin/com/flagship/abox/manager/session/ProviderProfileStoreTest.kt @@ -1,6 +1,7 @@ package com.flagship.abox.manager.session import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.test.ext.junit.runners.AndroidJUnit4 import com.flagship.abox.manager.domain.DomainResult import com.flagship.abox.manager.domain.LoginPreferences import com.flagship.abox.manager.domain.ProviderProfile @@ -13,7 +14,9 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Test +import org.junit.runner.RunWith +@RunWith(AndroidJUnit4::class) class ProviderProfileStoreTest { @Test fun persistsActiveProfileAndLoginPreferences() = runTest { diff --git a/android/feature/infrared/build.gradle.kts b/android/feature/infrared/build.gradle.kts index d088f6b..2bf2ebb 100644 --- a/android/feature/infrared/build.gradle.kts +++ b/android/feature/infrared/build.gradle.kts @@ -1,13 +1,16 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) alias(libs.plugins.kotlin.kapt) alias(libs.plugins.hilt.android) } android { namespace = "com.flagship.abox.manager.infrared" - compileSdk = 34 + compileSdk = 37 defaultConfig { minSdk = 26 @@ -18,18 +21,14 @@ android { compose = true } - composeOptions { - kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get() - } - compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } +} - kotlinOptions { - jvmTarget = "17" - } +kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } kapt { diff --git a/build.gradle.kts b/build.gradle.kts index 46c8d89..1db8c35 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,8 +2,8 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.kotlin.android) apply false + alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.kapt) apply false alias(libs.plugins.hilt.android) apply false } - diff --git a/gradle.properties b/gradle.properties index dd2a6d4..1cd37dd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,3 +4,6 @@ android.useAndroidX=true android.nonTransitiveRClass=true kotlin.code.style=official android.overridePathCheck=true +android.builtInKotlin=false +android.newDsl=false +kotlin.jvm.target.validation.mode=warning diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7aa0738..45965b6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,15 +1,20 @@ [versions] -agp = "8.7.3" -kotlin = "1.9.24" -composeBom = "2024.06.00" -composeCompiler = "1.5.14" +agp = "9.3.2" +kotlin = "2.4.0" +composeBom = "2026.08.00" coroutines = "1.8.1" -hilt = "2.51.1" -navigationCompose = "2.7.7" -activityCompose = "1.9.0" -lifecycle = "2.8.2" -room = "2.6.1" -datastore = "1.1.1" +hilt = "2.60.1" +hiltNavigationCompose = "1.4.0" +navigationCompose = "2.9.8" +activityCompose = "1.13.0" +lifecycle = "2.11.0" +room = "2.8.4" +datastore = "1.2.1" +work = "2.11.2" +adaptive = "1.3.0" +adaptiveNavigationSuite = "1.4.0" +window = "1.5.1" +composeScreenshot = "0.0.1-alpha16" junit = "4.13.2" androidxJunit = "1.2.1" espresso = "3.6.1" @@ -20,7 +25,12 @@ androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-ru androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } -androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version = "1.2.0" } +androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" } +androidx-hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hiltNavigationCompose" } +androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work" } +androidx-compose-material3-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" } +androidx-compose-material3-adaptive-navigation-suite = { module = "androidx.compose.material3:material3-adaptive-navigation-suite", version.ref = "adaptiveNavigationSuite" } +androidx-window = { module = "androidx.window:window", version.ref = "window" } compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" } compose-ui = { module = "androidx.compose.ui:ui" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } @@ -47,6 +57,8 @@ espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } +compose-screenshot = { id = "com.android.compose.screenshot", version.ref = "composeScreenshot" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 496c514..a351597 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 -validateDistributionUrl=false +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists