由于空对象引用,尝试调用虚拟方法'android.view.SurfaceControl.getHandle()'导致空指针异常

16

最近我将我的应用迁移到目标SDK版本为28。在将更新后的应用发布到Google Play后,我开始在Fabric.io中收到非常奇怪的崩溃报告: 崩溃报告

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)

这个崩溃仅发生在搭载Android Pie操作系统的谷歌设备(Pixel系列),当用户通过Play Store应用程序打开应用时出现,但是从主屏幕打开一切正常。而且在崩溃报告中没有任何与我的代码相关的迹象。

当我禁用Proguard时,一切正常运作。


1
你找到答案了吗?我这里也遇到了SurfaceControl.getHandle()崩溃问题报告。但我的错误不仅仅是像素,而且我没有使用proguard。 - Marcello Câmara
1
这个问题也发生在摩托罗拉Moto G7(Android 9)上,应用程序的目标是29(Android 10)。 - Alix
这个问题有任何更新吗? - Fayçal
4个回答

2

您可以将以下规则添加到您的proguard-rules.pro中:

-keep class android.view.**

除此之外,你能否包含一些你的Proguard配置?

你能解释一下这个代码的作用以及它是如何解决问题的吗? - CodyF
基本上是告诉Proguard保留在包android.view.**中的类。因此不要混淆它。 - Jimly Asshiddiqy

0

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


0

我们遇到了类似的异常 - 只在Pixel设备上崩溃:

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)

我们将targetSdkVersioncompileSdkVersion29升级到30,异常不再出现。


我在使用 Android 10 的非 Pixel 设备(三星)上遇到了相同的问题。我的 targetSdkVersioncompileSdkVersion 都是 28 - Tomer Petel
3
我将targetSdkVersion和compileSdkVersion从28改为30,但在Android 10上仍然遇到崩溃问题。 - NullPointer
@NullPointer 我也遇到同样的问题,但你找到解决方案了吗? - Fayçal
我在谷歌像素(79%)和小米(14%)上遇到了同样的问题,仅适用于Android 12。compile为32,target为30。 - Ярослав Нестеров

-3

我自己在这个问题上困扰了几个星期,直到我找到了这个解决方法。

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
        }
    }

只需将release中的debuggable改为true


3
在发布版本中将 debuggable 的值从 false 改为 true 并不是我们想要做的事情。 - vt600c
是的,我同意这不是解决方案,但它可以运行应用程序。但是,在调用第二个活动的startActivity之后,在当前活动上调用finish方法来修复应用程序崩溃问题。您还可以检查发生崩溃的屏幕是否存在相同的问题。 - Dheeraj Kanwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接