首页 > 解决方案 > 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.** { *; }

这行得通。但如果有人认为这些规则可能不正确或过于宽泛,请告诉我。

标签: javaandroidkotlinruntimeexception

解决方案


在将现有应用程序targetSdkVersion从 29 增加到 30 后,我刚刚遇到了这个问题。添加这个proguard-rules.pro似乎可以为我解决这个问题:

-keep class kotlin.Pair

推荐阅读