tutorial online generar gap font compile javascript cordova

javascript - online - phonegap build ios



cómo hacer que mi aplicación de Android phonegap se cuelgue? (9)

¿Cómo puedo hacer que mi aplicación se bloquee haciendo una excepción en el nivel de JavaScript?

No puede manejar los errores de js que provocan el mensaje "Lamentablemente, la aplicación se ha detenido", porque no existen y no están relacionados con JavaScript, pero están relacionados con Webview / plugin.

Si ves este tipo de mensaje después de una llamada js, proviene de la implementación javascript de la vista web, la parte nativa de AKA Chrome o la del plugin. Javascript es un espacio aislado y no debe producir tales comportamientos.

Estoy desarrollando un plugin de reportero crash para aplicaciones de Android phonegap. Para el propósito de la prueba, tengo que hacer que se bloquee la aplicación y se debe invocar la ventana "Lamentablemente, la aplicación se ha detenido". Cuando hago una excepción no controlada en el javascript, la aplicación no se cuelga. En cambio, muestra la misma pantalla. Hice que la pantalla de la aplicación dejara de responder a la entrada del usuario ejecutando un bucle infinito en javascript y esperé alrededor de 1 hora, pero la aplicación no se bloqueó. ¿La biblioteca de phonegap maneja por defecto las excepciones? ¿Cómo puedo hacer que mi aplicación se bloquee haciendo una excepción en el nivel de JavaScript?

Intenté el siguiente código, agregué un método de Java para generar un bloqueo en la clase ''CordovaActivity''.

public static void generateCrash() { int a = 0; int b = 10; int c = b/a ; }

La aplicación se cuelga cuando llamo a este método desde Java (desde ''onCreate'' en la clase de actividad). Pero cuando invoco el mismo método desde el javascript que utiliza el complemento, la aplicación no se bloquea. Quiero que mi aplicación se cuelgue llamando / invocando alguna función del javascript.


  1. intente descargar cualquier archivo de más de 100MB (mi aplicación se atascó en androides de gama baja). Incluso puedes hacer eso en bucles.

  2. Use lienzos y suelte algunas figuras aleatorias en 3D.

  3. aplicación un mensaje de alerta en un bucle de 1000.


Creo firmemente que los bucles infinitos no funcionarán en este caso. Cuando lo usa con PhoneGap, javascript es solo un lenguaje de script (seguro) que no puede generar excepciones guiadas por el sistema.

El mejor método es ejecutar algunos códigos nativos (códigos problemáticos) con la ayuda de otro complemento PhoneGap. Por ejemplo, puede hacer división por cero en códigos nativos de Object-c y Java.


Desafortunadamente, las excepciones JS son manejadas por WebView e incluso los complementos nativos se ejecutan en su propio hilo separado, y no bloquean el hilo de la aplicación principal si se genera una excepción allí (esto puede no ser cierto para las aplicaciones híbridas). Por lo tanto, debe conectar con la actividad principal y hacer que arroje una excepción en el hilo principal.

Subclase la clase CordovaActivity y anule el método de envío de complementos:

@Override public Object onMessage(String id, Object data) { if ("crashApp".equals(id)) { throw new Exception(); } super(id, data); }

Escribe un complemento nativo de Android para Phonegap según esta respuesta . Lo que hace no importa, pero cuando lo envía desde el Javascript, debe usar el id ''crashApp'', que debe ser recogido por su método reemplazado en la subclase CordovaActivity , y aumentar la excepción en el hilo principal.

. A continuación, puede enviar un mensaje a su complemento utilizando esta identificación cada vez que tenga una excepción de Javascript anulando la función window.onerror :

window.onerror = function myFunction(errorMsg, url, lineNumber) { /* call Android native function to throw Exception */ ; return false; }

Esto arrojará todos los errores de Javascript en su código Java donde pueden generar el diálogo ANR (y también puede pasar información de depuración).


Por lo general, un alto en la ejecución, intencional o no, puede hacer que Android piense que la aplicación se ha bloqueado. Intente envolver su código en algo como setTimeout(function() { your code }, 60000) para retrasar la ejecución por un minuto.

O bien, intente hacer una solicitud de AJAX que expirará.


Puede hacer que su aplicación cordova / phonegap se bloquee eliminando los permisos del archivo AndroindManifest.xml pero aún utilizándolos dentro de la aplicación, este tipo de excepciones en su mayoría bloquean su aplicación.

tenga en cuenta que (según la estructura de su proyecto) modificando el archivo AndroindManifest.xml , puede regenerarse y volver a su estado correcto, por lo que deberá eliminar las líneas de permiso y luego cambiar el archivo Androind.json en los plugins antes de compilar, de forma adecuada para que los cambios surtan efecto.

¡Probé este proceso y definitivamente funciona! :RE

espero que ayude, mim;)


Puede intentar hacer un bucle infinito añadiendo una cadena cada vez que se inicie la aplicación:

onDeviceReady: function() { var test = "test"; while (true) { test += "--------------------"; console.log(test); } },

Esto hará el truco.


Si una aplicación se ejecutara como una página web, un ciclo infinito podría tomar algún tiempo para causar un bloqueo, pero debería funcionar. Solo recuerde quitarlo después de la prueba. Debido a que causa una excepción y agota el tiempo de espera del programa, el bloqueo debe invocarse correctamente si se usa algo que sea nocivo. Haz algo como esto:

while(true){ eval("9.99999e+5000 / Infinity"); }

Como no estamos editando una variable, evitaremos el error de falta out of memory .

Si esto no funciona, consulte la respuesta de Aaron D''s, y si eso no funciona, consulte la respuesta de @ kumar.


Bloquear presionando el botón de menú:

No puede hacer que la aplicación falle desde un complemento o una llamada javascript, ya que las excepciones se manejan internamente. Si desea hacer que la aplicación se cuelgue en Android, puede editar CordovaActivity.java en la plataforma Android. Cambie onCreateOptionsMenu como se muestra:

@Override public boolean onCreateOptionsMenu(Menu menu) { this.postMessage("onCreateOptionsMenu", menu); throw new RuntimeException(); }

Presione el botón de menú y la aplicación se bloqueará y se mostrará la ventana "Lamentablemente, la aplicación se ha detenido".

Bloquear llamando a alguna función nativa de Javascript:

Escribe un plugin nativo de Android para Phonegap. Consulte http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins para la creación de complementos. Lanzar excepción dentro del método de ejecución. Esto se manejará en la capa principal (Es por eso que puedes ver los registros sobre fallas en la consola), así que haz los siguientes cambios para hacer que la aplicación se cuelgue . (Ambas clases pertenecen al paquete org.apache.cordova)

  • Elimine el bloque catch (Exception e){} en el método execHelper de las clases pluginManager.
  • Elimine el bloque catch (Throwable e) {} en el método exec de la clase ExposedJsApi .

    Con este cambio puedo bloquear la aplicación desde una llamada javascript.