三星设备专属libicui18n.so(icu_75::RegexPattern::zap)崩溃问题求助
三星设备专属libicui18n.so(icu_75::RegexPattern::zap)崩溃问题求助
各位大佬好,最近我们的React Native安卓应用碰到了一个棘手的崩溃问题,折腾了一阵没头绪,特意来求助社区的大神们!
问题现象
我们的应用在三星设备上频繁出现原生崩溃,其他品牌(比如Oppo、一加)极少出现。崩溃信息来自Google Play Console的「Crashes & ANRs」模块,核心崩溃栈指向ICU库的Regex相关方法:
[libicui18n.so] icu_75::RegexPattern::zap() [libicui18n.so] icu_75::RegexMatcher::~RegexMatcher() [libicui18n.so] icu_72::RegexMatcher::~RegexMatcher() [libicui18n.so] icu_72::RegexPattern::zap() [libicui18n.so] icu_75::RegexMatcher::~RegexMatcher()
完整崩溃日志如下:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** pid: 0, tid: 14966 >>> digit.android <<< backtrace: #00 pc 0x00000000002236fc /apex/com.android.i18n/lib64/libicui18n.so (icu_75::RegexPattern::zap()+36) #01 pc 0x00000000002238a0 /apex/com.android.i18n/lib64/libicui18n.so (icu_75::RegexPattern::~RegexPattern()+20) #02 pc 0x0000000000011f28 /apex/com.android.i18n/lib64/libicu_jni.so (PatternNative_free(void*)+28) #03 pc 0x0000000000d52370 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (art_jni_trampoline+112) #04 pc 0x00000000005757cc /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (libcore.util.NativeAllocationRegistry$CleanerThunk.run+60) #05 pc 0x00000000004e0548 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (sun.misc.Cleaner.clean+88) #06 pc 0x000000000037f310 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.lang.ref.ReferenceQueue.enqueuePending+448) #07 pc 0x000000000055c650 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.lang.Daemons$ReferenceQueueDaemon.runInternal+704) #08 pc 0x000000000055a764 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.lang.Daemons$Daemon.run+116) #09 pc 0x000000000031d4f0 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (java.lang.Thread.run+64) #10 pc 0x000000000032d194 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) #11 pc 0x00000000002de270 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+216) #12 pc 0x00000000004bfcf4 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+932) #13 pc 0x00000000004bf940 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallbackWithUffdGc(void*)+8) #14 pc 0x00000000000ab938 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+196) #15 pc 0x000000000009da78 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)
我们注意到有类似的崩溃案例讨论,但细节和我们的场景不完全匹配。
我们已经排查的内容
- 崩溃几乎全部集中在三星设备(覆盖S21/S22/S23等系列),系统版本为Android 12~15;
- 应用是纯React Native应用,没有直接编写原生代码,仅依赖标准安卓依赖;
- 仅间接使用ICU相关功能:比如
java.text、java.util.regex、日期/时间格式化、本地化等; - ProGuard/R8规则已经配置保留了安卓系统库依赖的ICU类,排除了混淆导致的问题。
初步分析与假设
我们初步判断崩溃起源于安卓系统自带的ICU(International Components for Unicode)库libicui18n.so,栈帧指向的RegexPattern和RegexMatcher是安卓系统API(比如正则、日期格式化、ICU4J桥接)的底层依赖。目前我们的几个假设:
- 可能和依赖的
implementation 'org.webkit:android-jsc-intl:+'有关; - 特定正则表达式结合本地化操作触发了问题;
- 三星定制的ICU版本导致:三星通常会自带修改/定制过的ICU库,和原生安卓版本有差异;
- 三星厂商库存在内存损坏(memory corruption)或者引用计数bug。
求助问题
真心希望有经验的大佬能给点建议:
- 有没有人遇到过
libicui18n.so(icu_72/icu_75版本)的类似崩溃? - 有没有已知的临时解决方案(workaround)?比如避免特定正则特性、强制使用某个通用locale?
- ProGuard/R8的优化会不会间接导致这个崩溃?
- 有没有推荐的排查步骤,帮助我们区分这是系统ICU的bug还是应用使用方式的问题?
应用环境信息
- React Native版本:0.65.1
- 安卓构建配置(
android/build.gradle.kt):supportLibVersion = "1.0.0" kotlinVersion = "1.6.10" buildToolsVersion = "35.0.0" minSdkVersion = 26 compileSdkVersion = 35 targetSdkVersion = 35 reactNativeVersion = "0.65.1" androidGradlePluginVersion = "8.1.1" - NDK过滤配置:
ndk { abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" }
万分感谢各位的帮忙!🙏




