Skip to content

Commit 82fb9b6

Browse files
committed
#843 android tasks configuration moved to apply plugin, android plugins enum
1 parent 5fcc7b3 commit 82fb9b6

7 files changed

Lines changed: 83 additions & 38 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
org.gradle.jvmargs=-Xmx12g
22
org.gradle.parallel=true
3-
org.gradle.caching=false
3+
org.gradle.caching=true
44

55
kotlin.code.style=official
66

resources-generator/build.gradle.kts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -66,21 +66,21 @@ gradlePlugin {
6666
vcsUrl.set("https://github.com/icerockdev/moko-resources")
6767
}
6868

69-
project.plugins.withId("com.android.kotlin.multiplatform.library") {
70-
val androidComponents = project.extensions.getByType(
71-
com.android.build.api.variant.AndroidComponentsExtension::class.java
72-
)
73-
74-
androidComponents.onVariants { variant ->
75-
val capName = variant.name.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
76-
77-
// задача генерации создаётся библиотекой/плагином
78-
val generateTask = project.tasks.named("generateMRandroidMain")
79-
80-
// связываем упаковку ресурсов конкретного варианта с генерацией
81-
project.tasks.matching { it.name == "package${capName}Resources" }
82-
.configureEach {
83-
dependsOn(generateTask)
84-
}
85-
}
86-
}
69+
//project.plugins.withId("com.android.kotlin.multiplatform.library") {
70+
// val androidComponents = project.extensions.getByType(
71+
// com.android.build.api.variant.AndroidComponentsExtension::class.java
72+
// )
73+
//
74+
// androidComponents.onVariants { variant ->
75+
// val capName = variant.name.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
76+
//
77+
// // задача генерации создаётся библиотекой/плагином
78+
// val generateTask = project.tasks.named("generateMRandroidMain")
79+
//
80+
// // связываем упаковку ресурсов конкретного варианта с генерацией
81+
// project.tasks.matching { it.name == "package${capName}Resources" }
82+
// .configureEach {
83+
// dependsOn(generateTask)
84+
// }
85+
// }
86+
//}

resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package dev.icerock.gradle
66

77
import com.android.build.api.dsl.AndroidSourceSet
88
import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget
9+
import dev.icerock.gradle.generator.platform.android.configureMultiplatformAndroidResources
910
import dev.icerock.gradle.extra.getOrRegisterGenerateResourcesTask
1011
import dev.icerock.gradle.generator.platform.android.getAndroidSourceSetOrNull
1112
import dev.icerock.gradle.generator.platform.android.setupAndroidTasks
@@ -35,7 +36,6 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
3536
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
3637
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
3738
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
38-
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
3939
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
4040
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
4141
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
@@ -57,6 +57,7 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
5757
kmpExtension = kmpExtension
5858
)
5959

60+
configureMultiplatformAndroidResources(project = project)
6061
setupFatFrameworkTasks(project = project)
6162
registerGenerateAllResources(project = project)
6263
registerCopyFrameworkResourcesToAppTask(project = project)
@@ -208,8 +209,10 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
208209
}
209210
}
210211

211-
fun KotlinTarget.getPlatformType(): String = if (this is KotlinMultiplatformAndroidLibraryTarget){
212-
KotlinPlatformType.androidJvm.name
213-
} else {
214-
platformType.name
215-
}
212+
fun KotlinTarget.getPlatformType(): String {
213+
return if (this is KotlinMultiplatformAndroidLibraryTarget){
214+
KotlinPlatformType.androidJvm.name
215+
} else {
216+
platformType.name
217+
}
218+
}

resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPluginExtension.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package dev.icerock.gradle
66

