java - Play 商店中的 Android Kotlin 应用程序崩溃:类型 kotlin.Pair 不存在。java.lang.TypeNotPresentException
问题描述
我刚刚在 Play Store 上发布了一个新应用。该应用程序在提交之前在我的手机上运行良好,但是当我从 Play 商店下载该应用程序时,它在启动时崩溃了。我已尝试从手机中删除该应用程序并重新安装,但在启动时仍会崩溃。
当我将手机连接到 Android Studio 时,我看到崩溃发生时记录了这一点。
java.lang.RuntimeException: Unable to create application com.bundleid.EXAMPLE.MyApplication: java.lang.TypeNotPresentException: Type kotlin.Pair not present
为什么 kotlin.Pair 在应用程序的 Play 商店版本中不可用?自 2018 年左右以来,我还没有向 Play Store 提交任何应用程序,所以我有点生疏,但我记得以前有过类似的经历,我认为这与 Proguard 有关,但我不确定。我该如何解决这个问题,以及如何事先测试应用程序从 Playstore 下载时的行为方式?
满的:
--------- beginning of crash
2021-08-09 00:09:03.067 13733-13733/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bundleid.EXAMPLE, PID: 13733
java.lang.RuntimeException: Unable to create application com.bundleid.EXAMPLE.MyApplication: java.lang.TypeNotPresentException: Type kotlin.Pair not present
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
at android.app.ActivityThread.access$1400(ActivityThread.java:244)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1952)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7700)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
Caused by: java.lang.TypeNotPresentException: Type kotlin.Pair not present
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:69)
at libcore.reflect.ParameterizedTypeImpl.getOwnerType(ParameterizedTypeImpl.java:54)
at p4.a.a(Unknown Source:35)
at p4.a$a.<init>(Unknown Source:3)
at p4.a.a(Unknown Source:63)
at t4.a.<init>(:1)
at v4.t3.<init>(Unknown Source:0)
at com.bundleid.EXAMPLE.MyApplication.onCreate(:23)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6754)
at android.app.ActivityThread.access$1400(ActivityThread.java:244)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1952)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7700)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
Caused by: java.lang.ClassNotFoundException: kotlin.Pair
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:67)
at libcore.reflect.ParameterizedTypeImpl.getOwnerType(ParameterizedTypeImpl.java:54)
at p4.a.a(Unknown Source:35)
at p4.a$a.<init>(Unknown Source:3)
at p4.a.a(Unknown Source:63)
at t4.a.<init>(:1)
at v4.t3.<init>(Unknown Source:0)
at com.bundleid.EXAMPLE.MyApplication.onCreate(:23)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6754)
at android.app.ActivityThread.access$1400(ActivityThread.java:244)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1952)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7700)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
Caused by: java.lang.ClassNotFoundException: kotlin.Pair
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:454)
at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:67)
at libcore.reflect.ParameterizedTypeImpl.getOwnerType(ParameterizedTypeImpl.java:54)
at p4.a.a(Unknown Source:35)
at p4.a$a.<init>(Unknown Source:3)
at p4.a.a(Unknown Source:63)
at t4.a.<init>(:1)
at v4.t3.<init>(Unknown Source:0)
at com.bundleid.EXAMPLE.MyApplication.onCreate(:23)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6754)
at android.app.ActivityThread.access$1400(ActivityThread.java:244)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1952)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7700)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:612)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
gradle.properties:
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
android.enableJetifier=true
kotlin.code.style=official
build.gradle(项目):
buildscript {
ext.kotlin_version = "1.5.20"
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.8'
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://jitpack.io" }
jcenter() // Warning: this repository is going to shut down soon
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle(模块):
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.google.gms.google-services'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.bundleid.EXAMPLE"
minSdkVersion 21
targetSdkVersion 30
versionCode 5
versionName "5.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
ndk {
debugSymbolLevel 'FULL'
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'nl.dionsegijn:konfetti:1.3.2'
implementation 'com.android.billingclient:billing:4.0.0'
implementation 'org.apache.commons:commons-text:1.9'
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'org.adblockplus:adblock-android-webview:4.4.0'
implementation 'org.jsoup:jsoup:1.13.1'
implementation("com.android.volley:volley:1.2.0")
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'androidx.preference:preference-ktx:1.1.1'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation 'com.github.blipinsk:ViewPropertyObjectAnimator:1.5.0'
implementation 'me.saket:better-link-movement-method:2.2.0'
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation 'androidx.asynclayoutinflater:asynclayoutinflater:1.0.0'
implementation 'com.google.firebase:firebase-messaging:22.0.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
}
我的proguard-rules.pro
文件是空的。
编辑:
我至少能够使用应用程序的发布版本重现相同的问题:
brew install bundletool
cd /location/to/your/release/folder
bundletool build-apks --bundle=app-release.aab --output=./app.apks
ls
bundletool install-apks --apks=app.apks --adb=~/Library/Android/sdk/platform-tools/adb
现在我只需要弄清楚如何修复崩溃。
编辑2:
如果我minifyEnabled
在 build.gradle 中设置为 false,那么它不会崩溃。所以它肯定与Proguard有关。我该如何解决?
编辑 3:
我可以通过将其放入proguard-rules.pro
文件中来解决此问题:
-keep class androidx.** { *; }
-keep interface androidx.** { *; }
-keep class kotlin.** { *; }
-keep interface kotlin.** { *; }
-keep class com.bundleid.EXAMPLE.** { *; }
-keep interface com.bundleid.EXAMPLE.** { *; }
这行得通。但如果有人认为这些规则可能不正确或过于宽泛,请告诉我。
解决方案
在将现有应用程序targetSdkVersion
从 29 增加到 30 后,我刚刚遇到了这个问题。添加这个proguard-rules.pro
似乎可以为我解决这个问题:
-keep class kotlin.Pair
推荐阅读
- java - Springboot liquibase 回滚锁定失败
- css - Angular:如何更改里面的图标
? - powerbi - MS Power BI 中 2 列之间的天数差异
- python - 如何在ORM查询中使用路径编写mysql json_contains函数的第一个参数
- nlp - 如何改进我的 spaCy 模型以完美识别坐标?
- javascript - JavaScript 中的自定义事件与简单地调用常规函数有何不同?
- python - 如何将合并的文本文件保存到python中的子目录中?
- android - 在多窗口中将焦点更改为第二个应用程序
- javascript - Symfony 4 和 MercureBundle
- mysql - 如何在 mysql 8.0.16 中声明变量?