升级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。
定位步骤
反混淆栈追踪
- release编译后,
android/app/build/outputs/mapping/release/目录下的mapping.txt文件可用于反混淆日志中的类名(如g2.c、p2.a$e)。 - 使用Android Studio的ProGuard工具或反混淆工具,将混淆后的类名替换为原始类名,直接定位到注册广播的代码位置。
- release编译后,
检查合并后的AndroidManifest
- 运行
flutter pub run apk_analyzer manifest android/app/build/outputs/apk/release/app-release.apk,或用Android Studio打开APK查看合并后的Manifest文件,查找未添加android:exported属性的<receiver>标签。
- 运行
排查依赖版本兼容性
- 重点排查可能监听系统广播的依赖:比如
flutter_downloader、connectivity_plus、flutter_uxcam等。例如flutter_downloader 1.11.8可能存在旧版广播注册逻辑,尝试升级到适配API 34的最新稳定版。
- 重点排查可能监听系统广播的依赖:比如
检查自身代码的动态广播注册
- 查看MainActivity或自定义FlutterActivity中是否有调用
registerReceiver()的代码,确保注册时添加标记:// 示例:注册非导出的广播接收器 registerReceiver(receiver, intentFilter, Context.RECEIVER_NOT_EXPORTED);
- 查看MainActivity或自定义FlutterActivity中是否有调用
临时调试方案
- 在
android/app/build.gradle中设置minifyEnabled false,关闭R8混淆后重新编译release版,此时栈追踪会显示原始类名,便于快速定位问题。
- 在
内容的提问来源于stack exchange,提问作者Martin Zhu
相关产品推荐
相关产品推荐

