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

Javascript 如何使我的phonegap android应用程序崩溃?,javascript,cordova,Javascript,Cordova,我正在为phonegap android应用程序开发一个crash reporter插件。出于测试目的,我必须使我的应用程序崩溃&“不幸的是,应用程序已停止”窗口必须被调用。当我在javascript中出现未处理的异常时,应用程序并没有崩溃。相反,它显示相同的屏幕。我通过在javascript中执行一些无限循环使应用程序屏幕停止响应用户输入&等待了大约1小时,但应用程序没有崩溃。默认情况下,phonegap库是否处理异常?如何通过在javascript级别创建异常使我的应用程序崩溃 我尝试了下面

我正在为phonegap android应用程序开发一个crash reporter插件。出于测试目的,我必须使我的应用程序崩溃&“不幸的是,应用程序已停止”窗口必须被调用。当我在javascript中出现未处理的异常时,应用程序并没有崩溃。相反,它显示相同的屏幕。我通过在javascript中执行一些无限循环使应用程序屏幕停止响应用户输入&等待了大约1小时,但应用程序没有崩溃。默认情况下,phonegap库是否处理异常?如何通过在javascript级别创建异常使我的应用程序崩溃

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

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

当我从java(从activity类中的“onCreate”调用此方法时,应用程序正在崩溃。但是当我使用插件从javascript调用相同的方法时,应用程序并没有崩溃。我希望我的应用程序通过调用javascript中的某些函数来崩溃

您可以尝试在应用程序启动时以增量方式执行无限循环,追加字符串:

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

  • 尝试下载任何超过100MB的文件(我的应用程序被低端androids卡住了)。 你甚至可以在循环中这样做

  • 使用画布并放置一些随机的3d图形

  • 在1000个循环中应用警报消息


  • 通常情况下,执行过程中的停顿,无论是有意还是无意,都会导致android认为应用程序已经崩溃。尝试使用类似于
    setTimeout(function(){your code},60000)
    的格式包装代码,以将执行延迟一分钟


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

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

    while(true){ eval("9.99999e+5000 / Infinity"); }
    
    因为我们没有编辑变量,所以我们将防止
    内存不足
    错误


    如果这不起作用,请参考@Aaron D的答案,如果这不起作用,请参考@kumar的答案。

    不幸的是,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“crashap”,该id应该由您在
    CordovaActivity
    子类中的重写方法获取,并在主线程上引发异常

    。然后,只要出现Javascript异常,您就可以使用此id通过覆盖
    窗口向插件发送消息。onerror
    函数:

    window.onerror = function myFunction(errorMsg, url, lineNumber) { 
    /* call Android native function to throw Exception */ ; 
    return false; }
    
    这将把所有Javascript错误扔到Java代码中,它们可以在其中引发ANR对话框(您也可以通过它传递调试信息)。

    按菜单按钮崩溃:

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        this.postMessage("onCreateOptionsMenu", menu);
        throw new RuntimeException();
    } 
    
    菜单按钮应用程序将崩溃&“不幸的是,应用程序已停止”窗口将显示

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

    为Phonegap编写一个Android本机插件。请参阅插件创建。在execute方法内引发异常。这将在父层中处理(这就是为什么您可以在控制台中看到有关崩溃的日志),因此请执行以下更改以使应用程序崩溃(这两个类都属于org.apache.cordova包)

    • 移除pluginManager类的execHelper方法中的
      catch(异常e){}
    • 移除ExposedJsApi类的exec方法中的
      catch(Throwable e){}

      通过此更改,我能够从javascript调用中崩溃应用程序


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

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

    我测试了这个过程,它确实有效!:D

    希望有帮助,mim;)

    如何通过在javascript级别创建异常使我的应用程序崩溃

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


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

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

    最好的方法是在另一个PhoneGap插件的帮助下运行一些本机代码(有问题的代码)。考试