Android: typing with Bold, Italic, Underline or Strikethrough active crashes R8 release builds (NoSuchMethodException on span constructor)
メンテナーはふだん 4 日以内に返信
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 35/100
調査の方向性
Start with InlineStyles.kt and ParagraphStyles to inspect the reflective span construction described in the report, then check the Android release configuration in apps/example/android/app/build.gradle. The report identifies a consumer ProGuard rule as the proposed fix, and linked pull request #840 is already open. Done means the relevant span constructors survive R8 minification and typing with inline styles no longer crashes in a release build.
索引モデルが issue の本文から書いたものです。
説明
Before submitting a new issue
- I tested using the latest version of the library, as the bug might be already fixed.
- I tested using a supported version of react native.
- I checked for possible duplicate issues, with possible answers.
Bug summary
In an Android release build with R8 enabled, typing while Bold, Italic, Underline or Strikethrough is active crashes the app. Retraced:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.NoSuchMethodException: xp.<init> [class pz]
at java.lang.Class.getConstructor0(Class.java:3385)
at java.lang.Class.getDeclaredConstructor(Class.java:3067)
at com.swmansion.enriched.textinput.styles.InlineStyles.setSpan(InlineStyles.kt:43)
at com.swmansion.enriched.textinput.styles.InlineStyles.afterTextChanged(InlineStyles.kt:127)
at com.swmansion.enriched.textinput.watchers.EnrichedTextWatcher.applyStyles(EnrichedTextWatcher.kt:77)
at com.swmansion.enriched.textinput.watchers.EnrichedTextWatcher.afterTextChanged(EnrichedTextWatcher.kt:72)
at android.widget.TextView.sendAfterTextChanged(TextView.java:12852)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:16566)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:579)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:509)
at android.view.inputmethod.BaseInputConnection.replaceTextInternal(BaseInputConnection.java:1026)
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:241)
xp is EnrichedInputBoldSpan and pz is HtmlStyle.
InlineStyles and ParagraphStyles create spans with type.getDeclaredConstructor(HtmlStyle::class.java).newInstance(view.htmlStyle). R8 can't see that reflective use. The only direct call to EnrichedInputBoldSpan(HtmlStyle) is in its own rebuildWithStyle, so R8 inlines the constructor there and removes it. The mapping shows <init> folded into rebuildWithStyle (-> c) instead of surviving as <init>:
com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan -> xp:
...
7:10:void com.swmansion.enriched.common.spans.EnrichedBoldSpan.<init>(com.swmansion.enriched.common.EnrichedStyle):11:11 -> c
7:10:void <init>(com.swmansion.enriched.textinput.styles.HtmlStyle):9 -> c
7:10:com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan rebuildWithStyle(com.swmansion.enriched.textinput.styles.HtmlStyle):13 -> c
In the example app, 4 of the 14 span classes with an (HtmlStyle) constructor lose it: Bold, Italic, Underline and Strikethrough. Which ones go depends on R8's inlining, so other apps can lose different ones.
The library ships no consumer ProGuard rules, and the example app builds with enableProguardInReleaseBuilds = false, so the library's own builds never run into this. We hit it in production in an Expo app (expo-build-properties with enableMinifyInReleaseBuilds: true): the app crashed while users typed in a chat composer.
Until this is fixed, apps can add the rule themselves, in proguard-rules.pro or expo-build-properties → android.extraProguardRules:
-keepclassmembers class com.swmansion.enriched.textinput.spans.** {
<init>(com.swmansion.enriched.textinput.styles.HtmlStyle);
}
I'll open a PR that ships this as a consumer rule.
Library version
1.1.1. Also reproduced on main at f35eb41.
Environment info
System:
OS: macOS 27.0.1
CPU: (11) arm64 Apple M3 Pro
Binaries:
Node:
version: 24.3.0
Yarn:
version: 4.13.0
SDKs:
Android SDK:
API Levels:
- "35"
- "36"
- "37"
IDEs:
Android Studio: 2024.2 AI-242.23726.103.2422.12816248
Languages:
Java:
version: 17.0.14
npmPackages:
"@react-native-community/cli":
installed: 20.2.0
react:
installed: 19.2.3
react-native:
installed: 0.87.0
Android:
hermesEnabled: true
newArchEnabled: true
Gradle 9.4.1. Device: Android emulator, API 36 (Pixel, arm64).
Steps to reproduce
- In
apps/example/android/app/build.gradle, setenableProguardInReleaseBuilds = true. - Build and install a release build:
cd apps/example/android && ./gradlew :app:assembleRelease, thenadb install -r app/build/outputs/apk/release/app-release.apk. - Tap the input and type a few characters.
- Tap B in the toolbar, then type one more character.
- The app crashes with the
NoSuchMethodExceptionabove. Italic, Underline and Strikethrough crash the same way.
Reproducible example repository
https://github.com/Junveloper/react-native-enriched-html/tree/repro/r8-span-constructors (this repository with step 1 applied)
- 主要言語
- C
- スター
- 1.4k
- フォーク
- 76
- 平均マージ
- 3日 10時間
- マージ済み PR(30日)
- 23
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
software-mansion/react-native-enriched-html のほかの issue
-
難易度 3/5 1〜2日 初心者へのやさしさ 70/100
software-mansion/react-native-enriched-html#855 · コメント 8 件 · リアクション 1 件 ·
メンテナーはふだん 4 日以内に返信
-
[Feature request] Vertical spacing (margins) for headings and lists in htmlStyle対応中かも @henrikra が 16 日前に担当しました。 オープンenhancement
難易度 4/5 3〜5日 初心者へのやさしさ 20/100
software-mansion/react-native-enriched-html#832 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 4 日以内に返信
-
[iOS] Tags not parsed on iOS below a certain string length対応中かも @hejsztynx が 24 日前に担当しました。 オープンbug
難易度 4/5 3〜5日 初心者へのやさしさ 42/100
software-mansion/react-native-enriched-html#811 · コメント 3 件 ·
メンテナーはふだん 4 日以内に返信
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 50/100
software-mansion/react-native-enriched-html#810 · コメント 1 件 ·
メンテナーはふだん 4 日以内に返信
-
enhancement
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
software-mansion/react-native-enriched-html#803 ·
メンテナーはふだん 4 日以内に返信
software-mansion/react-native-enriched-html の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 80/100
ly05010419/MacNativeGames#1897 ·
メンテナーはふだん 1 日以内に返信
-
area: metrics area: tracing contribfest enhancement good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
open-telemetry/opentelemetry-ebpf-instrumentation#4188 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
FujiNetWIFI/fujinet-firmware#2328 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
ycrash/yc-360-script#44 ·