Подтвердить что ты не робот

Как сделать крушение Android-телефона для Android-телефона?

Я разрабатываю плагин-репортер crash для приложений Android для Android. Для целей тестирования я должен сделать крах приложения, и окно "К сожалению, приложение остановилось" необходимо вызвать. Когда я делаю необработанное исключение в javascript, приложение не сбой. Вместо этого он показывает один и тот же экран. Я заставил экран приложения перестать отвечать на ввод пользователя, выполнив некоторый бесконечный цикл в javascript и ждал около 1 часа, но приложение не сбой. Является ли библиотека телефонной библиотеки по умолчанию обрабатывающей исключения? как я могу сделать свою ошибку приложения, сделав исключение на уровне javascript?

Я попробовал приведенный ниже код, добавил java-метод для генерации сбоя в классе "CordovaActivity".

public static void generateCrash()
   {
     int a = 0;
     int b = 10;
     int c = b/a ;
    }

Приложение сбой, когда я вызываю этот метод из java (из 'onCreate' в классе активности). Но когда я вызываю тот же метод из javascript с помощью плагина, приложение не сбой. Я хочу, чтобы мое приложение разбилось, вызвав/вызвав какую-то функцию из javascript.

4b9b3361

Ответ 1

Сбой нажатием кнопки меню:

Вы не можете сделать аварию приложения из вызова плагина или javascript, поскольку исключения обрабатываются внутренне. Если вы хотите сделать аварию приложения в android, вы можете редактировать CordovaActivity.java в платформе Android. Измените onCreateOptionsMenu как показано:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.postMessage("onCreateOptionsMenu", menu);
    throw new RuntimeException();
} 

Нажмите кнопку меню, и приложение выйдет из строя, и окно "К сожалению, приложение остановилось" будет отображаться.

Сбой при вызове некоторой встроенной функции из Javascript:

Создайте собственный плагин для Android для Phonegap. Обратитесь http://docs.phonegap.com/en/3.0.0/guide_platforms_android_plugin.md.html#Android%20Plugins к созданию плагина. Выбросить исключение из метода выполнения. Это будет обрабатываться в родительском слое (Thats, почему вы можете видеть журналы о сбое в консоли). Поэтому, пожалуйста, сделайте следующие изменения, чтобы сделать приложение crash. (Оба класса принадлежат org.apache. кордовой пакет)

  • Удалите блок catch (Exception e){} в execHelper из класса pluginManager.
  • Удалите блок catch (Throwable e) {} в exec методе класса ExposedJsApi.

    С этим изменением я могу свернуть приложение из javascript-вызова.

Ответ 2

Если приложение будет работать как веб-страница, бесконечный цикл может занять некоторое время, чтобы вызвать сбой, но он должен работать. Просто не забудьте удалить его после тестирования. Поскольку он вызывает исключение и время выхода из программы, аварийный сигнал должен быть правильно вызван, если в нем используется что-то опасное. Сделайте что-то вроде этого:

while(true){ eval("9.99999e+5000 / Infinity"); }

Поскольку мы не редактируем переменную, мы предотвратим ошибку out of memory.

Если это не работает, обратитесь к ответу @Aaron D, и если это не сработает, обратитесь к ответу @kumar.

Ответ 3

К сожалению, исключения JS обрабатываются WebView, и даже собственные плагины запускаются в их собственном отдельном потоке и не будут разбивать основной поток приложения, если вы создадите там исключение (это может быть неверно для гибридных приложений). Поэтому вам нужно подключиться к основному действию и заставить его выбросить исключение в основной поток.

Подкласс класса CordovaActivity и переопределить способ обмена сообщениями плагина:

@Override
public Object onMessage(String id, Object data) {
    if ("crashApp".equals(id)) {
        throw new Exception();
    }
    super(id, data);
}

Создайте собственный плагин для Android Phonegap в соответствии с этим ответом. То, что это делает, не имеет значения, но когда вы сообщаете об этом из Javascript, вы должны использовать id 'crashApp', который должен быть выбран вашим переопределенным методом в подклассе CordovaActivity и поднять Исключение в основном потоке.

. Затем вы можете сообщать свой плагин с использованием этого идентификатора всякий раз, когда у вас есть исключение Javascript, переопределяя функцию window.onerror:

window.onerror = function myFunction(errorMsg, url, lineNumber) { 
/* call Android native function to throw Exception */ ; 
return false; }

Это приведет ко всем ошибкам Javascript в ваш код Java, где они могут поднять диалоговое окно ANR (и вы также можете передать отладочную информацию).

Ответ 4

Вы можете сделать крах приложения cordova/phonegap, удалив разрешения из файла AndroindManifest.xml, но все еще используя их внутри приложения, такие исключения в основном приводят к краху вашего приложения.

обратите внимание, что (в зависимости от структуры вашего проекта), изменяя сам файл AndroindManifest.xml, он может быть восстановлен и вернуться в правильное состояние, поэтому вам нужно будет удалить строки разрешений, а затем изменить файл Androind.json в папке plugins для сборки, чтобы изменения вступили в силу.

Я тестировал этот процесс, и он определенно работает!: D

надеюсь, что это поможет, милый;)

Ответ 5

  • попробуйте загрузить любой файл больше, чем 100 МБ (мое приложение застряло в андроидах нижнего уровня). Вы даже можете сделать это в циклах.

  • Используйте холст и оставьте некоторые случайные 3d фигуры.

  • введите предупреждающее сообщение в цикле 1000.

Ответ 6

Я уверен, что бесконечные циклы в этом случае не будут работать. Когда вы используете его с PhoneGap, javascript - это только (безопасный) script язык, который не может генерировать исключения, управляемые системой.

Лучший способ - запустить некоторые собственные коды (проблемные коды) с помощью другого плагина PhoneGap. Например, вы можете сделать деление на ноль в objective-c и java родных кодах.

Ответ 7

Обычно остановка в исполнении, преднамеренная или нет, может привести к тому, что андроид подумает, что приложение разбилось. Попробуйте обернуть свой код чем-то вроде setTimeout(function() { your code }, 60000), чтобы отложить выполнение на минуту.

Или попробуйте сделать запрос ajax, который будет отключен.

Ответ 8

Как я могу сделать свое приложение аварийным путем, сделав исключение на уровне javascript?

Вы не можете обрабатывать js-ошибки, которые вызывают сообщение "К сожалению, приложение остановлено", потому что они не существуют и не связаны с javascript, а связаны с Webview/plugin.

Если вы видите это сообщение после js-вызова, то оно происходит из реализации javascript веб-представления, AKA Chrome или родной части плагина. Javascript изолирован и не должен создавать такое поведение.

Ответ 9

Вы можете попытаться выполнить цикл бесконечности, добавляя строку при запуске приложения:

onDeviceReady: function() {
    var test = "test";
    while (true) {
        test += "--------------------";
        console.log(test);
    }
},

Это сделает трюк.