如何让我的 phonegap android 应用程序崩溃?
how to make my phonegap android app crash?
我正在为 phonegap android 应用程序开发崩溃报告器插件。出于测试目的,我必须让我的应用程序崩溃并且必须调用 "Unfortunately, application has stopped" window。当我在 java 脚本中产生未处理的异常时,应用程序没有崩溃。相反,它显示相同的屏幕。我通过在 java 脚本中执行一些无限循环让应用程序屏幕停止响应用户输入并等待了大约 1 小时,应用程序仍然没有崩溃。默认情况下 phonegap 库是否处理异常?如何通过在 java 脚本级别创建异常来使我的应用程序崩溃?
我尝试了下面的代码,在'CordovaActivity' class 中添加了一个java 方法来生成崩溃。
public static void generateCrash()
{
int a = 0;
int b = 10;
int c = b/a ;
}
当我从 java(从 activity class 中的 'onCreate' 调用此方法时,应用程序崩溃了。但是当我使用插件从 java 脚本调用相同的方法时,应用程序没有崩溃。我希望我的应用程序因 calling/invoking java 脚本中的某些函数而崩溃。
您可以尝试做一个无限循环,在应用启动时递增地附加一个字符串:
onDeviceReady: function() {
var test = "test";
while (true) {
test += "--------------------";
console.log(test);
}
},
这样就可以了。
尝试下载超过 100MB 的任何文件(我的应用程序卡在低端机器人中)。
您甚至可以循环执行此操作。
使用 canvas 并放置一些随机的 3d 图形。
app 循环 1000 条警告消息。
通常有意或无意地停止执行会导致 android 认为应用程序已崩溃。尝试将您的代码包装在类似 setTimeout(function() { your code }, 60000)
的内容中以延迟执行一分钟。
或者,尝试发出一个会超时的 ajax 请求。
如果某个应用 运行 喜欢一个网页,无限循环可能需要一些时间才能导致崩溃,但应该可以。请记住在测试后将其删除。因为它会导致异常,并使程序超时,所以如果其中使用了可能有害的东西,应该正确调用崩溃。做这样的事情:
while(true){ eval("9.99999e+5000 / Infinity"); }
因为我们没有编辑变量,所以我们将防止 out of memory
错误。
如果不行,请参考@Aaron D 的回答,如果不行,请参考@kumar 的回答。
不幸的是,JS 异常由 WebView 甚至本机插件 运行 在它们自己的单独线程中处理,如果您在那里引发异常,则不会使主应用程序线程崩溃(这可能不适用于混合应用程序)。所以你需要挂接到主线程 activity 并使其在主线程上抛出异常。
Subclass CordovaActivity
class 并覆盖插件消息传递方法:
@Override
public Object onMessage(String id, Object data) {
if ("crashApp".equals(id)) {
throw new Exception();
}
super(id, data);
}
为 Phonegap as per this answer 编写 Android 本机插件。它做什么并不重要,但是当你从 Java 脚本向它发送消息时,你应该使用 id 'crashApp' ,它应该由你在 CordovaActivity
subclass,并在主线程上引发异常。
。然后,只要您有 Java 脚本异常,您就可以通过覆盖 window.onerror
函数来使用此 ID 向您的插件发送消息:
window.onerror = function myFunction(errorMsg, url, lineNumber) {
/* call Android native function to throw Exception */ ;
return false; }
这会将所有 Java 脚本错误放入您的 Java 代码中,它们可以在其中引发 ANR 对话框(您也可以通过它传递调试信息)。
按菜单按钮导致崩溃:
您不能通过插件或 javascript 调用使应用程序崩溃,因为异常是在内部处理的。如果你想让应用程序在 android 中崩溃,你可以在 Android 平台中编辑 CordovaActivity.java。如图所示更改 onCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.postMessage("onCreateOptionsMenu", menu);
throw new RuntimeException();
}
按 菜单按钮 应用程序将崩溃并显示 "Unfortunately, application has stopped" window。
从 Javascript 调用某些本机函数导致崩溃:
为 Phonegap 编写 Android 本机插件。参考 http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins 创建插件。在 execute 方法中抛出异常。这将在父层处理(这就是为什么您可以在控制台中看到有关崩溃的日志),因此请进行以下更改以使应用程序 crash。(classes 属于 org.apache.cordova 包)
- 删除 execHelper 方法 pluginManager 中的
catch (Exception e){}
块 classs.
删除 exec 方法中的 catch (Throwable e) {}
块 ExposedJsApi class.
通过此更改,我可以通过 javascript 调用使应用程序崩溃。
您可以通过从 AndroindManifest.xml
文件中删除权限但仍然在应用程序中使用它们来使您的 cordova/phonegap 应用程序崩溃,这些异常通常会使您的应用程序崩溃。
请注意(取决于您的项目结构)修改 AndroindManifest.xml
文件本身,它可能会重新生成并变回正确的状态,因此您需要删除权限行,然后更改构建前 plugins
文件夹中的 Androind.json
文件,适当地使您的更改生效。
我测试了这个过程,它确实有效! :D
希望对你有帮助,我 ;)
how I can make my app crash by making exception in javascript level ?
您无法处理导致 "Unfortunately, application has stopped" 消息的 js 错误,因为它们不存在并且与 javascript 无关,而是 Webview/plugin-related.
如果您在 js 调用后看到这种消息,那么它来自 Web 视图的 javascript 实现,也就是 Chrome 的一个或插件的本机部分。 Javascript 已被沙盒化,不应产生此类行为。
我坚信无限循环在这种情况下不起作用。当您将它与 PhoneGap 一起使用时,javascript 只是一种(安全的)脚本语言,无法生成系统驱动的异常。
最好的方法是在另一个PhoneGap插件的帮助下运行一些本地代码(有问题的代码)。例如,您可以在 objective-c 和 java 本机代码中除以零。
我正在为 phonegap android 应用程序开发崩溃报告器插件。出于测试目的,我必须让我的应用程序崩溃并且必须调用 "Unfortunately, application has stopped" window。当我在 java 脚本中产生未处理的异常时,应用程序没有崩溃。相反,它显示相同的屏幕。我通过在 java 脚本中执行一些无限循环让应用程序屏幕停止响应用户输入并等待了大约 1 小时,应用程序仍然没有崩溃。默认情况下 phonegap 库是否处理异常?如何通过在 java 脚本级别创建异常来使我的应用程序崩溃?
我尝试了下面的代码,在'CordovaActivity' class 中添加了一个java 方法来生成崩溃。
public static void generateCrash()
{
int a = 0;
int b = 10;
int c = b/a ;
}
当我从 java(从 activity class 中的 'onCreate' 调用此方法时,应用程序崩溃了。但是当我使用插件从 java 脚本调用相同的方法时,应用程序没有崩溃。我希望我的应用程序因 calling/invoking java 脚本中的某些函数而崩溃。
您可以尝试做一个无限循环,在应用启动时递增地附加一个字符串:
onDeviceReady: function() {
var test = "test";
while (true) {
test += "--------------------";
console.log(test);
}
},
这样就可以了。
尝试下载超过 100MB 的任何文件(我的应用程序卡在低端机器人中)。 您甚至可以循环执行此操作。
使用 canvas 并放置一些随机的 3d 图形。
app 循环 1000 条警告消息。
通常有意或无意地停止执行会导致 android 认为应用程序已崩溃。尝试将您的代码包装在类似 setTimeout(function() { your code }, 60000)
的内容中以延迟执行一分钟。
或者,尝试发出一个会超时的 ajax 请求。
如果某个应用 运行 喜欢一个网页,无限循环可能需要一些时间才能导致崩溃,但应该可以。请记住在测试后将其删除。因为它会导致异常,并使程序超时,所以如果其中使用了可能有害的东西,应该正确调用崩溃。做这样的事情:
while(true){ eval("9.99999e+5000 / Infinity"); }
因为我们没有编辑变量,所以我们将防止 out of memory
错误。
如果不行,请参考@Aaron D 的回答,如果不行,请参考@kumar 的回答。
不幸的是,JS 异常由 WebView 甚至本机插件 运行 在它们自己的单独线程中处理,如果您在那里引发异常,则不会使主应用程序线程崩溃(这可能不适用于混合应用程序)。所以你需要挂接到主线程 activity 并使其在主线程上抛出异常。
Subclass CordovaActivity
class 并覆盖插件消息传递方法:
@Override
public Object onMessage(String id, Object data) {
if ("crashApp".equals(id)) {
throw new Exception();
}
super(id, data);
}
为 Phonegap as per this answer 编写 Android 本机插件。它做什么并不重要,但是当你从 Java 脚本向它发送消息时,你应该使用 id 'crashApp' ,它应该由你在 CordovaActivity
subclass,并在主线程上引发异常。
。然后,只要您有 Java 脚本异常,您就可以通过覆盖 window.onerror
函数来使用此 ID 向您的插件发送消息:
window.onerror = function myFunction(errorMsg, url, lineNumber) {
/* call Android native function to throw Exception */ ;
return false; }
这会将所有 Java 脚本错误放入您的 Java 代码中,它们可以在其中引发 ANR 对话框(您也可以通过它传递调试信息)。
按菜单按钮导致崩溃:
您不能通过插件或 javascript 调用使应用程序崩溃,因为异常是在内部处理的。如果你想让应用程序在 android 中崩溃,你可以在 Android 平台中编辑 CordovaActivity.java。如图所示更改 onCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.postMessage("onCreateOptionsMenu", menu);
throw new RuntimeException();
}
按 菜单按钮 应用程序将崩溃并显示 "Unfortunately, application has stopped" window。
从 Javascript 调用某些本机函数导致崩溃:
为 Phonegap 编写 Android 本机插件。参考 http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins 创建插件。在 execute 方法中抛出异常。这将在父层处理(这就是为什么您可以在控制台中看到有关崩溃的日志),因此请进行以下更改以使应用程序 crash。(classes 属于 org.apache.cordova 包)
- 删除 execHelper 方法 pluginManager 中的
catch (Exception e){}
块 classs. 删除 exec 方法中的
catch (Throwable e) {}
块 ExposedJsApi class.通过此更改,我可以通过 javascript 调用使应用程序崩溃。
您可以通过从 AndroindManifest.xml
文件中删除权限但仍然在应用程序中使用它们来使您的 cordova/phonegap 应用程序崩溃,这些异常通常会使您的应用程序崩溃。
请注意(取决于您的项目结构)修改 AndroindManifest.xml
文件本身,它可能会重新生成并变回正确的状态,因此您需要删除权限行,然后更改构建前 plugins
文件夹中的 Androind.json
文件,适当地使您的更改生效。
我测试了这个过程,它确实有效! :D
希望对你有帮助,我 ;)
how I can make my app crash by making exception in javascript level ?
您无法处理导致 "Unfortunately, application has stopped" 消息的 js 错误,因为它们不存在并且与 javascript 无关,而是 Webview/plugin-related.
如果您在 js 调用后看到这种消息,那么它来自 Web 视图的 javascript 实现,也就是 Chrome 的一个或插件的本机部分。 Javascript 已被沙盒化,不应产生此类行为。
我坚信无限循环在这种情况下不起作用。当您将它与 PhoneGap 一起使用时,javascript 只是一种(安全的)脚本语言,无法生成系统驱动的异常。
最好的方法是在另一个PhoneGap插件的帮助下运行一些本地代码(有问题的代码)。例如,您可以在 objective-c 和 java 本机代码中除以零。