Сбои Android в TextView с IndexOutOfBoundsException и без следов пользовательского кода - PullRequest
0 голосов
/ 21 сентября 2019

Мое приложение Android аварийно завершает работу в TextView на устройстве под управлением Android9.Это происходит во время проверки параметров в SpannableStringBuilder.checkRange.В моем приложении довольно много объектов TextView, и неясно, какой именно вызвал проблему и почему, поскольку в трассировке стека не было предоставлено никакого пользовательского кода.

Это очень редкий сбой иЯ не могу воспроизвести его, поэтому использование отладчика не вариант.Play Store сообщает следующее устройство, сборку и версию для этой аварии:

Samsung Galaxy S10+ (beyond2q), Android 9 

Я декомпилировал SpannableStringBuilder.checkRange, и он выглядит следующим образом со строкой # 1326, указывающей на инструкцию throw при последнем условии:

start < 0 || end < 0

SpannableStringBuilder # checkRange code:

private void checkRange(final String operation, int start, int end) {
    if (end < start) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " has end before start");
    }

    int len = length();

    if (start > len || end > len) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " ends beyond length " + len);
    }

    if (start < 0 || end < 0) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " starts before 0");
    }
}

У меня есть два вопроса по этому поводу:

  1. Есть ли способ определить место в пользовательском коде, где произошел сбой?
  2. Есть ли способ исправить это на уровне приложения или это проблема платформы Android, требующая исправления системы?

Трассировка стека:

    java.lang.IndexOutOfBoundsException: 
      at android.text.SpannableStringBuilder.checkRange (SpannableStringBuilder.java:1326)
      at android.text.SpannableStringBuilder.setSpan (SpannableStringBuilder.java:682)
      at android.text.SpannableStringBuilder.setSpan (SpannableStringBuilder.java:674)
      at android.text.method.ArrowKeyMovementMethod.onTouchEvent (ArrowKeyMovementMethod.java:255)
      at android.widget.TextView.onTouchEvent (TextView.java:11355)
      at android.view.View.dispatchTouchEvent (View.java:13484)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3222)
      at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:2845)
      at com.android.internal.policy.DecorView.superDispatchTouchEvent (DecorView.java:697)
      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent (PhoneWindow.java:1879)
      at android.app.Activity.dispatchTouchEvent (Activity.java:3487)
      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent (WindowCallbackWrapper.java:69)
      at com.android.internal.policy.DecorView.dispatchTouchEvent (DecorView.java:655)
      at android.view.View.dispatchPointerEvent (View.java:13732)
      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent (ViewRootImpl.java:6119)
      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:5897)
      at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5346)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5399)
      at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5365)
      at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:5524)
      at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:5581)
      at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:5346)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:5399)
      at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:5365)
      at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$InputStage.deliver 
(ViewRootImpl.java:5346)
      at android.view.ViewRootImpl.deliverInputEvent (ViewRootImpl.java:8408)
      at android.view.ViewRootImpl.doProcessInputEvents (ViewRootImpl.java:8341)
      at android.view.ViewRootImpl.enqueueInputEvent (ViewRootImpl.java:8294)
      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent (ViewRootImpl.java:8523)
      at android.view.InputEventReceiver.dispatchInputEvent (InputEventReceiver.java:198)
      at android.os.MessageQueue.nativePollOnce (MessageQueue.java)
      at android.os.MessageQueue.next (MessageQueue.java:326)
      at android.os.Looper.loop (Looper.java:181)
      at android.app.ActivityThread.main (ActivityThread.java:7037)
      at java.lang.reflect.Method.invoke (Method.java)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
      at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)
...