Мое приложение 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");
}
}
У меня есть два вопроса по этому поводу:
- Есть ли способ определить место в пользовательском коде, где произошел сбой?
- Есть ли способ исправить это на уровне приложения или это проблема платформы 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)