- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在使用 kotlin 多平台在公司进行下一个项目。一切正常,直到我尝试为 android 测试创建一个发布版本。我在发布版本中遇到此错误,而在调试中一切正常。
[NetworkManager] unknown exception: l.a.w: Can't locate argument-less serializer for class a. For generic classes, such as lists, please provide serializer explicitly.
这是项目级别的 build.gradle
buildscript {
ext.kotlin_version = '1.3.70'
ext.versions = [
"ktor" : "1.3.2",
"serialization" : "0.20.0",
"coroutines" : "1.3.6",
]
repositories {
maven { url 'https://maven.google.com' }
maven { url 'https://dl.google.com/dl/android/maven2' }
maven { url "https://s3-eu-west-1.amazonaws.com/elasticode-sdk/Android/maven/" }
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
classpath 'com.google.gms:google-services:4.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.3.70' // or any other kotlin plugin
id 'org.jetbrains.kotlin.plugin.serialization' version '1.3.70'
}
allprojects {
repositories {
maven { url 'https://maven.google.com' }
maven { url "https://s3-eu-west-1.amazonaws.com/elasticode-sdk/Android/maven/" }
google()
jcenter()
}
}
这是常见的模块 build.gradle
apply plugin: 'kotlin-multiplatform'
apply plugin: 'kotlinx-serialization'
kotlin {
targets {
iosArm64("ios64")
iosX64("iosSim")
configure([
ios64,
iosSim
]) {
binaries.framework {
baseName = 'PassengerCommon'
}
}
fromPreset(presets.jvm, 'android')
}
sourceSets {
commonMain.dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${versions.serialization}"
implementation "io.ktor:ktor-client:${versions.ktor}"
implementation "io.ktor:ktor-client-json:${versions.ktor}"
implementation "io.ktor:ktor-client-serialization:${versions.ktor}"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:${versions.coroutines}"
}
iosMain {
dependsOn commonMain
iosSimMain.dependsOn(it)
ios64Main.dependsOn(it)
dependencies {
// HTTP
implementation "io.ktor:ktor-client-ios:${versions.ktor}"
implementation "io.ktor:ktor-client-json-native:${versions.ktor}"
implementation "io.ktor:ktor-client-serialization-native:${versions.ktor}"
// Coroutines
api "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:${versions.coroutines}"
}
}
iosSimMain {
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-iosx64:${versions.serialization}"
}
}
ios64Main {
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-iosarm64:${versions.serialization}"
}
}
androidMain.dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${versions.serialization}"
implementation "io.ktor:ktor-client-serialization-jvm:${versions.ktor}"
implementation "io.ktor:ktor-client-okhttp:${versions.ktor}"
implementation "com.squareup.okhttp3:logging-interceptor:4.0.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${versions.coroutines}"
}
}
// Create a task building a fat framework.
task debugFatFramework(type: FatFrameworkTask) {
// The fat framework must have the same base name as the initial frameworks.
baseName = 'PassengerCommon'
// The default destination directory is '<build directory>/fat-framework'.
destinationDir = file("$buildDir/fat-framework/debug")
// Specify the frameworks to be merged.
from(
targets.ios64.binaries.getFramework("DEBUG"),
targets.iosSim.binaries.getFramework("DEBUG")
)
}
// Create a task building a fat framework.
task releaseFatFramework(type: FatFrameworkTask) {
// The fat framework must have the same base name as the initial frameworks.
baseName = 'PassengerCommon'
// The default destination directory is '<build directory>/fat-framework'.
destinationDir = file("$buildDir/fat-framework/release")
// Specify the frameworks to be merged.
from(
targets.ios64.binaries.getFramework("RELEASE"),
targets.iosSim.binaries.getFramework("RELEASE")
)
}
}
configurations {
compileClasspath
}
最后这是 android 模块 build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlinx-serialization'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'
repositories {
flatDir {
dirs 'libs'
}
google()
mavenCentral()
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
compileSdkVersion 28
defaultConfig {
applicationId "com.lines.passenger"
minSdkVersion 21
targetSdkVersion 28
versionCode 53
versionName "2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
packagingOptions {
exclude 'META-INF/proguard/androidx-annotations.pro'
}
}
signingConfigs {
release {
try {
storeFile file('../keystores/release.jks')
storePassword *****
keyAlias "*****"
keyPassword *****
} catch (Exception ex) {
throw new Exception("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
}
}
debug {
storeFile file('../keystores/debug.keystore')
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-DEBUG'
resValue("string", "app_name", "Passenger")
signingConfig signingConfigs.debug
resValue("string", "g_maps_api_key", "*****")
manifestPlaceholders = [MAPS_API_KEY: "*****"]
resValue "string", "app_version", "${defaultConfig.versionName}"
resValue("string", "PUSHER_APP_KEY", "*****")
resValue("string", "new_relic_key", "*****")
}
release {
resValue "string", "app_version", "${defaultConfig.versionName}"
minifyEnabled true
shrinkResources true
zipAlignEnabled true
resValue("string", "app_name", "Lines")
signingConfig signingConfigs.release
resValue("string", "g_maps_api_key", "*****")
manifestPlaceholders = [MAPS_API_KEY: "*****"]
resValue("string", "PUSHER_APP_KEY", "*****")
resValue("string", "new_relic_key", "*****")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
exclude 'META-INF/*.kotlin_module'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testImplementation 'junit:junit:4.12'
testImplementation 'org.hamcrest:hamcrest-library:1.3'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
testImplementation "io.mockk:mockk:1.9"
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
implementation project(':PassengerCommon')
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.google.firebase:firebase-messaging:20.2.1'
implementation 'com.google.firebase:firebase-core:17.4.3'
implementation 'com.google.firebase:firebase-config:19.1.4'
implementation 'com.google.firebase:firebase-crashlytics:17.1.0'
implementation 'com.google.firebase:firebase-storage:19.1.1'
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.google.maps.android:android-maps-utils:0.4.4'
implementation 'com.afollestad.material-dialogs:core:0.9.5.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
implementation 'com.squareup.retrofit2:retrofit:2.2.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
implementation 'com.squareup.retrofit2:converter-gson:2.2.0'
implementation 'com.jakewharton:butterknife:10.0.0'
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.5.0")
implementation 'com.karumi:dexter:4.2.0'
implementation 'de.hdodenhof:circleimageview:2.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.prolificinteractive:material-calendarview:1.4.3'
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'
implementation 'q.rorbin:badgeview:1.1.3'
implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha2'
implementation 'info.hoang8f:android-segmented:1.0.6'
implementation 'com.elasticode.sdk:elasticode-android:2.1.1'
implementation 'net.cachapa.expandablelayout:expandablelayout:2.9.2'
implementation 'com.pusher:pusher-websocket-android:0.7.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${versions.coroutines}"
}
apply plugin: 'com.google.gms.google-services'
如果你们需要什么我很乐意提供
最佳答案
如果应用程序在调试中工作但在发布中不能工作,这可能是因为 Proguard 缩小了你的类,并且由于不同的(更短的)类和属性名称,反序列化不再起作用。
确保你的 proguard 中有这个:
-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.SerializationKt
-keep,includedescriptorclasses class com.yourcompany.yourpackage.**$$serializer { *; } # <-- change package name to your app's
-keepclassmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
*** Companion;
}
-keepclasseswithmembers class com.yourcompany.yourpackage.** { # <-- change package name to your app's
kotlinx.serialization.KSerializer serializer(...);
}
如果反序列化仍然失败,请提供一个示例,说明您如何将网络响应反序列化为数据类。
关于android kotlin multiplatform kotlinx.serialization 适用于调试但不适用于发布版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62638220/
我正在 kotlin 多平台上创建我的第一个应用程序,并且需要获取一些设备的信息,例如语言和国家/地区。 我正在寻找一种使用 Kotlin 多平台在 Android 和 iOS 两种设备上运行的方法。
我正在写一篇关于多平台编程的论文,我想包括关于优点/缺点的部分。据我了解;让任何应用程序成为多平台对于开发人员来说是一个巨大的卖点,因为它使几乎任何计算机用户都成为潜在的买家等等。我只是想找出可能的缺
我想知道多平台应用程序是如何开发的。适用于 MAC/Windows 的 Microsoft Office、适用于 MAC/Windows/Linux 的 FireFox 等应用程序。 如果他们必须为不
我找不到任何关于如何在 Kotlin Multiplatform 中获取 CPointer 的示例,现有的文档也没有多大帮助。在我的 iOS 源集中,我需要构建与以下 Swift 代码等效的 Kotl
我正在寻找一个返回特定于平台的换行字符串的函数。这可以使用 System.lineSeparator() 实现,但它仅在 Kotlin/JVM 中可用。有没有跨平台的功能? 我知道 expect/ac
我正在开发一个 Kotlin 多平台应用程序,我想在我的模型类中使用 @Parcelize 注释。但是在 Kotlin Multiplatform 插件中,@Parcelize 注释在我使用的 kot
我想在我正在编写的 kotlin 多平台库中使用 jetbrains 公开库。我该怎么做呢?我收到一个 gradle 构建错误,它无法找到它需要公开的所有内容。这是我的 gradle 构建 sourc
最近我将我的 KMP 项目拆分为全栈项目和一个核心库(主要由公共(public)数据类组成),发现我需要在现在定义的其中一个数据类上使用 JVM 库中的注释在一个公共(public)模块中。 在 Ko
我尝试为所有类型为 Test 的任务设置以下内容如下: tasks.withType { testLogging { exceptionFormat = TestExcepti
到目前为止,我找不到任何人这样做,所以我会尝试正确说明我面临的问题。 我有一个 compose-ui shared module 中的模块我的 KMP 应用程序。 compose-ui有一个 comm
我正在 Kotlin-Multiplatform 中开始一个项目。通过Java访问资源文件夹很容易,但我不知道如何通过针对Node的JS访问它。 在测试过程中,我发现资源文件存储在一个单独的文件夹中。
我试图使用ShadowJar gradle插件将我的ktor应用打包到胖 jar 中。但是由于shadowJar任务的结果,我每次都会得到几乎空的jar。它仅包含 list (正确设置了主类)。 Gr
以前,使用 Gradle 构建多平台项目依赖于每个目标平台的单独 Gradle 插件:kotlin-platform-common , kotlin-platform-js , 和 kotlin-pl
我正在开发一个多平台项目,iOS 和 JVM(我不直接针对 Android)。根据构建类型(调试或发布),我想配置日志记录级别(即仅打印发布中的错误)。由于没有可用的 BuildConfig 类,我如
现在我正在尝试创建一个连接到 facebook 的多平台应用程序。 我已经通过网络应用程序成功发送邀请并发布到时间线,现在我正计划通过 android 和 iOS 应用程序发布到时间线并在 faceb
我想使用 Coil 图像库从 api 加载图像,并使用之前设置的相同 cookie。因此,我想对我的 Ktor 网络调用和使用 Coil 加载图像使用相同的 HttpClient。 如何在 Ktor
我正在开发一个 KMM 项目,我需要为我的项目创建不同的架构,例如(开发、生产、QA)我可以在 android 部分轻松完成,但我无法在 iOS 中创建相同的架构。我尝试创建我们通常在 iOS 应用程
我创建了一个非常简单的 KMP 项目,其结构如下: -Root --app --gradle --SharedCode --src\commonMain\kotlin\actual.kt
我正在尝试使用新的 Kotlin MultiPlatform 设置发布一个 Android 库(调试/发布)。我能够成功发布 iOS 框架,但不能发布 android 库。这是我最终得到的错误: 配置
我遵循了教程 https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html ,然后我成功创建了androidmain,iosmai
我是一名优秀的程序员,十分优秀!