Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
42a71a4
not working
Lobynya Sep 29, 2025
d008885
Merge remote-tracking branch 'refs/remotes/origin/develop' into g
Lobynya Oct 10, 2025
aab9cff
MOKO-1958 add KotlinMultiplatformAndroidLibraryTarget
Lobynya Oct 15, 2025
24778a2
Merge pull request #855 from icerockdev/develop
Alex009 Nov 19, 2025
e0fdf49
Merge remote-tracking branch 'lob/task/MOKO-1958-new-android-library'…
ExNDY Dec 4, 2025
5fcc7b3
#843 added gradle and agp 9+ sample
ExNDY Dec 4, 2025
82fb9b6
#843 android tasks configuration moved to apply plugin, android plugi…
ExNDY Dec 4, 2025
4189b99
#843 platform type utils moved to file, fix AndroidLibraryType
ExNDY Dec 4, 2025
5b9d80f
#843 refactored setup android tasks, added check on agp version, corr…
ExNDY Dec 5, 2025
7a4f61a
#843 updated getAndroidRClassPackage
ExNDY Dec 5, 2025
0ac795f
#843 added enable android resources on apply plugin
ExNDY Dec 6, 2025
64fc5d2
#843 fix sample package name
ExNDY Dec 6, 2025
fbc3306
#843 added ExperimentalWasmDsl annotation, replaced deprecated varia…
ExNDY Dec 6, 2025
27742ec
#843 update sample package name
ExNDY Dec 6, 2025
82399e4
#843 removed link with generated tasks
ExNDY Dec 8, 2025
c3d4f04
#843 hack of androidSourceSet implemented only for legacy plugin
ExNDY Dec 8, 2025
b1e0378
#843 update generated source directory for new plugin, added kdoc
ExNDY Dec 8, 2025
4ff2349
#843 reformat
ExNDY Dec 8, 2025
243a3b9
#843 rollback android-mpp sample
ExNDY Dec 8, 2025
8c8c6a7
#843 fix enable resources, plugin version in sample
ExNDY Dec 8, 2025
862cd69
#843 fix project field
ExNDY Dec 9, 2025
adebb91
#843 setup sourceSets replaced on check target type
ExNDY Dec 10, 2025
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ org.gradle.caching=true
kotlin.code.style=official

kotlin.mpp.stability.nowarn=true
kotlin.mpp.androidGradlePluginCompatibility.nowarn=true
kotlin.mpp.androidSourceSetLayoutVersion=2
kotlin.mpp.applyDefaultHierarchyTemplate=false
kotlin.mpp.enableCInteropCommonization=true
Expand Down
7 changes: 5 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[versions]
kotlinVersion = "1.9.25"
androidGradleVersion = "8.1.4"
kotlinVersion = "2.2.10"
androidGradleVersion = "8.12.0"
androidSdkCommonVersion = "31.1.2"

# kotlinx
Expand Down Expand Up @@ -63,3 +63,6 @@ detektGradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugi
mokoMultiplatformPlugin = { module = "dev.icerock:mobile-multiplatform", version.ref = "mokoMultiplatformPluginVersion" }
composeJetBrainsPlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "composeJetbrainsVersion" }
nexusPublishing = { module = "io.github.gradle-nexus:publish-plugin", version = "2.0.0" }

[plugins]
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlinVersion" }
2 changes: 1 addition & 1 deletion gradle/moko.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
resourcesVersion = "0.25.2"
resourcesVersion = "0.26.0"

