Bug in Android 8 -- DynamicLayout.getBlockIndex ArrayIndexOutOfBoundsException

Aqua Mail邮件应用在运行Android 8.0的设备上出现崩溃,主要涉及EditText组件。堆栈跟踪显示错误源于DynamicLayout类的getBlockIndex方法,可能为Android 8.0的新问题。用户报告该问题在使用键盘建议词或滑动输入时发生,但不影响首单词。讨论中提到了可能的解决方案和Google Issue Tracker上的相关bug信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Crash in EditText - new in 8.0 


We're seeing crashes in our email app (called Aqua Mail), the affected devices are all running 8.0 (Pixel XL, Nexus 6p). There is a good number of them.

The stack trace is below. I believe this is a new regression (bug) in 8.0.

One user contacted me and wrote this:

> A couple of days ago, Aqua Mail started to crash when composing or
> replying to an email under the following circumstances:
>
> 1) Selecting one of the suggested next words from my keyboard, or
> 2) Using swipe to type, but never on the first word.
>
> This had not occurred prior to a couple of days ago, and it doesn't
> appear either the Google keyboard app nor Aqua Mail app had been
> updated immediately prior to this occurring.

He's right about our app's updates - our latest was a month ago (at this time).

java.lang.ArrayIndexOutOfBoundsException: 
  at android.text.DynamicLayout.getBlockIndex (DynamicLayout.java:646)
  at android.widget.Editor.drawHardwareAccelerated (Editor.java:1695)
  at android.widget.Editor.onDraw (Editor.java:1664)
  at android.widget.TextView.onDraw (TextView.java:6880)
  at android.view.View.draw (View.java:19119)
  at android.view.View.updateDisplayListIfDirty (View.java:18069)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4198)
  at android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4178)
  at android.view.View.updateDisplayListIfDirty (View.java:18028)
  at android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:643)
  at android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:649)
  at android.view.ThreadedRenderer.draw (ThreadedRenderer.java:757)
  at android.view.ViewRootImpl.draw (ViewRootImpl.java:2980)
  at android.view.ViewRootImpl.performDraw (ViewRootImpl.java:2794)
  at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2347)
  at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1386)
  at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:6733)
  at android.view.Choreographer$CallbackRecord.run (Choreographer.java:911)
  at android.view.Choreographer.doCallbacks (Choreographer.java:723)
  at android.view.Choreographer.doFrame (Choreographer.java:658)
  at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:897)
  at android.os.Handler.handleCallback (Handler.java:789)
  at android.os.Handler.dispatchMessage (Handler.java:98)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6541)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)

  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)


讨论过程略过。

解决方法在这儿:

st...@scruff.com <st...@scruff.com> #11Feb 14, 2018 09:20AM 
You can temporarily prevent the crash by disabling hardware acceleration on the view:

editText.setLayerType(View.LAYER_TYPE_SOFTWARE, null);


------- 点击查看bug信息 (https://issuetracker.google.com/issues/67102093)


我在做富文本编辑器的时候遇到的这个问题,Android 8上发生的。查了很久发现是Android 8的一个bug。

(贴到这儿方便国内可以搜索到)

我的富文本编辑器在这儿: Android Rich text Editor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值