NullPointerException由于尝试在空对象引用上调用虚拟方法'android.os.IBinder android.view.SurfaceControl.getHandle()'

时间:2019-04-08 06:26:50

标签: android proguard android-proguard google-fabric android-9.0-pie

最近我确实将应用程序迁移到targetSdkVersion = 28。 将更新的应用发布到Google Play之后,我开始在Fabric.io中获得非常奇怪的崩溃报告: Crash report

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'android.os.IBinder android.view.SurfaceControl.getHandle()' on a null object reference
android.os.Parcel.createException (Parcel.java:1956)
android.os.Looper.loop (Looper.java:193)
android.app.ActivityThread.main (ActivityThread.java:6718)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

只有当用户从Play商店应用中打开应用时,此崩溃才会在带有Android Pie的Google设备(像素系列)上发生;从主屏幕打开应用时,一切正常。 而且崩溃报告中没有对我的代码的任何跟踪。

当我禁用proguard时,一切都会按预期运行

4 个答案:

答案 0 :(得分:1)

我们有一个类似的例外-也仅在Pixel设备上崩溃:

if (exception.getMessage.contains("something")) {
    // handle exception
} else {
    // pass to other handler
}

我们将java.lang.NullPointerException: Attempt to invoke direct method 'void android.view.SurfaceControl.checkNotReleased()' on a null object reference at android.os.Parcel.createException(Parcel.java:2077) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at android.app.IActivityTaskManager$Stub$Proxy.activityPaused(IActivityTaskManager.java:4489) at android.app.servertransaction.PauseActivityItem.postExecute(PauseActivityItem.java:64) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:177) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) Caused by: android.os.RemoteException: Remote stack trace: at android.view.SurfaceControl.access$800(SurfaceControl.java:77) at android.view.SurfaceControl$Transaction.reparent(SurfaceControl.java:2429) at com.android.server.wm.SurfaceAnimator.transferAnimation(SurfaceAnimator.java:238) at com.android.server.wm.WindowContainer.transferAnimation(WindowContainer.java:1261) at com.android.server.wm.AppWindowToken.transferStartingWindow(AppWindowToken.java:1575) targetSdkVersioncompileSdkVersion提升到29,但该异常不再出现。

答案 1 :(得分:1)

您可以向您添加此规则proguard-rules.pro

-keep class android.view.**

除此之外,你能包括一些你的 proguard 配置吗?

答案 2 :(得分:0)

我自己在这个问题上呆了好几个星期,直到我发现这个问题

buildTypes {
        debug {
            debuggable true
            buildConfigField 'String', "GOOGLE_KEY", GOOGLE_API
            buildConfigField "boolean", "IS_DEBUG", "true"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            minifyEnabled false
            shrinkResources false
        }
        release {
            debuggable false //This needs to be "true"
            buildConfigField "boolean", "IS_DEBUG", DEBUGABLE
            buildConfigField 'String', "GOOGLE_KEY", GOOGLE_API
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-optimize.pro'
            minifyEnabled false
            proguardFile PROGUARD_FILE
            shrinkResources false
        }
    }

只需将debuggable中的release更改为true

答案 3 :(得分:0)

更新目标SDK版本为30,升级构建工具版本和Gradle版本。然后 cleanrebuild 项目。如果问题没有解决,我们可能需要为应用程序寻找更详细的日志数据。