我正在为phonegap android应用程序开发一个崩溃记者插件。出于测试目的,我必须使我的应用程序崩溃& "不幸的是,申请已停止"必须调用窗口。当我在javascript中制作未处理的异常时,应用程序不会崩溃。相反,它显示相同的屏幕。我通过在javascript&中执行一些无限循环使应用程序屏幕停止响应用户输入等了大约1个小时,仍然是应用程序没有崩溃。默认情况下,phonegap库是否处理异常?如何通过在javascript级别进行异常来使我的应用程序崩溃?
我尝试了下面的代码,添加了一个java方法来生成' CordovaActivity'类。
public static void generateCrash()
{
int a = 0;
int b = 10;
int c = b/a ;
}
当我从java(来自活动类中的' onCreate')调用此方法时,应用程序崩溃了。但是当我使用插件从javascript调用相同的方法时,应用程序不会崩溃。我希望我的应用程序通过调用/调用javascript中的某些函数来崩溃。
答案 0 :(得分:10)
按菜单按钮崩溃:
您无法通过插件或javascript调用使应用程序崩溃,因为异常是在内部处理的。如果你想在Android中使应用程序崩溃,你可以在Android平台上编辑CordovaActivity.java。更改onCreateOptionsMenu,如下所示:
@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包)
catch (Exception e){}
块。在 ExposedJsApi 类的 exec 方法中移除catch (Throwable e) {}
块。
通过此更改,我可以通过javascript调用使应用程序崩溃。
答案 1 :(得分:5)
如果应用程序像网页一样运行,无限循环可能需要一些时间才能导致崩溃,但应该可以正常运行。记得在测试后将其删除。因为它会导致异常并导致程序超时,所以如果在其中使用了可能有害的内容,则应该正确调用崩溃。做这样的事情:
while(true){ eval("9.99999e+5000 / Infinity"); }
因为我们没有编辑变量,所以我们会阻止out of memory
错误。
如果这不起作用,请参考@Aaron D的回答,如果这不起作用,请参阅@ kumar的回答。
答案 2 :(得分:3)
不幸的是,JS异常由WebView处理,甚至本机插件在它们自己的单独线程中运行,如果在那里引发异常,也不会使主应用程序线程崩溃(对于混合应用程序可能不是这样)。所以你需要挂钩主活动并导致它在主线程上抛出异常。
对CordovaActivity
类进行子类化并覆盖插件消息传递方法:
@Override
public Object onMessage(String id, Object data) {
if ("crashApp".equals(id)) {
throw new Exception();
}
super(id, data);
}
为Phonegap as per this answer编写Android原生插件。它的作用无关紧要,但是当您从Javascript中发送消息时,您应该使用id'crashApp',它应该被CordovaActivity
子类中的重写方法拾取,并在主线程上引发异常
。然后,只要您通过覆盖window.onerror
函数获得Javascript异常,就可以使用此ID向您的插件发送消息:
window.onerror = function myFunction(errorMsg, url, lineNumber) {
/* call Android native function to throw Exception */ ;
return false; }
这会将所有Javascript错误抛到Java代码中,在那里它们可以引发ANR对话框(您也可以通过它传递调试信息)。
答案 3 :(得分:2)
您可以通过删除AndroindManifest.xml
文件中的权限但仍然在应用程序中使用这些权限来使您的cordova / phonegap应用程序崩溃,这些异常通常会使您的应用程序崩溃。
请注意(取决于您的项目结构)修改AndroindManifest.xml
文件本身,它可能会重新生成并更改回正确的状态,因此您需要删除权限行,然后更改Androind.json
文件夹中的plugins
文件,以便您的更改生效。
我测试了这个过程,它确实有效! :d 强>
希望它有所帮助,mim;)
答案 4 :(得分:1)
尝试下载超过100MB的任何文件(我的应用程序卡在低端机器人中)。 你甚至可以在循环中做到这一点。
使用画布并删除一些随机的3d数字。
在1000循环中应用提醒消息。
答案 5 :(得分:1)
我坚信无限循环在这种情况下不会起作用。当您将其与PhoneGap一起使用时,javascript只是一种(安全)脚本语言,无法生成系统驱动的异常。
最好的方法是在另一个PhoneGap插件的帮助下运行一些本机代码(有问题的代码)。例如,您可以在objective-c和java本机代码中进行除零。
答案 6 :(得分:0)
通常停止执行,无论是否有意,都可能导致Android认为应用已崩溃。尝试将代码包装在setTimeout(function() { your code }, 60000)
之类的内容中,以便将执行延迟一分钟。
或者,尝试制作一个超时的ajax请求。
答案 7 :(得分:0)
如何通过在javascript级别进行异常来使我的应用程序崩溃?
你无法处理导致&#34的js错误;不幸的是,应用已停止"消息,因为它们不存在且与javascript无关,但与Webview /插件相关。
如果你在js通话后看到这种消息,那么它来自网络视图的javascript实现,AKA Chrome的一个或插件的本机部分。 Javascript是沙盒的,不应该产生这样的行为。
答案 8 :(得分:-1)
您可以尝试在应用程序启动时以递增方式附加字符串来执行无限循环:
onDeviceReady: function() {
var test = "test";
while (true) {
test += "--------------------";
console.log(test);
}
},
这样就可以了。