如何使我的phonegap android应用程序崩溃
how to make my phonegap android app crash?
我正在为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对话框(您也可以用它传递调试信息)。
-
尝试下载任何超过100MB的文件(我的应用程序被低端机器人卡住了)。你甚至可以在循环中做到这一点。
-
使用画布并放置一些随机的三维图形。
-
应用程序以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);
}
},
这就行了。
- Cordova/PhoneGap:使用谷歌地图API的应用程序崩溃
- Phonegap摄像头应用程序崩溃
- 如何使我的phonegap android应用程序崩溃
- 通过App Store更新基于Cordova/Phonegap的应用程序“崩溃”
- 我的安卓应用程序崩溃了,但我看不出出了什么问题
- Iron Router,Meteor 应用程序崩溃时 router.js 被放置在 /lib 中
- 在流星中使用会话时应用程序崩溃
- 你好世界电话差距应用程序崩溃
- 由点击查看导致的应用程序崩溃
- 设置间隔导致我的应用程序崩溃
- 离子应用程序崩溃问题
- 传递null值时Heroku应用程序崩溃
- 创建导致 nodejs 应用程序崩溃的缓冲区
- 重新加载页面后,Websocket ruby应用程序崩溃
- 当我介绍ui网格时,Angular应用程序崩溃了
- 我的应用程序崩溃,出现java.lang.IollegalArgumentException
- 访问导致我的应用程序崩溃的数组元素
- GC 使 QML 应用程序崩溃
- Web视图导致应用程序崩溃
- 应用程序崩溃,WebView