[libraries]
resources = { module = "dev.icerock.moko:resources", version.ref = "resourcesVersion" }
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#Tue Jul 25 10:40:31 NOVT 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
1 change: 1 addition & 0 deletions local-samples-check.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ set -e
(cd samples/kotlin-2-dynamic-sample && ./local-check.sh)
(cd samples/kotlin-2-tests && ./local-check.sh)
(cd samples/cm-resources-sample && ./local-check.sh)
(cd samples/gradle-agp-9-sample && ./local-check.sh)
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ plugins {

kotlin {
androidTarget {
publishAllLibraryVariants()
publishLibraryVariants()
publishLibraryVariantsGroupedByFlavor = true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@
* Copyright 2024 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

@file:OptIn(ExperimentalWasmDsl::class)

import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl

plugins {
id("com.android.library")
Expand Down
6 changes: 6 additions & 0 deletions resources-compose/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
@file:OptIn(ExperimentalWasmDsl::class)

import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl

/*
* Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/
Expand All @@ -13,6 +17,7 @@ plugins {
id("org.jetbrains.compose")
id("javadoc-stub-convention")
id("publication-convention")
alias(libs.plugins.composeCompiler)
}

android {
Expand All @@ -34,6 +39,7 @@ kotlin {
js(IR) {
browser()
}

wasmJs {
browser()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
package dev.icerock.gradle

import com.android.build.api.dsl.AndroidSourceSet
import com.android.build.api.dsl.KotlinMultiplatformAndroidCompilation
import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget
import com.android.build.api.extension.impl.CurrentAndroidGradlePluginVersion
import dev.icerock.gradle.extra.getOrRegisterGenerateResourcesTask
import dev.icerock.gradle.generator.platform.android.AGP_8_11_0
import dev.icerock.gradle.generator.platform.android.AndroidLibraryType
import dev.icerock.gradle.generator.platform.android.getAndroidSourceSetOrNull
import dev.icerock.gradle.generator.platform.android.setupAndroidTasks
import dev.icerock.gradle.generator.platform.android.setupAndroidVariantsSync
Expand All @@ -17,6 +22,8 @@ import dev.icerock.gradle.generator.platform.apple.setupFrameworkResources
import dev.icerock.gradle.generator.platform.js.setupJsKLibResources
import dev.icerock.gradle.generator.platform.js.setupJsResourcesWithLinkTask
import dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask
import dev.icerock.gradle.utils.enableAndroidResources
import dev.icerock.gradle.utils.hasMinimalVersion
import dev.icerock.gradle.utils.kotlinSourceSetsObservable
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand All @@ -29,11 +36,13 @@ import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
Expand Down Expand Up @@ -61,6 +70,18 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
setupAndroidVariantsSync(project = project)
setupGradleSync(project = project)
}

// Enable android resources for "com.android.kotlin.multiplatform.library" plugin
project.plugins.withId(AndroidLibraryType.KmpLibrary.pluginId) {
val hasEnableAndroidResourcesFlag = hasMinimalVersion(
minVersion = AGP_8_11_0,
currentVersion = CurrentAndroidGradlePluginVersion.CURRENT_AGP_VERSION.version
)

if (hasEnableAndroidResourcesFlag) {
project.enableAndroidResources()
}
}
}

private fun setupGradleSync(project: Project) {
Expand Down Expand Up @@ -90,6 +111,30 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
setupJsResourcesWithLinkTask(target = target, project = project)
}

if (target is KotlinMultiplatformAndroidLibraryTarget) {
target.compilations
.withType(KotlinMultiplatformAndroidCompilation::class)
.configureEach { compilation ->
compilation.kotlinSourceSetsObservable.forAll { sourceSet ->
println("DBG: sourceSets kmpat $sourceSet")
val genTaskProvider: TaskProvider<GenerateMultiplatformResourcesTask> =
sourceSet.getOrRegisterGenerateResourcesTask(mrExtension)
println("DBG: compilations KotlinMultiplatformAndroidCompilation: ${target.platformType.name}")
genTaskProvider.configure {
it.platformType.set(target.platformType.name)
}

setupAndroidTasks(
target = target,
sourceSet = sourceSet,
genTaskProvider = genTaskProvider,
compilation = compilation
)
}
}

}

target.compilations.configureEach { compilation ->
compilation.kotlinSourceSetsObservable.forAll { sourceSet: KotlinSourceSet ->
val genTaskProvider: TaskProvider<GenerateMultiplatformResourcesTask> =
Expand Down Expand Up @@ -172,20 +217,21 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
}
}

@OptIn(ExperimentalKotlinGradlePluginApi::class)
private fun setupSourceSets(
target: KotlinTarget,
sourceSet: KotlinSourceSet,
genTaskProvider: TaskProvider<GenerateMultiplatformResourcesTask>,
) {
sourceSet.kotlin.srcDir(genTaskProvider.map { it.outputSourcesDir })

when (target.platformType) {
KotlinPlatformType.jvm, KotlinPlatformType.js -> {
when (target) {
is KotlinJsIrTarget, is KotlinJvmTarget -> {
sourceSet.resources.srcDir(genTaskProvider.map { it.outputResourcesDir })
sourceSet.resources.srcDir(genTaskProvider.map { it.outputAssetsDir })
}

KotlinPlatformType.androidJvm -> {
is KotlinAndroidTarget -> {
// Fix: android sourceSets indexation in IDE
// Usage of api of v2.model in AGP broken for IDE resources indexing
// For correct indexing of resources set resource directory
Expand All @@ -196,12 +242,11 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
androidSourceSet.res.srcDir(genTaskProvider.map { it.outputResourcesDir })

// Assets added in variants for correct generation
// see: dev.icerock.gradle.generator.platform.android.SetupAndroidUtilsKt.addGenerationTaskDependency
// see: dev.icerock.gradle.generator.platform.android
// .SetupAndroidUtilsKt.addGenerationTaskDependency
// androidSourceSet.assets.srcDir(genTaskProvider.map { it.outputAssetsDir })
}

KotlinPlatformType.common, KotlinPlatformType.native,
KotlinPlatformType.wasm -> Unit
else -> Unit
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package dev.icerock.gradle

import dev.icerock.gradle.generator.platform.apple.registerCopyXCFrameworkResourcesToAppTask
import dev.icerock.gradle.utils.capitalize
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.file.SourceDirectorySet
Expand All @@ -21,7 +22,7 @@ abstract class MultiplatformResourcesPluginExtension {
abstract val resourcesSourceSets: NamedDomainObjectContainer<SourceDirectorySet>

fun Project.configureCopyXCFrameworkResources(xcFrameworkName: String = name) {
NativeBuildType.values()
NativeBuildType.entries
.map { it.name.lowercase().capitalize() }
.plus("")
.map { xcFrameworkName.capitalize() + it + "XCFramework" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,20 @@ private fun registerGenerateTask(
task as GenerateMultiplatformResourcesTask

val platform: String = task.platformType.get()
println("DBG: platform $platform")

if (platform != KotlinPlatformType.androidJvm.name) return@onlyIf true

val flavor: String = task.androidSourceSetName.get()
flavor in listOf("main", "test", "androidTest")
println("DBG: flavor $flavor")

flavor in listOf(
"androidMain",
"androidTest",
"androidInstrumentedTest",
"main",
"test"
)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.generator.platform.android

internal const val AGP_8_10_0 = "8.10.0"
internal const val AGP_8_11_0 = "8.11.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.generator.platform.android

internal enum class AndroidLibraryType(val pluginId: String) {
Application(pluginId = "com.android.application"),
Library(pluginId = "com.android.library"),
KmpLibrary(pluginId = "com.android.kotlin.multiplatform.library")
}

internal fun androidPlugins(): List<String> {
return AndroidLibraryType.entries.map { it.pluginId }
}
Loading
Loading