Android 12版本三星手机上App运行崩溃问题排查求助
问题根因
- 安卓12系统强制要求所有应用创建的
PendingIntent必须显式声明可变性标识:要么加FLAG_IMMUTABLE,要么加FLAG_MUTABLE,未声明的应用在触发对应逻辑时会直接抛出IllegalArgumentException - 三星基于安卓12的OneUI 4.x版本对这个规则、以及安卓12要求的「带intent-filter的组件必须显式设置
android:exported属性」规则的校验,比其他OEM厂商严格得多:其他厂商会给未适配的老应用留兼容兜底,三星直接抛错崩溃,所以故障只在对应三星设备上出现 - RN 0.64.3版本的核心原生代码、对应版本Expo裸工作流默认依赖的部分官方/第三方原生模块,都没有做这两项安卓12适配,刚好踩中校验红线
修复方案
- 第一步先升级高风险依赖到适配安卓12的版本:
- 把
react-native-screens升级到3.13.1及以上 - 项目里用到的推送、通知、本地分享、桌面快捷方式类原生库,全部升级到最新稳定版
- Expo裸工作流执行
expo install,把所有expo相关依赖升级到当前SDK版本对应的最高补丁版
- 把
- 第二步处理未适配的遗留代码:
全局搜索项目原生代码(包括node_modules下的安卓原生文件)里所有创建PendingIntent的位置,按使用场景给flag参数追加对应标识,改完用patch-package打永久补丁,避免下次装包覆盖修改:// 不需要后续修改PendingIntent内容的场景,追加FLAG_IMMUTABLE PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); // 需要后续更新PendingIntent内容的场景(比如通知点击后要更新跳转参数),追加FLAG_MUTABLE PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); - 第三步检查
AndroidManifest.xml:所有带<intent-filter>标签的activity、receiver、service,必须显式设置android:exported属性,不需要外部应用唤起的组件直接设为false即可 - 验证环节必须用安卓12版本的三星实机测试,不要用其他品牌安卓12机型、模拟器代替,避免兼容逻辑差异导致漏测
注意:如果报错栈里出现
com.samsung.android.smartface相关的系统类调用,不用特殊处理,这是三星系统智能优化逻辑捕获到应用崩溃后的堆栈打印,不是系统本身bug,根源还是应用自身的适配问题。
内容的提问来源于stack exchange,提问作者Radjapa
相关产品推荐
相关产品推荐

