启用 R8 使应用程序崩溃

Enabling R8 crashes application

所以我通过将 android.enableR8=true 添加到 gradle.properties 在我的项目中启用了 R8。 这是我的 gradle 文件:

buildTypes {
        release {
            useProguard false
            minifyEnabled true
            debuggable false
            multiDexEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
...

但是当我 运行 构建时,我在应用程序启动时崩溃了:

java.lang.RuntimeException: Unable to instantiate application com.example.application.MyApplication: java.lang.NullPointerException: throw with null exception
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1069)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5842)
        at android.app.ActivityThread.access00(ActivityThread.java:199)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: throw with null exception
        at com.example.application.MyApplication.<init>(MyApplication.kt:18)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:50)
        at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:52)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1120)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1061)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5842) 
        at android.app.ActivityThread.access00(ActivityThread.java:199) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

我将它们添加到我的混淆文件中,因此 R8 不会删除或混淆任何内容

-dontobfuscate
-dontshrink
-dontoptimize

应用程序仍然崩溃。

我尝试通过在 Gradle 文件中将 android.enableR8=false 设置为 gradle.properties 和 useProguard true 来迁移到 Proguard,应用程序运行良好,没有崩溃。

有人遇到同样的问题吗?

顺便说一句,我的项目是在 Kotlin 中。

我建议您查看 R8 的输出,看看是否有任何警告可以为您指明正确的方向。如果您能够始终如一地重现该问题,则可以向 R8 提交问题:https://issuetracker.google.com/issues/new?component=326788&template=1025938.

问题是我们在一些模块中捆绑了 android.jar,但它应该只在引导类路径上,正如 Android 团队在 issue 我在 IssueTracker 上创建的那样.

我在使用 R8ProGuard 缩小的应用程序时遇到问题。我只是从 bulid.gradle.

中删除了 ProGuard 缩小