Crashlytics 崩溃报告提到 XposedBridge

Crashlytics crash report mentions XposedBridge

我昨天发布了 Android 应用程序的更新,今天我在 Crashlytics 中看到了一些崩溃日志:

   Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.MyWebViewActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
          at android.app.ActivityThread.-wrap12(ActivityThread.java)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
          at android.os.Handler.dispatchMessage(Handler.java:102)
          at android.os.Looper.loop(Looper.java:154)
          at android.app.ActivityThread.main(ActivityThread.java:6119)
          at java.lang.reflect.Method.invoke(Method.java)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
          at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:107)

   Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
          at com.example.myapp.MyWebViewActivity.onCreate(MyWebViewActivity.java:77)
          at android.app.Activity.performCreate(Activity.java:6679)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
          at android.app.ActivityThread.-wrap12(ActivityThread.java)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
          at android.os.Handler.dispatchMessage(Handler.java:102)
          at android.os.Looper.loop(Looper.java:154)
          at android.app.ActivityThread.main(ActivityThread.java:6119)
          at java.lang.reflect.Method.invoke(Method.java)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
          at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:107) 

在这份报告的底部提到了 XposedBridge,我觉得这有点奇怪。这是由于有人使用 Xposed 框架试验我的应用程序造成的吗?或者这会发生在 "normal user" 身上吗? Crashlytics 说这个问题到目前为止已经影响了 3 个用户,但我持怀疑态度,因为他们都有完全相同的 phone 型号和 Android 版本(摩托罗拉 Nexus 6,Android 7.1.1)并在 10 分钟内发生。

NPE 是由 onCreate 方法中的 getIntent().getStringExtra("some_string").equals("another_string") 引起的,即使我在创建此 activity 的所有地方都设置了 "some_string"。

所以我想知道这种崩溃是否可能是除了正在试验 Xposed 的用户以外的任何原因造成的? IE。我应该认真还是不认真?

一般而言,堆栈跟踪中有 XposedBridge 仅表示该应用程序在安装了 XPosed 的设备上运行。 XPosed 在整个系统范围内更改 Dalvik VM,即使您的应用程序未被任何 XPosed 模块修改。

我没有太多使用 Crashlytics 的经验,但是我会将“3 个用户”解释为一个用户已两次清除应用程序数据。

无论如何,我会一直使用安全编码,因此您来电

getIntent().getStringExtra("some_string").equals("another_string")

应重新表述为:

"another_string".equals(getIntent().getStringExtra("some_string"))

这种方式读起来可能有点陌生,但是在当前 Intent 没有 "some_string" 值的情况下,它可以安全地防止 NullPointerException。