堆栈跟踪:
Fatal Exception: java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 0
at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
at java.util.Objects.checkIndex(Objects.java:359)
at java.util.ArrayList.get(ArrayList.java:434)
at android.view.ViewGroup.getAndVerifyPreorderedView(ViewGroup.java:3993)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7689)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at android.view.ViewGroup.gatherTransparentRegion(ViewGroup.java:7691)
at com.android.internal.policy.DecorView.gatherTransparentRegion(DecorView.java:611)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4539)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3288)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:11344)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1689)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1698)
at android.view.Choreographer.doCallbacks(Choreographer.java:1153)
at android.view.Choreographer.doFrame(Choreographer.java:1079)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1646)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:8919)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
我在我的 React Native 应用程序中遇到了生产崩溃。 到目前为止还无法重现这个。
这是我的发现 如果 React Native 视图层次结构未完全呈现,或者存在竞争条件导致辅助功能服务在视图准备好之前查询视图,则可能会发生崩溃。
崩溃表明 ViewGroup 正在尝试访问不存在索引处的子视图信息。如果在未验证索引是否在范围内的情况下访问视图的子视图,则可能会发生这种情况。
当 ViewGroup 迭代其子视图时,视图层次结构可能会被修改(例如,添加/删除视图),从而导致子视图列表不一致。
调用此方法时视图列表可能被清除或未正确填充,从而导致尝试访问不存在的视图。
这些都是非常普遍的发现。我还无法重现这个
我发现了一个可能导致此崩溃的场景并设法重现它。我的场景是有一个可以上下滚动的视频和一个直播间。当您截图并触发滚动截图功能,同时向上或向下滚动直播间时,可能会导致此崩溃。也许系统在截图时,会调用“gatherTransparentRegion”方法将截图信息拼接在一起,从而触发此问题。但本质上,我认为系统保护还没有做好。当然,我不能排除中间的某些 ViewGroup(例如 RecyclerView)可能存在某些错误。可能是主线程调用时对浏览量的操作导致了这个问题。升级到 AndroidX 可能可以解决这个问题。我的解决方案是重写 RecyclerView 的“gatherTransparentRegion”方法,并添加一个 try-catch 块进行保护。