Kotlin /将android日志导入到android共享代码模块中的本地问题

时间:2019-12-11 10:33:04

标签: android kotlin kotlin-multiplatform kotlin-native

我正在尝试在共享代码中使用Android日志,因此想利用“预期/实际”功能来使android端使用日志在日志目录中读取。但是我无法获取android模块(不是应用模块)来导入android.util.Log。

我看到了this的答案,但是对我来说不起作用。我无法解决导入问题。

我认为我需要实现特定的依赖关系才能访问导入,但是我不确定那是什么。

这是我的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 = "SharedCode"
            }
        }
    }



jvm("android")

sourceSets["commonMain"].dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib-common")
    implementation("io.ktor:ktor-client:1.0.0-beta-3")

    implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.2")
 //   implementation ("org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:0.14.0")
}

sourceSets["androidMain"].dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib") //Allows _androidMain to have java imports
    implementation("io.ktor:ktor-client-android:1.0.0-beta-3")
    api("org.jetbrains.kotlin:kotlin-stdlib:1.3.61")
    api("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61")
    implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61")
    }
}

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)

3 个答案:

答案 0 :(得分:1)

在这里,您获得了名称为“ android”的JVM目标,而不是实际的Android目标。链接的问题中发生了相同的问题。您能说出答案中使用脚本时的情况吗?似乎应该可以正常工作。
documentation中所述,必须使用特定于Android的Gradle插件才能使Android目标可用。如果您想了解如何完成此操作,请考虑看看this sample

答案 1 :(得分:1)

我有同样的问题。尝试使用android()而非仅使用jvm("android")

我还使用android.sourceSets.foreach{ _ -> dependencies{ ... } }

将依赖项添加到了android

答案 2 :(得分:1)

仅解决了同一问题,最后使用了本教程https://medium.com/icerock/how-to-start-use-kotlin-multiplatform-for-mobile-development-1d3022742178 所以我的build.gradle如下:

apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.multiplatform'

android {
    compileSdkVersion 29
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 29
    }
}

kotlin {
    targets {
        android()
        iosArm64()
        iosX64()
    }

sourceSets {
    commonMain {
        dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
        }
    }
    androidMain {
        dependencies {
            implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        }
    }
}
}