77
import dev.icerock.gradle.generator.platform.apple.registerCopyXCFrameworkResourcesToAppTask
8+
import dev.icerock.gradle.utils.capitalize
89
import org.gradle.api.NamedDomainObjectContainer
910
import org.gradle.api.Project
1011
import org.gradle.api.file.SourceDirectorySet
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.gradle.generator.platform.android
6+
7+
internal enum class AndroidLibraryType(val plugins: List<String>) {
8+
Library(
9+
plugins = listOf(
10+
"com.android.application",
11+
"com.android.library"
12+
)
13+
),
14+
KmpLibrary(
15+
plugins = listOf(
16+
"com.android.kotlin.multiplatform.library"
17+
)
18+
)
19+
}
20+
21+
internal fun androidLibraryPlugins(): List<String> {
22+
return AndroidLibraryType.entries.flatMap { it.plugins }
23+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.gradle.generator.platform.android
6+
7+
import com.android.build.api.variant.AndroidComponentsExtension
8+
import org.gradle.api.Project
9+
10+
internal fun configureMultiplatformAndroidResources(project: Project) {
11+
project.plugins.withId("com.android.kotlin.multiplatform.library") {
12+
val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java)
13+
14+
androidComponents.onVariants { variant ->
15+
val capName = variant.name.replaceFirstChar { it.titlecase() }
16+
17+
val generateTask = project.tasks.findByName("generateMRandroidMain")
18+
19+
generateTask?.let { task ->
20+
project.tasks.configureEach { projectTask ->
21+
if (projectTask.name == "package${capName}Resources") {
22+
projectTask.dependsOn(task)
23+
}
24+
}
25+
}
26+
}
27+
}
28+
}

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/android/SetupAndroidUtils.kt

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,13 @@ import org.gradle.api.tasks.TaskProvider
2222
import org.gradle.kotlin.dsl.extra
2323
import org.gradle.kotlin.dsl.findByType
2424
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
25-
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
26-
import org.jetbrains.kotlin.gradle.plugin.AndroidGradlePluginVersion
2725
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
28-
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
2926
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
3027
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
3128
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
3229
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
3330
import org.jetbrains.kotlin.gradle.plugin.sources.android.androidSourceSetInfoOrNull
3431
import org.jetbrains.kotlin.gradle.plugin.sources.android.findAndroidSourceSet
35-
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
3632

3733
private const val VARIANTS_EXTRA_NAME = "dev.icerock.moko.resources.android-variants"
3834

@@ -52,7 +48,6 @@ internal fun setupAndroidTasks(
5248
?: throw GradleException("can't find android source set for $sourceSet")
5349

5450
// save android sourceSet name to skip build type specific tasks
55-
@Suppress("UnstableApiUsage")
5651
genTaskProvider.configure { it.androidSourceSetName.set(androidSourceSet.name) }
5752

5853
// connect generateMR task with android tasks
@@ -95,7 +90,7 @@ internal fun setupAndroidTasks(
9590
// variant.sources - это объект типа Sources, который нам и нужен.
9691
val androidSources = variant.sources
9792
androidSources.addGenerationTaskDependency(genTaskProvider)
98-
project.logger.warn("nestedComponents size: ${ variant.nestedComponents.size}")
93+
project.logger.warn("nestedComponents size: ${variant.nestedComponents.size}")
9994
variant.sources.addGenerationTaskDependency(genTaskProvider)
10095
try {
10196
// Используем имя варианта, оно совпадает с именем sourceSet
@@ -113,7 +108,6 @@ internal fun setupAndroidTasks(
113108
}
114109

115110
internal fun Sources.addGenerationTaskDependency(provider: TaskProvider<GenerateMultiplatformResourcesTask>) {
116-
@Suppress("UnstableApiUsage")
117111
kotlin?.addGeneratedSourceDirectory(
118112
taskProvider = provider,
119113
wiredWith = GenerateMultiplatformResourcesTask::outputSourcesDir
@@ -135,12 +129,8 @@ internal fun Sources.addGenerationTaskDependency(provider: TaskProvider<Generate
135129
}
136130

137131
internal fun setupAndroidVariantsSync(project: Project) {
138-
listOf(
139-
"com.android.application",
140-
"com.android.library",
141-
"com.android.kotlin.multiplatform.library"
142-
).forEach {
143-
project.plugins.withId(it) {
132+
androidLibraryPlugins().forEach { pluginId ->
133+
project.plugins.withId(pluginId) {
144134
val androidVariants: NamedDomainObjectContainer<Variant> =
145135
project.objects.domainObjectContainer(Variant::class.java)
146136

0 commit comments

Comments
 (0)