You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:28:09