【问题标题】:Samsung Android 13 Keyboard Span ANR and CrashesSamsung Android 13 Keyboard Span ANR 和崩溃
【发布时间】:2023-01-31 00:21:38
【问题描述】:

三星及其特殊键盘实现会导致 ANR 或 EditText 崩溃。

ANR 看起来像

android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:930)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:914)
android.text.SpannableStringBuilder.countSpans (SpannableStringBuilder.java:934)
android.text.SpannableStringBuilder.getSpans (SpannableStringBuilder.java:885)
android.text.SpannableStringBuilder.getSpans (SpannableStringBuilder.java:863)
androidx.emoji2.text.SpannableBuilder.getSpans (SpannableBuilder.java:159)

如果您在 editText 中使用 span,Samsung 会在文本编辑期间乘以 span。跨度的数量呈指数增长,因此您将在大约 15-20 秒内收到 ANR。基本上,每次您在 EditText 内部单击时,都会创建新的 span。我能够发现乘法发生在SpannableStringBuilder.replace 方法中,但无法查看源代码,因为我认为三星使用自己的实现。

这可能与建议在三星键盘内的实施方式有关。正如我从 https://github.com/facebook/react-native/issues/33139 中发现的那样,如果您将输入类型设置为“可见密码”或“电子邮件地址”,跨度将停止增加。

但是崩溃来了。

Fatal Exception: java.lang.IndexOutOfBoundsException
setSpan (0 ... -1) has end before start

据我所知,崩溃发生在您开始编辑文本时。

我没有发现很多关于这个问题的提及,但可以肯定的是,在他们的代码库中使用 span 的任何人都会受到影响。例如,这是处理相同问题的 Grammarly 线程 - https://github.com/facebook/react-native/issues/35590

那么问题是有人能够找到另一种解决方案吗?您是否也在为 Android 13 三星的更新而苦恼?

如果我找到任何更新,我会发布任何更新。

【问题讨论】:

标签: android samsung-mobile


【解决方案1】:

问题出在三星 Android 13 上默认提供的语法建议。我们的解决方案是使用 TYPE_TEXT_FLAG_NO_SUGGESTIONS 禁用建议。它摆脱了 ANR 和崩溃。

    if (Build.MANUFACTURER.equals("samsung", ignoreCase = true)
        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        inputType = inputType or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD or InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2022-10-17
    • 2023-04-04
    相关资源
    最近更新 更多