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
相关产品推荐
相关产品推荐

