android - 如何在多平台 Android 模块中配置 Kotlin jvmTarget?

标签 android gradle jvm kotlin-multiplatform okio

我收到此构建错误:

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option Adding support for Java 8 language features could solve this issue.


尝试在 Android Studio 中为多平台模块编译此构建脚本:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

repositories {
    mavenCentral()
}

kotlin {
    android()
    ios {
        binaries {
            framework {
                baseName = "bandit"
            }
        }
    }
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.1.1")
                implementation("com.squareup.okio:okio-multiplatform:3.0.0-alpha.3")
                implementation("com.squareup.okio:okio-fakefilesystem-multiplatform:3.0.0-alpha.3")
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val androidMain by getting
        val androidTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
                implementation("junit:junit:4.13.2")
            }
        }
        val iosMain by getting
        val iosTest by getting

        all {
            languageSettings.apply {
                enableLanguageFeature("InlineClasses")
                useExperimentalAnnotation("kotlin.time.ExperimentalTime")
                useExperimentalAnnotation("okio.ExperimentalFileSystem")
            }
        }
    }
}

android {
    compileSdkVersion(30)
    defaultConfig {
        minSdkVersion(23)
        targetSdkVersion(30)
    }
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework =
        kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)
这是一个非常普通的多平台构建脚本,主要由 Jetbrain 的 Mobile 插件自动生成。我无法通过将其插入到 Android block 的底部来以通常的方式解决此问题:
    kotlinOptions {
        jvmTarget = "1.8"
    }
kotlinOptions 在这里是一个 Unresolved reference 。考虑到这个错误的普遍性,我很惊讶互联网上几乎没有解决它。有一些相同或相似的 jvmTarget 错误的帖子,但它们都是从与此不同的构建上下文发布的。唯一出现完全相同错误的例子是:
kotlinOptions in kotlin multiplatform project
奇怪的是,据说最初的发帖人仅仅通过修改他的 androidx 导入就设法解决了这个问题。可能值得注意的是,我的所有六个“不能内联字节码”都与对新的多平台 Okio 库的方法调用相关联。但这肯定更有可能是我自己的设置有错误,而不是 jack 沃顿帮所做的事情。

最佳答案

根据文档:
https://kotlinlang.org/docs/mpp-dsl-reference.html#compilation-parameters
不要被 Gradle 文档的代码示例所迷惑,以为很多这种编译语法只适用于 Java block 。这是为 Android 构建指定 jvm 版本目标的方式:

kotlin {
    android {
        compilations.all {
            kotlinOptions.jvmTarget = "1.8"
        }
    }
    ios {
        ...

关于android - 如何在多平台 Android 模块中配置 Kotlin jvmTarget?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67009242/

相关文章:

android - Linux : Udp packet is kept in buffer or dropped when network is unreachable? 我怎么证明呢?

java - 转换输出文件不存在

java - gradle 4.10 + java11 = spring(和许多其他库)的依赖版本检测问题

java - Java中的整数缓存

android根模拟器?在 SD 卡上运行应用程序

android - 如何将音频/视频文件存储到 android 中的 SQLite 数据库?

java - NullPointerException 而不是 null(JVM 错误?)

java - 为什么一个 40 亿次迭代的 Java 循环只需要 2 毫秒?

java - 谷歌地图不返回经度和纬度

groovy - 在Gradle 0.8构建中捕获标准输出