comment faire pour que mon application Android phonegap crash?

je développe un plugin crash reporter pour les applications android de phonegap. Pour le but de test, je dois faire planter mon application & la fenêtre" malheureusement, l'application s'est arrêtée " doit être invoquée. Quand je fais une exception non manipulée dans le javascript, l'application ne s'effondre pas. Au lieu de cela il montre le même écran. J'ai fait l'écran d'arrêt de l'application répondre à l'entrée de l'utilisateur en exécutant une boucle infinie dans javascript & attendu environ 1 heure, encore l'application ne s'est pas écrasée. Est le phonegap bibliothèque par défaut traitant les exceptions ? Comment puis-je faire planter mon application en faisant une exception dans le niveau javascript ?

j'ai essayé le code ci-dessous,j'ai ajouté une méthode java pour générer crash dans la classe 'CordovaActivity'.

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

l'application s'écroule quand j'appelle cette méthode de java (de la classe 'onCreate' dans la classe d'activité) . Mais quand j'invoque la même méthode à partir du javascript en utilisant le plugin, l'application ne s'effondre pas. Je veux que mon application crash par appeler/invoquer une fonction à partir du javascript.

28
demandé sur Sinu Varghese 2015-02-05 12:55:48

9 réponses

Crash en appuyant sur le bouton menu:

vous ne pouvez pas faire planter l'application à partir d'un plugin ou d'un appel javascript car les exceptions sont gérées en interne. Si vous voulez faire planter l'application dans android, vous pouvez éditer CordovaActivity.java dans Android plate-forme. Changement de régime comme indiqué ci-dessous:

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

appuyez sur le bouton de menu et l'application va crash & " malheureusement, l'application s'est arrêtée " la fenêtre s'affichera.

Crash de l'appel des indigènes de la fonction à partir de Javascript:

écrivez un plugin natif Android pour Phonegap. Référence http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins pour la création de plugin. Lancer exception à l'intérieur de la méthode execute. Ceci sera traité dans la couche parent(C'est pourquoi vous vous pouvez voir les logs sur crash dans la console), alors s'il vous plaît faire les changements suivants pour faire l'application crash .(Les deux classes appartiennent à org.Apache.cordova package)

  • Supprimer catch (Exception e){} bloc execHelper méthode de pluginManager classs.
  • Supprimer catch (Throwable e) {} bloc exec méthode de ExposedJsApi classe.

    avec ce changement je suis capable de planter l'application de l'appel javascript.

9
répondu kumar 2015-04-28 08:53:46

si une application tourne comme une page Web, une boucle infinie peut prendre un certain temps pour causer un crash, mais devrait fonctionner. N'oubliez pas de l'enlever après le test. Parce qu'il provoque une exception, et chronomètre le programme, le crash devrait être correctement invoqué si quelque chose de possible nocif est utilisé dans lui. Faites quelque chose comme ceci:

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

parce que nous n'éditons pas une variable, nous éviterons l'erreur out of memory .

Si cela ne fonctionne pas, reportez-vous à la réponse de @Aaron D, et si cela ne fonctionne pas, reportez-vous à la réponse de @kumar.

5
répondu Travis 2015-04-28 11:37:48

malheureusement, les exceptions JS sont gérées par le WebView et même les plugins natifs s'exécutent dans leur propre thread séparé, et ne crasheront pas le thread D'Application principal si vous soulevez une exception là (cela peut ne pas être vrai pour les applications hybrides). Donc, vous devez vous accrocher à l'activité principale et la faire jeter une Exception sur le fil principal.

sous-classe la classe CordovaActivity et outrepasser la méthode de messagerie du plugin:

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

Ecrire un plugin natif Android pour Phonegap comme selon cette réponse . Ce qu'il fait n'a pas d'importance, mais lorsque vous le signalez à partir du Javascript, vous devez utiliser l'id 'crashApp' qui doit être repris par votre méthode overridden dans la sous-classe CordovaActivity , et soulever l'Exception sur le fil principal.

. Ensuite, vous pouvez envoyer un message à votre plugin en utilisant cet id chaque fois que vous avez une exception Javascript en remplaçant la fonction window.onerror :

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

cela va jeter toutes les erreurs Javascript dans votre code Java où ils peuvent soulever la boîte de dialogue ANR (et vous pouvez passer des informations de débogage avec elle aussi).

3
répondu Aaron D 2017-05-23 12:33:29

vous pouvez faire planter votre application cordova/ phonegap en retirant les permissions du fichier AndroindManifest.xml mais en les utilisant toujours à l'intérieur de l'application, ce genre d'exceptions plante principalement votre application.

veuillez noter que (selon la structure de votre projet) en modifiant le fichier AndroindManifest.xml lui-même, il peut être régénéré et revenir à son état correct donc vous allez avoir besoin de supprimer les lignes de permission et puis de changer le fichier Androind.json dans le plugins dossier befor build, de manière appropriée pour faire vos changements prendre effet.

j'ai testé ce procédé et il fonctionne certainement! : D

espérons que cela aide, mim ;)

2
répondu Mim Armand 2015-04-26 21:50:40
  1. " essayez de télécharger tout fichier de plus de 100 Mo(mon application s'est coincée dans les androïdes bas de gamme). On peut même faire ça en boucle.

  2. utilisez une toile et déposez des figures 3D au hasard.

  3. application un message d'alerte dans une boucle de 1000.

1
répondu Vishnuraj 2015-02-11 11:14:21

je crois fermement que les boucles infinies ne fonctionneront pas dans ce cas. Lorsque vous l'utilisez avec PhoneGap, javascript n'est qu'un langage de script (sûr) qui ne peut générer d'exceptions pilotées par le système.

la meilleure méthode est d'exécuter certains codes natifs (codes problématiques) à l'aide d'un autre plugin PhoneGap. Par exemple, vous pouvez faire la division par zéro dans les codes objectifs-c et java native.

1
répondu filipvkovic 2015-04-27 18:55:24

généralement un arrêt dans l'exécution, intentionnel ou non, peut amener android à penser que l'application s'est écrasé. Essayez d'emballer votre code dans quelque chose comme setTimeout(function() { your code }, 60000) pour retarder l'exécution d'une minute.

ou, essayez de faire une demande ajax qui va time out.

0
répondu mduleone 2015-02-15 21:42:44

comment faire planter mon application en faisant une exception dans le niveau javascript ?

vous ne pouvez pas gérer les erreurs js qui provoquent le message" malheureusement, l'application s'est arrêtée", car elles n'existent pas et ne sont pas liées à javascript mais à Webview/plugin.

si vous voyez ce genre de message après un appel js, alors il vient de l'implémentation javascript de la vue web, alias Chrome ou natif du plugin partie. Javascript est bloqué et ne devrait pas produire de tels comportements.

0
répondu n00dl3 2015-04-27 10:23:43

Vous pouvez essayer de faire une boucle infini progressivement ajoutant une chaîne que l'application démarre:

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

ça fera l'affaire.

-1
répondu Cesar 2015-02-08 22:29:47