今天我刚刚将我的 Android Studio 更新为
Android Studio 3.5.2
Build #AI-191.8026.42.35.5977832, built on October 31, 2019
JRE: 1.8.0_202-release-1483-b49-5587405 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.15.1
Run Code Online (Sandbox Code Playgroud)
我更新了Android Studio,因为当kotlin版本低于1.3.60时它会提示我错误。
但是我遇到了单元测试文件的问题。以前我可以毫无问题地运行单元测试。现在,当我单击函数名称(左侧)之外的运行按钮时,它会显示“Nothing Here”。
下面是我所有的依赖
// build.gradle
buildscript {
ext.kotlin_version = '1.3.60'
repositories {
google()
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}
dependencies {
// classpath 'com.android.tools.build:gradle:3.4.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'kotlin-multiplatform'
apply plugin: …Run Code Online (Sandbox Code Playgroud) 如何在 iOS 项目上添加两个或多个 kotlin 原生模块而不出现duplicate symbols错误?
让我们假设一个多模块 KMP 项目如下,其中存在一个适用于 Android 的本机应用程序和一个适用于 iOS 的本机应用程序以及两个用于保存共享 kotlin 代码的通用模块。
\n\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 android\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 common\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 moduleA\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 moduleB\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ios\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app\nRun Code Online (Sandbox Code Playgroud)\n\n模块 A 包含数据类 HelloWorld 并且没有模块依赖项:
\n\npackage hello.world.modulea\n\ndata class HelloWorld(\n val message: String\n)\nRun Code Online (Sandbox Code Playgroud)\n\n模块 B 包含 HelloWorld 类的扩展函数,因此它依赖于模块 A:
\n\npackage hello.world.moduleb\n\nimport hello.world.modulea.HelloWorld\n\nfun HelloWorld.egassem() = message.reversed()\nRun Code Online (Sandbox Code Playgroud)\n\n模块的 build.gradle 配置为:
\n\napply plugin: "org.jetbrains.kotlin.multiplatform"\napply plugin: "org.jetbrains.kotlin.native.cocoapods"\n\n\xe2\x80\xa6\n\nkotlin {\n targets {\n …Run Code Online (Sandbox Code Playgroud) 我正在 Android Studio 上的 Kotlin 中开发多平台应用程序,当我尝试在 iOS 模拟器上运行该应用程序时,出现以下错误:
以下构建命令失败:
PhaseScriptExecution [CP-User]\ Build\共享/Users/cjm/AndroidStudioProjects/GlobeMultiplatform/build/ios/Pods.build/Debug-iphonesimulator/shared.build/Script-882AF45D8B8C4938AC461F4FBA0FE197.sh(在项目“Pods”的目标“共享”中) ')
build.gradle设置可可豆荚的代码是这样的:
cocoapods {
summary = "Shared"
homepage = "Link to the Shared Module homepage"
ios.deploymentTarget = "13"
frameworkName = "shared"
podfile = project.file("../iosApp/Podfile")
}
Run Code Online (Sandbox Code Playgroud)
我运行 pod install 并显示成功,但应用程序的构建仍然失败。我该如何修复这个错误?是什么导致了这个错误?我对 Kotlin 尤其是 Kotlin Multiplatform 是全新的,所以如果这是一个愚蠢的问题,我深表歉意。
编辑:这是 Xcode 在运行应用程序时所说的内容:
失败:构建失败并出现异常。
其中:构建文件'/Users/cjm/AndroidStudioProjects/GlobeMultiplatform/androidApp/build.gradle.kts'行:1
出了什么问题:应用插件请求 [id: 'com.android.application'] 时发生异常
无法应用插件“com.android.internal.application”。Android Gradle 插件需要 Java 11 才能运行。您当前使用的是 Java 1.8。您可以尝试以下一些选项: - 更改 IDE 设置。- 更改 JAVA_HOME 环境变量。- 改变
org.gradle.java.home在gradle.properties.
尝试:使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info …
我已经按照https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html的教程进行操作,我想对我在 SharedModule 中创建的 commonTest 进行单元测试。
我尝试过的事情:
我曾尝试在公共文件中使用 kotlin.test。我在网上查到可以使用JUnit5,但是当我在commonTest中导入依赖项时,我无法访问kotlin.test的库。现在我已经成功地在 commonTest 中实现了 kotlin.test 但是我该如何运行它呢?
我试过 gradlew commonTest.kt 但它不起作用。请帮忙谢谢!
我的 SharedModule gradle 代码:
apply plugin: 'kotlin-multiplatform'
kotlin {
targets {
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
? presets.iosArm64 : presets.iosX64
fromPreset(iOSTarget, 'iOS') {
binaries {
framework('SharedCode')
}
}
fromPreset(presets.jvm, 'android')
}
sourceSets {
commonMain.dependencies {
api 'org.jetbrains.kotlin:kotlin-stdlib-common'
api 'org.jetbrains.kotlin:kotlin-stdlib'
//implementation("com.ionspin.kotlin:bignum:0.0.8")
//Testing
//implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
//implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
/*
implementation "io.ktor:ktor-client-core:$ktor_version"
implementation "io.ktor:ktor-client-json:$ktor_version"
implementation "io.ktor:ktor-client-logging:$ktor_version"*/
}
commonTest.dependencies{
//implementation ("org.junit.jupiter:junit-jupiter-api:5.2.0")
//implementation ("org.junit.jupiter:junit-jupiter-engine:5.0.3")
//implementation 'junit:junit:4.12'
implementation …Run Code Online (Sandbox Code Playgroud) 我刚刚将Android Studio更新到最新版本3.5.1,并且知道出现以下错误:
Gradle同步失败:不支持的方法:KotlinPlatformContainer.supports()。您连接到的Gradle版本不支持该方法。要解决该问题,您可以更改/升级您连接到的Gradle的目标版本。或者,您可以忽略此异常并从模型中读取其他信息。
我在两个模块中使用Kotlin Multiplatform,但我不知道它是否相关。
我正在从事Kotlin多平台项目。我使用Ktor客户端进行网络调用。我想根据一些不基于响应头的自定义逻辑缓存一些请求。
HttpCache提供的功能Ktor是响应头驱动的,我无法覆盖它,因为类的数量是Internal.
如何启用Ktor自定义缓存?
我正在尝试使用 Kotlin Multiplatform 功能在 Android 和 JVM 目标之间共享 Java 代码(示例项目:https : //github.com/dmitrykolesnikovich/accessJavaCode-issue)
简单地说,":library1" 和 ":library2" 都是面向 JVM 和 Android 的 Kotlin 多平台库。":library2" 依赖于 ":library1"。他们都使用 Kotlin 和 Java。":library2" 旨在成为 1) Android 应用程序和 2) 桌面 (JavaFX) 应用程序的依赖项。这就是为什么 1) AAR 工件和 2) JAR 工件都需要 (?) - 所以我为“:library1”和“:library2”使用 1) Android 目标和 2) JVM 目标。
问题是,当我在 ":library1" 中有 Java 代码时
public class JavaCode {} // JavaCode.java
Run Code Online (Sandbox Code Playgroud)
“:library2”中的 Kotlin 代码依赖于“:library1”
class AccessJavaCode : JavaCode() // AccessJavaCode.kt
Run Code Online (Sandbox Code Playgroud)
Android 目标可以识别 Java,但 JVM 目标不是:
> Task :library2:compileKotlinJvm …Run Code Online (Sandbox Code Playgroud) 使用 Android Studio 的“转到声明”功能(cmd + 单击)时,会显示反编译的源代码,尽管源代码在我的项目中。kotlin MP 源在另一个模块中。我可以使用“选择源...”选项连接源,但是我必须为每个文件执行此操作。是否有用于连接到正确源文件的全局修复?
尝试将缓存的 json 字符串反序列化为数据对象并收到异常:kotlinx.serialization.json.internal.JsonDecodingException: Expected class kotlinx.serialization.json.JsonObject (Kotlin reflection is not available) as the serialized body of kotlinx.serialization.Polymorphic<List>, but had class kotlinx.serialization.json.JsonArray (Kotlin reflection is not available)
用于反序列化的代码
internal inline fun <reified R : Any> String.convertToDataClass() =
Json {
ignoreUnknownKeys = true
}.decodeFromString(R::class.serializer(), this)
Run Code Online (Sandbox Code Playgroud)
代码示例:
val jsonString ="""
[{"name1":"value1"}, {"name2":"value2"}]
"""
val dataObject = jsonString.convertToDataClass<List<SomeObject>>()
Run Code Online (Sandbox Code Playgroud)
当通过 Ktor 管道时,一切工作正常,但在尝试反序列化缓存为字符串的相同响应主体时会中断。
我知道这R::class.serializer()被标记为内部使用,但这是我知道如何从字符串内容反序列化泛型的唯一方法。
serialization json deserialization kotlin kotlin-multiplatform
我正在创建一个 Jetbrains Compose 多平台项目。但我只需要 Desktop (JVM) 和 Android,所以有两个 JVM 目标。我想分解出需要 grpc 的逻辑,这样 Android 和 Desktop 都可以使用它,而无需我对其进行两次编程。
我似乎无法找到将 grpc/proto 绑定到项目中的方法,以便我可以编写一次逻辑并在 android 和桌面之间共享它。这是我的公共项目的 build.gradle.kts 的样子:
plugins {
id("com.android.library")
kotlin("multiplatform")
id("org.jetbrains.compose")
}
kotlin {
android()
jvm("desktop")
sourceSets {
named("commonMain") {
dependencies {
api(compose.runtime)
api(compose.foundation)
api(compose.material)
api(compose.ui)
implementation(compose.preview)
implementation(compose.uiTooling)
}
}
}
}
android {
compileSdk = 31
defaultConfig {
minSdk = 21
targetSdk = 31
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
sourceSets {
named("main") {
manifest.srcFile("src/androidMain/AndroidManifest.xml")
res.srcDirs("src/androidMain/res")
}
} …Run Code Online (Sandbox Code Playgroud) android grpc kotlin-multiplatform android-jetpack-compose jetbrains-compose