Android 4.4 KitKat 随机崩溃

标签 android dalvik android-4.4-kitkat

编辑:在否决和暗示事情之前,请理解我无法重现此错误。这种情况在我无法访问的某些设备上经常发生,但在固件重置后不会发生!

我最近在为客户开发的应用程序中发现了随机崩溃。 3 年后,该应用现在拥有大约 100,000 名活跃用户。

我们已经看到 Nexus 4 和 5 上的崩溃,两者都使用 Android 4.4 KitKat。

我们无法在运行 4.4 的 Nexus 4 和 5 上重现它。

通过我们的支持,我们有了一位客户。他告诉我们,每次调用新 Activity 时都会在同一个地方发生崩溃。他在经营 Dalvik,而不是 ART。重置固件后,应用程序运行良好,无法再次重现!

出于法律原因,我无法发布源代码或布局,但有此堆栈跟踪:

java.lang.RuntimeException: Unable to start activity ComponentInfo{xx.xxx.xxxxx.xxx.xxxxxx.prod/xx.xxx.xxxxx.xxx.PaymentsActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.access$700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4998)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:4938)
at android.view.View.sendAccessibilityEventUnchecked(View.java:4919)
at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:19433)
at android.view.View$SendViewStateChangedAccessibilityEvent.runOrPost(View.java:19465)
at android.view.View.notifyViewAccessibilityStateChangedIfNeeded(View.java:7265)
at android.view.View.setFlags(View.java:8990)
at android.view.View.setVisibility(View.java:6020)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:859)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:547)
at android.view.LayoutInflater.parseInclude(Native Method)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:547)
at android.view.LayoutInflater.inflate(Native Method)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
at android.app.Activity.setContentView(Activity.java:1928)
at xx.xxx.xxxxx.xxx.StandardActivity.setContentView(StandardActivity.java:289)
at xx.xxx.xxxxx.xxx.PaymentsActivity.onCreate(PaymentsActivity.java:61)
at android.app.Activity.performCreate(Activity.java:5243)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
... 12 more

编辑:没有 xposed 的第二个堆栈跟踪

java.lang.RuntimeException: Unable to start activity ComponentInfo{xx.xxx.xxxxx.xxx.xxxxx.prod/xx.xxx.xxxxx.xxx.PaymentsActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
at android.app.ActivityThread.access$700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4998)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:4938)
at android.view.View.sendAccessibilityEventUnchecked(View.java:4919)
at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:19433)
at android.view.View$SendViewStateChangedAccessibilityEvent.runOrPost(View.java:19465)
at android.view.View.notifyViewAccessibilityStateChangedIfNeeded(View.java:7265)
at android.view.View.setFlags(View.java:8990)
at android.view.View.setVisibility(View.java:6020)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:859)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
at android.app.Activity.setContentView(Activity.java:1928)
at xx.xxx.xxxxx.xxx.StandardActivity.setContentView(StandardActivity.java:289)
at xx.xxx.xxxxx.xxx.PaymentsActivity.onCreate(PaymentsActivity.java:61)
at android.app.Activity.performCreate(Activity.java:5243)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
... 11 more

在 setContentView() 中设置的布局包含框架,否则它非常标准和简单。

非常感谢任何输入 :-)

最佳答案

我在维护一些代码时也遇到了同样的问题。通过在辅助功能选项中启用 TalkBack,我能够始终如一地复制该错误。

首先,这是来自 Android 的 KitKat 版本的 View.java 中使用导致崩溃的空引用的方法:

void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
    if (!isShown()) {
        return;
    }
    onInitializeAccessibilityEvent(event);
    // Only a subset of accessibility events populates text content.
    if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) {
        dispatchPopulateAccessibilityEvent(event);
    }
    // In the beginning we called #isShown(), so we know that getParent() is not null.
    getParent().requestSendAccessibilityEvent(this, event);
}

对我来说,根本原因是一个自定义 View ,它像这样覆盖了 View.isShown():

public boolean isShown(){
  return someCondition;
}

这意味着 sendAccessibilityEventUncheckedInternal 会运行通过 if(!isShown()) 检查,即使 View 有一个 null 父级,也会导致崩溃。

我最初认为这是一个并发问题,因为我假设 isShown() 检查确保父级不为空,并且在执行 sendAccessibilityEventUncheckedInternal 期间对 View 的父级的引用已更改。错了!

如果您发现类似的问题,尤其是在您未编写的代码中,您可以通过包含父类(super class)的 isShown() 的结果来很容易地防止这种崩溃(假设您正在更改 View 的直接子类中的代码):

public boolean isShown(){
  return super.isShown() && someCondition;
}

关于Android 4.4 KitKat 随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20429603/

相关文章:

java - 第一次调用后如何在 ChildEventListener 中传递 onChildAdded 条件?

android - java.lang.NoSuchMethodError : android. app.AlertDialog$Builder

android - 移动到 1/3 屏幕宽度时不调用 onConfigurationChanged

android - 同一行的两个 TextInputLayout

android - 如何使用 Android 版本 4.4.2 ( KITKAT ) 检测文件夹是否可写

android - AppCompatButton 安卓 :onClick Could not find a method exception

android - 在 WebView Android 4.4 (KitKat) 上禁用远程调试

java - 更改 dalvik/libcore 会导致重建整个框架

java - 同一对象的过度实例化?

java - 在Android中实现类Spring包扫描