Refactor code to support AGP 9.0

This commit is contained in:
2025-12-20 20:53:13 +03:00
Unverified
parent 8151e0ca0d
commit b18af36b3e
133 changed files with 255 additions and 125 deletions
+8
View File
@@ -0,0 +1,8 @@
<component name="ArtifactManager">
<artifact type="jar" name="shared">
<output-path>$PROJECT_DIR$/utils/shared/build/libs</output-path>
<root id="archive" name="shared.jar">
<element id="module-output" name="FromChat.utils.shared.androidMain" />
</root>
</artifact>
</component>
+5 -1
View File
@@ -10,8 +10,12 @@
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/composeApp" /> <option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/app/android" />
<option value="$PROJECT_DIR$/app/shared" />
<option value="$PROJECT_DIR$/utils" /> <option value="$PROJECT_DIR$/utils" />
<option value="$PROJECT_DIR$/utils/android" />
<option value="$PROJECT_DIR$/utils/shared" />
</set> </set>
</option> </option>
</GradleProjectSettings> </GradleProjectSettings>
+1
View File
@@ -69,6 +69,7 @@
<option name="processComments" value="true" /> <option name="processComments" value="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="UnnecessaryModuleDependencyInspection" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="UnnecessaryModuleDependencyInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="UnstableApiUsage" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="UnusedSymbol" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" /> <inspection_tool class="UnusedSymbol" enabled="true" level="WEAK WARNING" enabled_by_default="true" editorAttributes="INFO_ATTRIBUTES" />
</profile> </profile>
</component> </component>
+117
View File
@@ -0,0 +1,117 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.io.FileInputStream
import java.util.Properties
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.compose.multiplatform)
}
kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
}
}
// 1. Описываем задачу копирования с созданием правильной структуры
val fixComposeResourcesStructure = tasks.register<Copy>("fixComposeResourcesStructure") {
val sharedProject = rootProject.project(":app:shared")
// Откуда берем (исходные сгенерированные файлы)
val sourceDir = sharedProject.layout.buildDirectory
.dir("generated/compose/resourceGenerator/preparedResources/commonMain/composeResources")
// Куда кладем (создаем промежуточную папку с ПРАВИЛЬНЫМ путем)
val outputDir = layout.buildDirectory.dir("intermediates/fixed_compose_res/composeResources/ru.fromchat")
from(sourceDir)
into(outputDir)
// Убеждаемся, что генерация в shared уже прошла
dependsOn(sharedProject.tasks.matching { it.name.contains("prepareComposeResources", ignoreCase = true) })
dependsOn(sharedProject.tasks.matching { it.name.contains("copyNonXmlValueResources", ignoreCase = true) })
}
android {
namespace = "ru.fromchat"
compileSdk = 36
defaultConfig {
applicationId = "ru.fromchat"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
}
signingConfigs {
create("release") {
val keystoreProperties = Properties().apply {
load(FileInputStream(rootProject.file("keys/keystore.properties")))
}
storeFile = rootProject.file("keys/release.jks")
keyAlias = "release"
storePassword = keystoreProperties["storePassword"].toString()
keyPassword = keystoreProperties["keyPassword"].toString()
enableV3Signing = true
}
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
sourceSets["main"].apply {
assets.srcDirs(
layout.buildDirectory.dir("intermediates/fixed_compose_res")
)
}
}
tasks.withType<com.android.build.gradle.tasks.MergeSourceSetFolders>().configureEach {
dependsOn(fixComposeResourcesStructure)
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.ui.graphics)
implementation(libs.androidx.compose.ui.tooling.preview)
implementation(libs.androidx.compose.material3)
debugImplementation(libs.androidx.compose.ui.tooling)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.adaptive.android)
implementation(libs.ktor.client.okhttp)
implementation(libs.ktor.client.core)
implementation(libs.slf4j.android)
implementation(libs.material)
implementation(project(":app:shared"))
implementation(project(":utils:shared"))
}

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 121 KiB

@@ -1,5 +1,3 @@
@file:Suppress("NOTHING_TO_INLINE")
package ru.fromchat package ru.fromchat
import android.os.Bundle import android.os.Bundle
@@ -20,4 +18,3 @@ class MainActivity : ComponentActivity() {
} }
} }
} }

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

