[英]how to make my phonegap android app crash?
我正在為phonegap android應用程序開發一個崩潰記者插件。 出於測試目的,我必須使我的應用程序崩潰並且“不幸的是,應用程序已停止”窗口必須被調用。 當我在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調用使應用程序崩潰,因為異常是在內部處理的。 如果你想在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調用中崩潰應用程序。
如果一個應用程序像網頁一樣運行,無限循環可能需要一些時間才能導致崩潰,但應該有效。 記得在測試后將其刪除。 因為它會導致異常並導致程序超時,所以如果在其中使用了可能有害的內容,則應該正確調用崩潰。 做這樣的事情:
while(true){ eval("9.99999e+5000 / Infinity"); }
因為我們沒有編輯變量,所以我們將防止out of memory
不足錯誤。
如果這不起作用,請參閱@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'crashApp',它應該被CordovaActivity
子類中的重寫方法拾取,並在主線程上引發Exception。
。 然后,只要您通過覆蓋window.onerror
函數獲得Javascript異常,就可以使用此id向您的插件發送消息:
window.onerror = function myFunction(errorMsg, url, lineNumber) {
/* call Android native function to throw Exception */ ;
return false; }
這會將所有Javascript錯誤拋到Java代碼中,在那里它們可以引發ANR對話框(您也可以使用它傳遞調試信息)。
您可以通過從AndroindManifest.xml
文件中刪除權限但仍在應用程序中使用它們來使您的cordova / phonegap應用程序崩潰,這些異常通常會使您的應用程序崩潰。
請注意(根據您的項目結構)修改AndroindManifest.xml
文件本身,它可能會重新生成並更改回正確的狀態,因此您需要刪除權限行,然后更改plugins
的Androind.json
文件文件夾befor build,適當地使您的更改生效。
我測試了這個過程,它絕對有效! :d
希望它有所幫助,模仿;)
嘗試下載超過100MB的任何文件(我的應用程序卡在低端機器人)。 你甚至可以在循環中做到這一點。
使用畫布並刪除一些隨機的3d數字。
在1000循環中應用警報消息。
我堅信無限循環在這種情況下不起作用。 當您將其與PhoneGap一起使用時,javascript只是一種(安全)腳本語言,無法生成系統驅動的異常。
最好的方法是在另一個PhoneGap插件的幫助下運行一些本機代碼(有問題的代碼)。 例如,您可以在objective-c和java本機代碼中進行除零。
通常停止執行,有意或無意,可能導致Android認為應用程序已崩潰。 嘗試將代碼包裝在類似setTimeout(function() { your code }, 60000)
以延遲執行一分鍾。
或者,嘗試制作一個超時的ajax請求。
如何通過在javascript級別進行異常來使我的應用程序崩潰?
您無法處理導致“遺憾,應用程序已停止”消息的js錯誤,因為它們不存在且與JavaScript無關,但與Webview /插件相關。
如果你在js調用之后看到這種消息,那么它來自web視圖的javascript實現,AKA Chrome的一個或插件的本機部分。 Javascript是沙盒,不應該產生這樣的行為。
您可以嘗試在應用啟動時以遞增方式附加字符串來執行無限循環:
onDeviceReady: function() {
var test = "test";
while (true) {
test += "--------------------";
console.log(test);
}
},
這樣就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.