Flutter应用升级targetSdkVersion至34后在Android14启动崩溃
问题
将build.gradle中的targetSdkVersion从33修改为34后,应用在Android 14系统上运行时崩溃,低版本Android系统运行正常。崩溃日志如下:
D/AndroidRuntime( 7981): Shutting down VM E/AndroidRuntime( 7981): FATAL EXCEPTION: main E/AndroidRuntime( 7981): Process: com.doubleclick.hre, PID: 7981 E/AndroidRuntime( 7981): java.lang.SecurityException: com.doubleclick.hre: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts E/AndroidRuntime( 7981): at android.os.Parcel.createExceptionOrNull(Parcel.java:3069) E/AndroidRuntime( 7981): at android.os.Parcel.createException(Parcel.java:3053) E/AndroidRuntime( 7981): at android.os.Parcel.readException(Parcel.java:3036) E/AndroidRuntime( 7981): at android.os.Parcel.readException(Parcel.java:2978) E/AndroidRuntime( 7981): at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6157) E/AndroidRuntime( 7981): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1913) E/AndroidRuntime( 7981): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1853) E/AndroidRuntime( 7981): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1841) E/AndroidRuntime( 7981): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772) E/AndroidRuntime( 7981): at com.jaumard.smsautofill.SmsAutoFillPlugin$2.onSuccess(SmsAutoFillPlugin.java:114) E/AndroidRuntime( 7981): at com.jaumard.smsautofill.SmsAutoFillPlugin$2.onSuccess(SmsAutoFillPlugin.java:108) E/AndroidRuntime( 7981): at com.google.android.gms.tasks.zzm.run(com.google.android.gms:play-services-tasks@@18.0.1:1) E/AndroidRuntime( 7981): at android.os.Handler.handleCallback(Handler.java:958) E/AndroidRuntime( 7981): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 7981): at android.os.Looper.loopOnce(Looper.java:230) E/AndroidRuntime( 7981): at android.os.Looper.loop(Looper.java:319) E/AndroidRuntime( 7981): at android.app.ActivityThread.main(ActivityThread.java:8919) E/AndroidRuntime( 7981): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 7981): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) E/AndroidRuntime( 7981): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) I/Process ( 7981): Sending signal. PID: 7981 SIG: 9 Lost connection to device.
解决方案
崩溃原因是Android 14(API 34)强制要求动态注册的广播接收器必须声明RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,而日志中指向的com.jaumard.smsautofill.SmsAutoFillPlugin库未适配该规则。
可通过以下两种方式解决:
1. 升级第三方库
检查com.jaumard.smsautofill库是否有适配API 34的新版本,直接更新依赖版本即可。例如在build.gradle中修改依赖:
// 替换为最新适配版本 implementation 'com.github.jaumard:sms-autofill:最新版本号'
2. 修改库代码(若无法升级)
如果库没有更新版本,可修改其动态注册广播的代码:
找到SmsAutoFillPlugin.java中调用registerReceiver的代码(日志中是第114行),替换为带版本判断的重载方法:
import android.os.Build; import android.content.Context; // ... 原有代码 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ 需指定标记,这里用RECEIVER_NOT_EXPORTED(无需对外暴露) context.registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED); } else { // 低版本沿用原有方法 context.registerReceiver(receiver, intentFilter); }
- 若接收器需要接收其他应用的广播,改用
Context.RECEIVER_EXPORTED,但需做好权限控制避免安全风险。
内容的提问来源于stack exchange,提问作者Mohamed Samy
相关产品推荐
相关产品推荐