@@ -1,17 +1,20 @@
import java.io.FileInputStream import com.android.build.api.dsl.androidLibrary
import java.util.Properties
plugins { plugins {
alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.androidApplication) alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.composeMultiplatform) alias(libs.plugins.compose.compiler)
alias(libs.plugins.composeCompiler) alias(libs.plugins.android.kotlin.multiplatform.library)
kotlin("plugin.serialization") version "1.9.22" kotlin("plugin.serialization") version "1.9.22"
} }
kotlin { kotlin {
androidTarget() androidLibrary {
namespace = "ru.fromchat.shared"
minSdk = 24
compileSdk = 36
}
compilerOptions { compilerOptions {
freeCompilerArgs.addAll("-Xexpect-actual-classes") freeCompilerArgs.addAll("-Xexpect-actual-classes")
@@ -36,14 +39,7 @@ kotlin {
} }
androidMain.dependencies { androidMain.dependencies {
implementation(compose.preview)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.adaptive.android)
implementation(libs.ktor.client.okhttp) implementation(libs.ktor.client.okhttp)
implementation(libs.ktor.client.core)
implementation(libs.slf4j.android)
implementation(libs.material)
} }
commonMain.dependencies { commonMain.dependencies {
@@ -78,7 +74,7 @@ kotlin {
implementation(libs.coil.compose) implementation(libs.coil.compose)
implementation(libs.coil.network.ktor3) implementation(libs.coil.network.ktor3)
implementation(project(":utils")) implementation(project(":utils:shared"))
} }
iosMain.dependencies { iosMain.dependencies {
@@ -89,60 +85,6 @@ kotlin {
} }
} }
android {
namespace = "ru.fromchat"
compileSdk = 36
defaultConfig {
applicationId = "ru.fromchat"
minSdk = 24
targetSdk = 36
versionCode = 1
versionName = "1.0"
}
signingConfigs {
create("release") {
val keystoreProperties = Properties().apply {
load(FileInputStream(rootProject.file("keys/keystore.properties")))
}
storeFile = rootProject.file("keys/release.jks")
keyAlias = "release"
storePassword = keystoreProperties["storePassword"].toString()
keyPassword = keystoreProperties["keyPassword"].toString()
enableV3Signing = true
}
}
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
debugImplementation(compose.uiTooling)
}
compose.resources { compose.resources {
publicResClass = true publicResClass = true
packageOfResClass = "ru.fromchat" packageOfResClass = "ru.fromchat"
@@ -16,11 +16,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntOffset
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
+6 -6
View File
@@ -1,11 +1,11 @@
plugins { plugins {
// this is necessary to avoid the plugins to be loaded multiple times // this is necessary to avoid the plugins to be loaded multiple times
// in each subproject's classloader // in each subproject's classloader
alias(libs.plugins.androidApplication) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.androidLibrary) apply false alias(libs.plugins.compose.multiplatform) apply false
alias(libs.plugins.composeMultiplatform) apply false alias(libs.plugins.compose.compiler) apply false
alias(libs.plugins.composeCompiler) apply false alias(libs.plugins.kotlin.multiplatform) apply false
alias(libs.plugins.kotlinMultiplatform) apply false alias(libs.plugins.android.kotlin.multiplatform.library) apply false
alias(libs.plugins.androidKotlinMultiplatformLibrary) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false
alias(libs.plugins.android.library) apply false
} }
+16 -7
View File
@@ -25,6 +25,8 @@ datastore = "1.2.0"
ktor = "3.3.3" ktor = "3.3.3"
slf4j = "1.7.36" slf4j = "1.7.36"
kotlinxDatetime = "0.7.1" kotlinxDatetime = "0.7.1"
lifecycleRuntimeKtx = "2.10.0"
composeBom = "2025.12.01"
[libraries] [libraries]
androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }
@@ -58,12 +60,19 @@ ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "kto
ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" }
slf4j-android = { module = "org.slf4j:slf4j-android", version.ref = "slf4j" } slf4j-android = { module = "org.slf4j:slf4j-android", version.ref = "slf4j" }
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-compose-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
androidLibrary = { id = "com.android.library", version.ref = "agp" } compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" }
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }
androidKotlinMultiplatformLibrary = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version = "2.3.0" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } android-library = { id = "com.android.library", version.ref = "agp" }
+1
View File
@@ -5,6 +5,7 @@ struct iOSApp: App {
var body: some Scene { var body: some Scene {
WindowGroup { WindowGroup {
ContentView() ContentView()
} }
} }
} }
+4 -1
View File
@@ -1,5 +1,8 @@
@file:Suppress("UnstableApiUsage") @file:Suppress("UnstableApiUsage")
include(":utils:android")
rootProject.name = "FromChat" rootProject.name = "FromChat"
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
@@ -30,5 +33,5 @@ dependencyResolutionManagement {
} }
} }
include(":composeApp", ":utils") include(":app:shared", ":utils:shared", ":app:android")
+46
View File
@@ -0,0 +1,46 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.jetbrains.kotlin.android)
}
kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_17
}
}
android {
namespace = "com.pr0gramm3r101.utils"
compileSdk = 36
defaultConfig {
minSdk = 24
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
dependencies {
implementation(libs.androidx.adaptive.android)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.gson)
}
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
+1
View File
@@ -0,0 +1 @@
/build
@@ -1,10 +1,10 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget import com.android.build.api.dsl.androidLibrary
plugins { plugins {
alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.androidKotlinMultiplatformLibrary) alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.composeMultiplatform) alias(libs.plugins.compose.compiler)
alias(libs.plugins.composeCompiler) alias(libs.plugins.android.kotlin.multiplatform.library)
} }
kotlin { kotlin {
@@ -16,9 +16,6 @@ kotlin {
namespace = "com.pr0gramm3r101.utils" namespace = "com.pr0gramm3r101.utils"
compileSdk = 36 compileSdk = 36
minSdk = 24 minSdk = 24
compilerOptions.jvmTarget.set(JvmTarget.JVM_17)
androidResources.enable = true
} }
listOf( listOf(
@@ -27,7 +24,7 @@ kotlin {
iosSimulatorArm64() iosSimulatorArm64()
).forEach { ).forEach {
it.binaries.framework { it.binaries.framework {
baseName = "utils" baseName = "shared"
} }
} }
@@ -46,17 +43,12 @@ kotlin {
} }
androidMain.dependencies { androidMain.dependencies {
implementation(libs.androidx.adaptive.android)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.biometric)
implementation(libs.gson)
implementation(libs.androidx.adaptive.android) implementation(libs.androidx.adaptive.android)
implementation(libs.datastore.preferences) implementation(libs.datastore.preferences)
implementation(libs.datastore.core) implementation(libs.datastore.core)
implementation(libs.biometric)
implementation(libs.androidx.appcompat)
implementation(libs.material)
} }
iosMain.dependencies { iosMain.dependencies {
@@ -67,6 +59,6 @@ kotlin {
compose.resources { compose.resources {
publicResClass = true publicResClass = true
packageOfResClass = "com.pr0gramm3r101.utils" packageOfResClass = "com.pr0gramm3r101.shared"
generateResClass = auto generateResClass = auto
} }

Some files were not shown because too many files have changed in this diff Show More