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

升级Flutter应用targetSDK/compileSDK至34遇RECEIVER_EXPORTED异常求助

升级Flutter应用TargetSDK/CompileSDK到34后Android 14设备Release版出现SecurityException问题排查

问题描述

尝试将Flutter应用的Android targetSDK和compileSDK版本升级至34,但在Android 14设备上运行release版.apk时触发SecurityException。已检查所有Flutter依赖,未发现未指定receiver的相关配置,需定位问题根源。

环境信息

  • Flutter版本:3.24.4
  • JDK:21
  • AGP版本:8.7.2
  • Gradle版本:8.9

错误日志

E/AndroidRuntime(27657): FATAL EXCEPTION: main
E/AndroidRuntime(27657): Process: com.mobileapp.boa, PID: 27657
E/AndroidRuntime(27657): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mobileapp.boa/com.mobg.SecurityException: com.mobileapp.boa: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receively for system broadcasts
E/AndroidRuntime(27657):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4047)
E/AndroidRuntime(27657):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322)
E/AndroidRuntime(27657):        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
E/AndroidRuntime(27657):        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.j
E/AndroidRuntime(27657):        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
E/AndroidRuntime(27657):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685)
E/AndroidRuntime(27657):        at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(27657):        at android.os.Looper.loopOnce(Looper.java:230)
E/AndroidRuntime(27657):        at android.os.Looper.loop(Looper.java:319)
E/AndroidRuntime(27657):        at android.app.ActivityThread.main(ActivityThread.java:8919)
E/AndroidRuntime(27657):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(27657):        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
E/AndroidRuntime(27657):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
E/AndroidRuntime(27657):        at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772)
E/AndroidRuntime(27657):        at g2.c.<init>(Unknown Source:70)
E/AndroidRuntime(27657):        at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772)
E/AndroidRuntime(27657):        at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772)
E/AndroidRuntime(27657):        at g2.c.<init>(Unknown Source:70)
E/AndroidRuntime(27657):        at p2.a$e.<init>(Unknown Source:0)
E/AndroidRuntime(27657):        at p2.a.d(Unknown Source:54)
E/AndroidRuntime(27657):        at o2.c.<init>(SourceFile:7)
E/AndroidRuntime(27657):        at o2.c.<init>(SourceFile:1)
E/AndroidRuntime(27657):        at o2.c$b.b(Unknown Source:2)
E/AndroidRuntime(27657):        at o2.c$b.a(Unknown Source:1)
E/AndroidRuntime(27657):        at com.mobileapp.boa.MainActivity.<init>(Unknown Source:7)
E/AndroidRuntime(27657):        at java.lang.Class.newInstance(Native Method)
E/AndroidRuntime(27657):        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)        
E/AndroidRuntime(27657):        at androidx.core.app.CoreComponentFactory.instantiateActivity(Unknown Source:0)
E/AndroidRuntime(27657):        at android.app.Instrumentation.newActivity(Instrumentation.java:1378)
E/AndroidRuntime(27657):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4034)
E/AndroidRuntime(27657):        ... 12 more
E/AndroidRuntime(27657): Caused by: android.os.RemoteException: Remote stack trace:
E/AndroidRuntime(27657):        at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:16680)
E/AndroidRuntime(27657):        at android.app.IActivityManager$Stub.onTransact$registerReceiverWithFeature$(IActivityManager.java:11613)
E/AndroidRuntime(27657):        at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2961)
E/AndroidRuntime(27657):        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3199)
E/AndroidRuntime(27657):        at android.os.Binder.execTransactInternal(Binder.java:1375)
E/AndroidRuntime(27657):

pubspec.yaml依赖项

barcode_scan2: ^4.3.3
bloc_concurrency: ^0.2.5
cached_network_image: ^3.4.1
carousel_slider: ^5.0.0
clippy_flutter: ^2.0.0-nullsafety.1
connectivity_plus: ^6.1.0
cupertino_icons: ^1.0.8
custom_info_window: ^1.0.1
dio: ^5.7.0
dropdown_button2: ^2.3.9
dropdown_search: ^6.0.1
email_validator: ^3.0.0
equatable: ^2.0.3
file_picker: ^8.1.3
file_saver: ^0.2.14
firebase_analytics: ^11.3.4
firebase_core: ^3.7.0
fl_country_code_picker: ^0.1.9+1
flutter_bloc: ^8.1.6
flutter_cached_pdfview: ^0.4.3
flutter_downloader: ^1.11.8
flutter_email_sender: ^6.0.3
flutter_inappwebview: ^6.1.5
# flutter_native_timezone: ^2.0.0
flutter_timezone: ^3.0.1
flutter_pdfview: ^1.3.4
# flutter_phone_direct_caller: ^2.1.1
flutter_slidable: ^3.1.1
flutter_staggered_grid_view: ^0.7.0
flutter_typeahead: ^5.2.0
flutter_uxcam: ^2.5.5
fluttertoast: ^8.2.8
formz: ^0.4.0
geocoding: ^3.0.0
geolocator: ^13.0.1
google_api_headers: ^4.2.5
google_maps_flutter: ^2.9.0
google_maps_webservice: ^0.0.19
google_mlkit_text_recognition: ^0.14.0
google_places_flutter: ^2.0.0
http: ^1.2.2
http_interceptor: ^1.0.2
image_picker: ^1.1.2
intl: ^0.19.0
intl_phone_field: ^3.2.0
json_response: ^1.0.0
location: ^7.0.1
maps_launcher: ^2.2.1
mime: ^2.0.0
oauth2: ^2.0.0
omni_datetime_picker: ^2.0.4
open_file: ^3.5.9
path_provider: ^2.1.4
percent_indicator: ^4.2.3
permission_handler: ^11.3.1
pin_code_fields: ^8.0.1
provider: ^6.1.2
s_network_connection_checker: ^0.0.1+1
shared_preferences: ^2.3.2
sqflite: ^2.4.1
# uni_links: ^0.5.1
url_launcher: ^6.3.1
webview_flutter: ^4.10.0

问题定位与解决步骤

核心原因

Android 14(API 34)强制要求:注册广播接收器时必须指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED标记,否则会抛出SecurityException。

定位步骤

  1. 反混淆栈追踪

    • release编译后,android/app/build/outputs/mapping/release/目录下的mapping.txt文件可用于反混淆日志中的类名(如g2.c、p2.a$e)。
    • 使用Android Studio的ProGuard工具或反混淆工具,将混淆后的类名替换为原始类名,直接定位到注册广播的代码位置。
  2. 检查合并后的AndroidManifest

    • 运行flutter pub run apk_analyzer manifest android/app/build/outputs/apk/release/app-release.apk,或用Android Studio打开APK查看合并后的Manifest文件,查找未添加android:exported属性的<receiver>标签。
  3. 排查依赖版本兼容性

    • 重点排查可能监听系统广播的依赖:比如flutter_downloader、connectivity_plus、flutter_uxcam等。例如flutter_downloader 1.11.8可能存在旧版广播注册逻辑,尝试升级到适配API 34的最新稳定版。
  4. 检查自身代码的动态广播注册

    • 查看MainActivity或自定义FlutterActivity中是否有调用registerReceiver()的代码,确保注册时添加标记:
      // 示例:注册非导出的广播接收器
      registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED);
      
  5. 临时调试方案

    • 在android/app/build.gradle中设置minifyEnabled false,关闭R8混淆后重新编译release版,此时栈追踪会显示原始类名,便于快速定位问题。

内容的提问来源于stack exchange,提问作者Martin Zhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:35:55