簡體   English   中英

如何使我的phonegap Android應用程序崩潰?

[英]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包)

  • 刪除pluginManager類的execHelper方法中的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文件本身,它可能會重新生成並更改回正確的狀態,因此您需要刪除權限行,然后更改pluginsAndroind.json文件文件夾befor build,適當地使您的更改生效。

我測試了這個過程,它絕對有效! :d

希望它有所幫助,模仿;)

  1. 嘗試下載超過100MB的任何文件(我的應用程序卡在低端機器人)。 你甚至可以在循環中做到這一點。

  2. 使用畫布並刪除一些隨機的3d數字。

  3. 在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM