para - Android 4.4 KitKat accidente aleatorio
descargar rom 4.4 kitkat para cualquier android (2)
EDITAR: antes de votar y dar a entender cosas, comprenda que no puedo reproducir este error. ¡Esto sucede constantemente en ciertos dispositivos a los que no tengo acceso, pero no después de un restablecimiento de firmware!
Recientemente descubrí fallos aleatorios en una aplicación que estoy desarrollando para un cliente. La aplicación tiene aproximadamente 100.000 usuarios activos ahora después de 3 años.
Hemos visto el accidente en Nexus 4 y 5, ambos con Android 4.4 KitKat.
No podemos reproducirlo en nuestro propio Nexus 4 y 5 con 4.4.
Hemos tenido un cliente a través de nuestro soporte. Nos dijo que el choque ocurre cada vez en el mismo lugar cuando se invoca una nueva actividad. Él estaba corriendo Dalvik, no ARTE. Después de reiniciar el firmware, la aplicación funcionó bien y no pudo reproducirla nuevamente.
No puedo publicar la fuente o el diseño por razones legales, pero tengo este stacktrace:
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
EDITAR: Segundo seguimiento de pila sin 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
El diseño que se establece en setContentView () contiene marcos, de lo contrario es bastante estándar y sencillo.
Cualquier entrada es muy apreciada :-)
Mis usuarios se han encontrado con el mismo problema y parece que se debe a que una o más opciones de accesibilidad están activadas. Algunos de mis usuarios estaban usando el reloj inteligente Pebble que instala una opción de accesibilidad, por lo que no es solo TalkBack, etc.
El diagnostico
Eche un vistazo a este bit del método View#setFlags()
de KitKat en https://github.com/android/platform_frameworks_base/blob/kitkat-mr1-release/core/java/android/view/View.java#L9006
if (accessibilityEnabled) {
...
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
}
que te envía por el agujero de conejo y termina en una NullPointerException
si se ejecuta antes de que la Vista se adjunte a la jerarquía de la vista (es decir, no tiene padre) porque en la View#sendAccessibilityEventUncheckedInternal()
en https://github.com/android/platform_frameworks_base/blob/kitkat-mr1-release/core/java/android/view/View.java#L4952 tenemos:
getParent().requestSendAccessibilityEvent(this, event);
Mi solución (que parece que no funcionará para ti)
Para mi aplicación, estoy creando una subclase View
programación y estaba llamando a View#setOnClickListener()
en el constructor. En su lugar, ahora llamo a View#setOnClickListener()
desde
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
/* Due to a bug in how Android 4.4 handles accessibility options,
* we can''t set the onClick listener until this View has a parent or we will
* get an NPE. */
setOnClickListener(this);
}
Funciona porque esta View
tendrá un padre cuando se View#onAttachedToWindow()
.
Sin embargo, el seguimiento de tu pila es más problemático. Estás cayendo en el agujero del conejo a través de atributos en un diseño XML. No se me ha ocurrido una idea. Una idea es que esto solo debe ocurrir al inicio de la aplicación; de lo contrario, prácticamente todas las inflaciones de diseños XML desencadenarán el bloqueo porque hay muchas rutas que lo llevan a través de la View#setFlags()
. En mi aplicación, este único punto parece ser el único bloqueo y ocurre al inicio de la aplicación. No es una idea agradable, pero una posibilidad es reordenar las cosas para inflar esta vista más adelante.
También me he encontrado con este mismo problema con algún código que estaba manteniendo. Pude replicar constantemente el error al habilitar TalkBack en las opciones de accesibilidad.
Primero, aquí está el método de View.java donde se usó la referencia nula que causó el bloqueo, de la versión de KitKat de Android:
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);
}
Para mí, la causa raíz resultó ser una vista personalizada que había anulado View.isShown () así:
public boolean isShown(){
return someCondition;
}
Esto significaba que sendAccessibilityEventUncheckedInternal pasaría más allá de la comprobación if (! IsShown ()) que realiza antes de continuar incluso cuando la Vista tenía un elemento primario nulo, y por lo tanto causó el bloqueo.
Originalmente pensé que era un problema de concurrencia, porque asumí que la verificación isShown () aseguraba que el padre no fuera nulo y que la referencia al padre de la Vista había cambiado durante la ejecución de sendAccessibilityEventUncheckedInternal. ¡Incorrecto!
Si encuentra un problema similar, especialmente en el código que no escribió, puede evitar este bloqueo con bastante facilidad incluyendo el resultado de isShown () de la superclase (asumiendo que está cambiando el código en una subclase de vista directa):
public boolean isShown(){
return super.isShown() && someCondition;
}