You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅Android 8/8.1出现Editor.drawHardwareAccelerated崩溃问题求助

Android Oreo设备上EditText绘制时的ArrayIndexOutOfBoundsException问题

项目从Java全面迁移至Kotlin后出现异常,已花费数月排查仍未找到根源。本人在Android 8(Oreo)设备上无法复现该异常,但判断问题诱因是应用中的EditText组件。

异常信息

Firebase Crashlytics捕获的异常如下:

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException
length=9; index=-1
android.text.DynamicLayout.getBlockIndex (DynamicLayout.java:648)
android.widget.Editor.drawHardwareAccelerated (Editor.java:1703)
android.widget.Editor.onDraw (Editor.java:1672)
android.widget.TextView.onDraw (TextView.java:7686)
android.view.View.draw (View.java:19315)
android.view.View.updateDisplayListIfDirty (View.java:18232)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:4281)
android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:4261)
android.view.View.updateDisplayListIfDirty (View.java:18181)
android.view.ThreadedRenderer.updateViewTreeDisplayList (ThreadedRenderer.java:669)
android.view.ThreadedRenderer.updateRootDisplayList (ThreadedRenderer.java:675)
android.view.ThreadedRenderer.draw (ThreadedRenderer.java:783)
android.view.ViewRootImpl.draw (ViewRootImpl.java:3127)
android.view.ViewRootImpl.performDraw (ViewRootImpl.java:2936)
android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2474)
android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1456)
android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7072)
android.view.Choreographer$CallbackRecord.run (Choreographer.java:916)
android.view.Choreographer.doCallbacks (Choreographer.java:728)
android.view.Choreographer.doFrame (Choreographer.java:660)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:902)
android.os.Handler.handleCallback (Handler.java:790)
android.os.Handler.dispatchMessage (Handler.java:99)
android.os.Looper.loop (Looper.java:164)
android.app.ActivityThread.main (ActivityThread.java:6523)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:857)

对应EditText布局代码

<EditText
    android:id="@+id/txtcontent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:inputType="textMultiLine|textCapSentences"
    android:textColor="?attr/tilecontentcolor"
    android:minLines="7"
    android:gravity="top|start"
    android:hint="@string/write_here"
    android:textColorHint="?attr/tilecontentcolor"
    android:fontFamily="@font/lato_regular"
    android:textCursorDrawable="@drawable/cursor_color"
    android:background="@android:color/transparent"/>

已尝试的临时方案

搜索到使用LAYER_TYPE_SOFTWARE的方案,代码如下:

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O||Build.VERSION.SDK_INT ==Build.VERSION_CODES.O_MR1) {
    txtcontent.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
}

该方案能阻止异常发生,但当EditText内容达到一定长度后无法正常显示,这对日记类应用来说不可接受。

寻求有效解决思路,如需更多细节可提供。

内容的提问来源于stack exchange,提问作者jomin v george

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:54:05