Как заставить ACRA останавливать приложение, когда исключение не входит в основное действие?

Я хочу, чтобы мое приложение останавливалось, когда ACRA обнаруживает и сообщает о неперехваченном исключении — нормальное поведение ACRA. Это не работает, когда исключение происходит в действии, которое не является основным.

После борьбы с этим в моем реальном приложении я создал очень простое приложение, которое использует ACRA и позволяет мне вызвать исключение либо в основном действии, либо во втором, которое можно запустить из первого. Я тестирую с MinSDK 26. Приложение написано на Java и имеет достаточно кода только для создания этого теста.

Исключение в первом действии приводит к желаемому результату (как определено из logcat и экрана):

  1. При нажатии кнопки основное действие генерирует исключение
  2. ACRA перехватывает исключение:
  3. ACRA запускает очередной процесс подачи заявок
  4. первый процесс заканчивается
  5. второй процесс выполняет обработку ACRA
  6. второй процесс заканчивается

Однако повторный запуск, но за исключением второго действия (с первым все еще в стеке задач), приводит к:

  1. При нажатии кнопки основное действие запускает второе действие
  2. При нажатии кнопки второе действие генерирует исключение
  3. ACRA запускает очередной процесс подачи заявок
  4. Первый процесс заканчивается
  5. Процессы ACRA во втором процессе (также с использованием этой кодовой базы)
  6. тем временем Android запускает третий процесс - в этом проблема
  7. Второй процесс завершается
  8. Третий процесс отображает основной экран активности и ждет

Похоже, что происходит то, что Android обнаруживает, что в стеке осталась активность, и запускает новый процесс, чтобы перенести ее вперед.

Но ACRA должно остановить это.

Это проблема ACRA? В любом случае, есть идеи, как это предотвратить?

*ПРИМЕЧАНИЕ:

  1. В своих тестах я использую сенсорные события на нижней панели навигации для создания исключения деления на ноль.
  2. Порядок завершения ACRA и запуска третьего процесса, насколько я могу судить, не определен. Тоже, наверное, неактуально.
  3. Результаты теста получены из просмотра экрана и logcat. Важные события регистрируются с помощью класса Log.

Ниже приведен фрагмент основного действия, показывающий обработку кнопки и создание исключения. Второе действие аналогично.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Context context = this.getApplicationContext();
        setContentView(R.layout.activity_main);
        Log.i(MyApp.TAG, "MainActivity.onCreate() - pid:"+android.os.Process.myPid());
        mTextMessage = findViewById(R.id.message);
        BottomNavigationView navigation = findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener((item) -> {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    int i = 0;
                    Log.i(MyApp.TAG, "Throwing exception in main activity");
                    Log.i(MyApp.TAG, "This shouldn't show up" + 3 / i);
                    return true;
                case R.id.navigation_dashboard:
                    Log.i(MyApp.TAG, "Starting Activity2");
                    startActivity(new Intent(context, Activity2.class));
                    return true;
                case R.id.navigation_notifications:
                    mTextMessage.setText(R.string.title_notifications);
                    return true;
            }
            return false;
        });

person John Moore    schedule 29.01.2019    source источник
comment
Я текущий сопровождающий ACRA. Если вы поделитесь своим тестовым проектом, например. на Github, я проверю, является ли это ошибкой на стороне ACRA. github.com/ACRA/acra/issues   -  person F43nd1r    schedule 31.01.2019
comment
Спасибо. См.: github.com/crotalustigris/TestACRA.   -  person John Moore    schedule 01.02.2019


Ответы (1)


Это ошибка в ACRA, исправленная этим PR, который будет включен в следующий выпуск (5.3.0).

person F43nd1r    schedule 04.02.2019