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

AGP 8.4启用R8 full mode时flutter_local_notifications的zonedSchedule崩溃求最优方案

AGP 8.4升级后flutter_local_notifications的zonedSchedule方法触发崩溃问题及优化方案

问题现象

将Android Gradle Plugin(AGP)升级至8.4版本后,调用flutter_local_notifications插件的zonedSchedule方法触发定时通知时,应用会直接崩溃。普通通知(如点击Show plain notification with payload按钮触发的通知)可正常工作。

复现步骤

  • 从Android Studio Jellyfish 2023.3.1启动Pixel 7 API 33模拟器(模拟器版本影响不大,但需明确环境)
  • 在VS Code中将项目运行至该模拟器
  • 点击Show plain notification with payload按钮,确认功能正常
  • 点击Schedule notification to appear in 5 seconds按钮
  • 应用崩溃,抛出如下错误日志:
E/AndroidRuntime( 7543): FATAL EXCEPTION: main
E/AndroidRuntime( 7543): Process: com.example.notifications, PID: 7543
E/AndroidRuntime( 7543): java.lang.RuntimeException: Unable to start receiver com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver: java.lang.RuntimeException: Missing type parameter.
E/AndroidRuntime( 7543):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:4315)
E/AndroidRuntime( 7543):    at android.app.ActivityThread.-$$Nest$mhandleReceiver(Unknown Source:0)
E/AndroidRuntime( 7543):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2153)
E/AndroidRuntime( 7543):    at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime( 7543):    at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime( 7543):    at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime( 7543):    at android.app.ActivityThread.main(ActivityThread.java:7872)
E/AndroidRuntime( 7543):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 7543):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime( 7543):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
E/AndroidRuntime( 7543): Caused by: java.lang.RuntimeException: Missing type parameter.
E/AndroidRuntime( 7543):    at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(TypeToken.java:84)
E/AndroidRuntime( 7543):    at com.google.gson.reflect.TypeToken.<init>(TypeToken.java:62)
E/AndroidRuntime( 7543):    at com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver$1.<init>(ScheduledNotificationReceiver.java:58)
E/AndroidRuntime( 7543):    at com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver.onReceive(ScheduledNotificationReceiver.java:58)
E/AndroidRuntime( 7543):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:4306)

临时解决方案(不推荐)

在项目的gradle.properties文件中添加以下配置,禁用R8全模式:

android.enableR8.fullMode = false

此方案过于激进,会降低代码优化程度、增加APK体积,建议使用更精准的优化方案。

更优解决方案

1. 添加针对性的R8混淆规则

崩溃原因是AGP 8.4默认启用的R8全模式下,flutter_local_notifications插件中的ScheduledNotificationReceiver使用的Gson TypeToken泛型信息被移除,导致解析失败。在项目的android/app/proguard-rules.pro中添加以下规则,保留相关类的泛型和内部类信息:

# 保留flutter_local_notifications定时通知接收器及泛型信息
-keep class com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver { *; }
-keepattributes Signature, InnerClasses

# 保留Gson TypeToken相关类,避免泛型信息丢失
-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken

2. 升级flutter_local_notifications插件

检查插件的最新版本,查看官方是否已发布针对AGP 8.4/R8全模式的兼容性修复,直接升级到修复后的版本是最彻底的解决方案。

3. 统一Gson版本

确保项目中依赖的Gson版本与flutter_local_notifications插件依赖的Gson版本一致,避免版本冲突导致的泛型解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:05:21