Android: typing with Bold, Italic, Underline or Strikethrough active crashes R8 release builds (NoSuchMethodException on span constructor)

Chiusa
#839 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 4 giorni

@Junveloper ci sta già lavorando.

Dal 23/10/2026.

  • #840 di @Junveloper — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
android, kotlin, react-native
Ambito
mobile

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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
  1. In apps/example/android/app/build.gradle, set enableProguardInReleaseBuilds = true.
  2. Build and install a release build: cd apps/example/android && ./gradlew :app:assembleRelease, then adb install -r app/build/outputs/apk/release/app-release.apk.
  3. Tap the input and type a few characters.
  4. Tap B in the toolbar, then type one more character.
  5. The app crashes with the NoSuchMethodException above. 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)

Lingua principale
C
Stelle
1.4k
Fork
76
Merge medio
3g 10h
PR unite (30g)
23

Preparare l'ambiente

  • Nessun Dockerfile né file Docker Compose
  • Ha un modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di software-mansion/react-native-enriched-html

Tutte le issue di software-mansion/react-native-enriched-html

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.