set up android platform as default for kmp publications

commit_hash:35b785757b0000d02307fe650b4f62d8c347a43c
This commit is contained in:
gulevsky
2026-03-11 18:17:16 +03:00
parent 42d2e23b02
commit 092fea3396
9 changed files with 221 additions and 1 deletions
+5
View File
@@ -589,6 +589,11 @@
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/FileExtensions.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/FileExtensions.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/PublicationType.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/PublicationType.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/Version.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/Version.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/XmlUtils.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/XmlUtils.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/aar/UnpackedStubAarTask.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/aar/UnpackedStubAarTask.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/aar/ZipStubAarTask.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/aar/ZipStubAarTask.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/multiplatform/Platforms.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/multiplatform/Platforms.kt",
"client/android/buildSrc/src/main/java/com/yandex/div/gradle/multiplatform/PomUtils.kt":"divkit/public/client/android/buildSrc/src/main/java/com/yandex/div/gradle/multiplatform/PomUtils.kt",
"client/android/coil/build.gradle":"divkit/public/client/android/coil/build.gradle",
"client/android/coil/proguard-rules.pro":"divkit/public/client/android/coil/proguard-rules.pro",
"client/android/coil/src/main/java/com/yandex/div/coil/CoilDivImageLoader.kt":"divkit/public/client/android/coil/src/main/java/com/yandex/div/coil/CoilDivImageLoader.kt",
+41
View File
@@ -1,10 +1,15 @@
import com.codingfeline.buildkonfig.compiler.FieldSpec.Type.BOOLEAN
import com.yandex.div.gradle.aar.UnpackedStubAarTask
import com.yandex.div.gradle.aar.ZipStubAarTask
import com.yandex.div.gradle.multiplatform.PlatformIdentifier
import com.yandex.div.gradle.multiplatform.configureDefaultKmpDependencies
import java.lang.Boolean.parseBoolean
plugins {
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.buildkonfig)
alias(libs.plugins.kotlin.multiplatform)
id("maven-publish")
}
apply(from = "../kmp-library.gradle")
@@ -23,3 +28,39 @@ buildkonfig {
buildConfigField(BOOLEAN, "DISABLE_ASSERTS", "${providers.gradleProperty("disableAssertsInBuild").map(::parseBoolean).get()}")
}
}
afterEvaluate {
publishing {
publications {
withType<MavenPublication>().configureEach {
if (name == "kotlinMultiplatform") {
val buildDir = project.layout.buildDirectory
val minSdk = rootProject.ext["minSdkVersion"] as Int
val groupNamespace = project.group.toString().replace(':', '.')
val moduleNamespace = project.name.replace('-', '.')
val stubNamespace = "$groupNamespace.$moduleNamespace.anchor"
val unpackedStubAarTask = tasks.register<UnpackedStubAarTask>("unpackedStubAar") {
aarPackage.set(stubNamespace)
minSdkVersion.set(minSdk)
outputDir.set(buildDir.dir("intermediates/stub-aar"))
}
val stubAarTask = tasks.register<ZipStubAarTask>("stubAar") {
from(unpackedStubAarTask.flatMap { it.outputDir })
destinationDirectory.set(buildDir.dir("outputs"))
archiveExtension.set("aar")
}
artifact(stubAarTask)
pom {
packaging = "aar"
withXml {
configureDefaultKmpDependencies(this@withXml, PlatformIdentifier.ANDROID)
}
}
}
}
}
}
}
@@ -0,0 +1,44 @@
package com.yandex.div.gradle
import org.w3c.dom.Element
import org.w3c.dom.Node
internal fun Node.appendElement(
tagName: String,
textValue: String? = null,
): Element {
val element = ownerDocument.createElement(tagName)
appendChild(element)
if (textValue != null) {
val textNode = ownerDocument.createTextNode(textValue)
element.appendChild(textNode)
}
return element
}
internal fun Node.find(predicate: (Node) -> Boolean): Node? {
children().forEach { node ->
if (predicate(node)) {
return node
}
}
return null
}
internal fun Node.children(): Iterable<Node> = object : Iterable<Node> {
override fun iterator() = childrenIterator()
}
private fun Node.childrenIterator(): Iterator<Node> = object : Iterator<Node> {
private var current = firstChild
override fun hasNext() = current != null
override fun next(): Node {
val next = current
current = current!!.nextSibling
return next
}
}
@@ -0,0 +1,38 @@
package com.yandex.div.gradle.aar
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
import org.intellij.lang.annotations.Language
import java.io.File
@DisableCachingByDefault
abstract class UnpackedStubAarTask : DefaultTask() {
@get:Input abstract val aarPackage: Property<String>
@get:Input abstract val minSdkVersion: Property<Int>
@get:OutputDirectory abstract val outputDir: DirectoryProperty
@TaskAction
fun generate() {
val outputDir = outputDir.asFile.get()
outputDir.deleteRecursively()
outputDir.mkdirs()
val manifestFile = File("$outputDir/AndroidManifest.xml")
val aarPackage = aarPackage.get()
@Language("xml")
val manifestText = """
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="$aarPackage">
<uses-sdk android:minSdkVersion="${minSdkVersion.get()}"/>
</manifest>""".trimIndent()
manifestFile.writeText(manifestText)
}
}
@@ -0,0 +1,7 @@
package com.yandex.div.gradle.aar
import org.gradle.api.tasks.bundling.Zip
import org.gradle.work.DisableCachingByDefault
@DisableCachingByDefault
abstract class ZipStubAarTask : Zip()
@@ -0,0 +1,17 @@
package com.yandex.div.gradle.multiplatform
enum class PlatformGroup {
JVM,
IOS;
}
enum class PlatformIdentifier(
val id: String,
val group: PlatformGroup
) {
JVM("jvm", PlatformGroup.JVM),
ANDROID("android", PlatformGroup.JVM),
IOS_ARM_64("iosarm64", PlatformGroup.IOS),
IOS_X_64("iosx64", PlatformGroup.IOS),
IOS_SIMULATOR_ARM_64("iossimulatorarm64", PlatformGroup.IOS);
}
@@ -0,0 +1,27 @@
package com.yandex.div.gradle.multiplatform
import com.yandex.div.gradle.appendElement
import com.yandex.div.gradle.find
import org.gradle.api.XmlProvider
fun configureDefaultKmpDependencies(xml: XmlProvider, platformId: PlatformIdentifier) {
val xmlElement = xml.asElement()
val groupId = xmlElement.find { it.nodeName == "groupId" }?.textContent
?: throw IllegalArgumentException("Failed to locate groupId node")
val artifactId = xmlElement.find { it.nodeName == "artifactId" }?.textContent
?: throw IllegalArgumentException("Failed to locate artifactId node")
val version = xmlElement.find { it.nodeName == "version" }?.textContent
?: throw IllegalArgumentException("Failed to locate version node")
val dependencies = xmlElement.find { it.nodeName == "dependencies" }
?: xmlElement.appendElement("dependencies")
dependencies.appendElement("dependency").apply {
appendElement("groupId", groupId)
appendElement("artifactId", "$artifactId-${platformId.id}")
appendElement("version", version)
if (platformId == PlatformIdentifier.ANDROID) {
appendElement("type", "aar")
}
appendElement("scope", "compile")
}
}
+41
View File
@@ -1,10 +1,15 @@
import com.codingfeline.buildkonfig.compiler.FieldSpec.Type.BOOLEAN
import com.yandex.div.gradle.aar.UnpackedStubAarTask
import com.yandex.div.gradle.aar.ZipStubAarTask
import com.yandex.div.gradle.multiplatform.PlatformIdentifier
import com.yandex.div.gradle.multiplatform.configureDefaultKmpDependencies
import java.lang.Boolean.parseBoolean
plugins {
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.buildkonfig)
alias(libs.plugins.kotlin.multiplatform)
id("maven-publish")
}
apply(from = "../kmp-library.gradle")
@@ -23,3 +28,39 @@ buildkonfig {
buildConfigField(BOOLEAN, "DISABLE_LOGS", "${providers.gradleProperty("disableLogsInBuild").map(::parseBoolean).get()}")
}
}
afterEvaluate {
publishing {
publications {
withType<MavenPublication>().configureEach {
if (name == "kotlinMultiplatform") {
val buildDir = project.layout.buildDirectory
val minSdk = rootProject.ext["minSdkVersion"] as Int
val groupNamespace = project.group.toString().replace(':', '.')
val moduleNamespace = project.name.replace('-', '.')
val stubNamespace = "$groupNamespace.$moduleNamespace.anchor"
val unpackedStubAarTask = tasks.register<UnpackedStubAarTask>("unpackedStubAar") {
aarPackage.set(stubNamespace)
minSdkVersion.set(minSdk)
outputDir.set(buildDir.dir("intermediates/stub-aar"))
}
val stubAarTask = tasks.register<ZipStubAarTask>("stubAar") {
from(unpackedStubAarTask.flatMap { it.outputDir })
destinationDirectory.set(buildDir.dir("outputs"))
archiveExtension.set("aar")
}
artifact(stubAarTask)
pom {
packaging = "aar"
withXml {
configureDefaultKmpDependencies(this@withXml, PlatformIdentifier.ANDROID)
}
}
}
}
}
}
}
+1 -1
View File
@@ -40,7 +40,7 @@ afterEvaluate {
publishing {
publications {
release(MavenPublication) {
withType(MavenPublication).configureEach {
pom {
name = "DivKit"
description = "DivKit is an open source Server-Driven UI (SDUI) framework. SDUI is a an emerging technique that leverage the server to build the user interfaces of their mobile app."