Kotlin Multiplatform:在 'androidMain' 中使用 Android 特定库
Kotlin Multiplatform: use Android specific libs inside 'androidMain'
我遵循了 Targeting iOS and Android with Kotlin Multiplatform 教程并且能够为 ios 和 android 设置工作项目。
作为下一步,我想在 src/androidMain/
中使用 android 个特定的库。示例:
package com.test.android
import android.os.Build
actual fun getBuildInfo(): String {
return Build.MODEL
}
但是对于我收到的导入:Unresolved reverence: os
问题:需要哪些额外步骤才能使用 androidMain
中的 android 特定库?
那个:build.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework {
baseName = "multi_module_be_connection"
}
}
}
jvm("android")
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val packForXcode by tasks.creating(Sync::class) {
val targetDir = File(buildDir, "xcode-frameworks")
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets
.getByName<KotlinNativeTarget>("ios")
.binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText("#!/bin/bash\n"
+ "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
+ "cd '${rootProject.rootDir}'\n"
+ "./gradlew $@\n")
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)
为了在 MPP 模块中使用 android 特定的 API,您可以包含 android lib 插件:
那个:build.gradle.kts
plugins {
id("com.android.library")
kotlin("multiplatform")
}
这样做时必须包含一个 AndroidManifest.xml
,这可以放在您的 src/androidMain/
中,并通过将其包含在您的 android 构建脚本中使用:
那个:build.gradle.kts
android {
sourceSets {
getByName("main") {
manifest.srcFile ("src/androidMain/AndroidManifest.xml")
}
}
}
那个:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.path.to.package.common"/>
NOTE:
更改包路径。
我遵循了 Targeting iOS and Android with Kotlin Multiplatform 教程并且能够为 ios 和 android 设置工作项目。
作为下一步,我想在 src/androidMain/
中使用 android 个特定的库。示例:
package com.test.android
import android.os.Build
actual fun getBuildInfo(): String {
return Build.MODEL
}
但是对于我收到的导入:Unresolved reverence: os
问题:需要哪些额外步骤才能使用 androidMain
中的 android 特定库?
那个:build.gradle.kts
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
}
kotlin {
//select iOS target platform depending on the Xcode environment variables
val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
::iosArm64
else
::iosX64
iOSTarget("ios") {
binaries {
framework {
baseName = "multi_module_be_connection"
}
}
}
jvm("android")
sourceSets["commonMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
}
sourceSets["androidMain"].dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val packForXcode by tasks.creating(Sync::class) {
val targetDir = File(buildDir, "xcode-frameworks")
/// selecting the right configuration for the iOS
/// framework depending on the environment
/// variables set by Xcode build
val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
val framework = kotlin.targets
.getByName<KotlinNativeTarget>("ios")
.binaries.getFramework(mode)
inputs.property("mode", mode)
dependsOn(framework.linkTask)
from({ framework.outputDirectory })
into(targetDir)
/// generate a helpful ./gradlew wrapper with embedded Java path
doLast {
val gradlew = File(targetDir, "gradlew")
gradlew.writeText("#!/bin/bash\n"
+ "export 'JAVA_HOME=${System.getProperty("java.home")}'\n"
+ "cd '${rootProject.rootDir}'\n"
+ "./gradlew $@\n")
gradlew.setExecutable(true)
}
}
tasks.getByName("build").dependsOn(packForXcode)
为了在 MPP 模块中使用 android 特定的 API,您可以包含 android lib 插件:
那个:build.gradle.kts
plugins {
id("com.android.library")
kotlin("multiplatform")
}
这样做时必须包含一个 AndroidManifest.xml
,这可以放在您的 src/androidMain/
中,并通过将其包含在您的 android 构建脚本中使用:
那个:build.gradle.kts
android {
sourceSets {
getByName("main") {
manifest.srcFile ("src/androidMain/AndroidManifest.xml")
}
}
}
那个:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.path.to.package.common"/>
NOTE:
更改包路径。