Как сделать крушение 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.
Ответы
Ответ 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. кордовой пакет)
Ответ 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);
}
},
Это сделает трюк.