如何使我的phonegap android应用程序崩溃

how to make my phonegap android app crash?

本文关键字:应用程序 崩溃 android phonegap 何使 我的      更新时间:2023-09-26

我正在为phonegap安卓应用程序开发一个崩溃报告插件。为了测试的目的,我必须使我的应用程序崩溃&"不幸的是,应用程序已停止"窗口必须被调用。当我在javascript中发生未处理的异常时,应用程序不会崩溃。相反,它显示的是同一个屏幕。我通过在javascript&等了大约1个小时,应用程序仍然没有崩溃。phonegap库是否默认处理异常?如何通过在javascript级别中异常来使我的应用程序崩溃?

我尝试了下面的代码,在"CordovaActivity"类中添加了一个java方法来生成崩溃。

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

当我从java(从活动类中的"onCreate")调用此方法时,应用程序正在崩溃。但是,当我使用插件从javascript中调用相同的方法时,应用程序不会崩溃。我希望我的应用程序通过从javascript调用/调用一些函数而崩溃。

按下菜单按钮崩溃:

您不能通过插件或javascript调用使应用程序崩溃,因为异常是在内部处理的。如果你想让应用程序在安卓系统中崩溃,你可以在安卓平台中编辑CordovaActivity.java。更改CreateOptions菜单,如图所示:

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

按下菜单按钮,应用程序将崩溃&将显示"不幸的是,应用程序已停止"窗口。

通过从Javascript调用一些本机函数而崩溃:

为Phonegap编写一个Android原生插件。参考http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins用于插件创建。在execute方法内部引发异常。这将在父层中处理(这就是为什么你可以在控制台中看到关于崩溃的日志),因此请进行以下更改以使应用程序崩溃。(这两个类都属于org.apache.cordova包)

  • 删除pluginManager类的execHelper方法中的catch (Exception e){}
  • 删除ExposedJsApi类的exec方法中的catch (Throwable e) {}块。

    有了这个更改,我可以从javascript调用中崩溃应用程序。

如果应用程序像网页一样运行,无限循环可能需要一些时间才能导致崩溃,但应该可以工作。只需记住在测试后将其移除即可。因为它会导致异常,并使程序超时,所以如果在其中使用了可能有害的东西,则应该正确调用崩溃

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

因为我们没有编辑变量,所以我们将防止out of memory错误。

如果这不起作用,请参考@Aaron D的答案;如果这不奏效,请参考@cumar的答案。

不幸的是,JS异常由WebView处理,甚至本地插件都在它们自己的独立线程中运行,如果在那里引发异常,则不会使主应用程序线程崩溃(对于混合应用程序可能不是这样)。因此,您需要挂接到主活动,并使其在主线程上引发异常。

子类CordovaActivity类并覆盖插件消息传递方法:

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

根据这个答案为Phonegap编写一个Android原生插件。它的作用并不重要,但当您从Javascript发送消息时,您应该使用id"crashApp",该id应该由CordovaActivity子类中的重写方法获取,并在主线程上引发Exception。

然后,只要出现Javascript异常,您就可以通过重写window.onerror函数来使用此id向插件发送消息:

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

这将把所有Javascript错误都扔到Java代码中,它们可以引发ANR对话框(您也可以用它传递调试信息)。

  1. 尝试下载任何超过100MB的文件(我的应用程序被低端机器人卡住了)。你甚至可以在循环中做到这一点。

  2. 使用画布并放置一些随机的三维图形。

  3. 应用程序以1000为一个循环发送警报消息。

您可以通过从AndroindManifest.xml文件中删除权限,但仍在应用程序中使用权限,使您的cordova/phonegap应用程序崩溃,这类异常大多会使您的应用程序崩溃。

请注意(根据您的项目结构)修改AndroindManifest.xml文件本身,它可能会重新生成并更改回正确的状态,因此您需要删除权限行,然后在生成之前更改plugins文件夹中的Androind.json文件,以使您的更改生效。

我测试了这个过程,它绝对有效!:D

希望能有所帮助,mim;)

我坚信无限循环在这种情况下不起作用。当您将其与PhoneGap一起使用时,javascript只是一种(安全的)脚本语言,不能生成系统驱动的异常。

最好的方法是在另一个PhoneGap插件的帮助下运行一些本地代码(有问题的代码)。例如,您可以在objective-c和java本地代码中进行除以零。

通常,无论是否有意,执行中的暂停都会导致android认为应用程序已经崩溃。尝试用类似setTimeout(function() { your code }, 60000)的东西包装代码,将执行延迟一分钟。

或者,尝试发出一个将超时的ajax请求。

如何通过在javascript级别中异常来使我的应用程序崩溃?

您无法处理导致"不幸的是,应用程序已停止"消息的js错误,因为它们不存在,并且与javascript无关,而是与Webview/plugin相关。

如果你在js调用后看到这种消息,那么它来自web视图的javascript实现,也就是Chrome的javascript实现或插件的本地部分。Javascript是沙盒的,不应该产生这样的行为。

您可以尝试在应用程序启动时进行无限循环,递增地附加字符串:

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

这就行了。