Flutter应用使用flutter_local_notifications接收通知时Android端崩溃如何解决
错误根因
报错栈明确指向flutter_local_notifications库的setSmallIcon方法触发空指针,本质是release打包后,通知小图标对应的Android资源ID无法被正常读取,返回null后调用intValue()触发崩溃。debug模式下默认关闭资源压缩、代码混淆,资源ID可以正常读取,所以不会出现问题。
修复步骤
- 确认通知小图标符合Android规范
通知小图标需要放在android/app/src/main/res/drawable目录下,要求为透明背景、仅白色前景的png图,适配Android 5.0+的通知图标规范,文件名只能包含小写字母、数字和下划线,比如命名为ic_notification.png,禁止直接使用APP启动图标作为通知小图标。 - 在AndroidManifest中配置默认通知图标
打开android/app/src/main/AndroidManifest.xml,在<application>标签内部添加如下配置:<meta-data android:name="com.dexterous.flutterlocalnotifications.default_notification_icon" android:resource="@drawable/ic_notification" /> - 显式指定初始化图标
初始化flutter_local_notifications时,Android配置项显式传入你使用的图标名:final AndroidInitializationSettings androidInitSettings = AndroidInitializationSettings('ic_notification'); final InitializationSettings initSettings = InitializationSettings(android: androidInitSettings); await flutterLocalNotificationsPlugin.initialize(initSettings); - 配置资源与代码防混淆规则
- 打开
android/app/build.gradle,在release构建配置下添加资源keep规则,避免图标被压缩裁剪:
android { buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // 新增下面的配置 aaptOptions { keepAssets "drawable/ic_notification*" } } } }- 打开
android/app/proguard-rules.pro,添加库的防混淆规则:
-keep class com.dexterous.flutterlocalnotifications.** { *; } - 打开
- 清理缓存重新打包
执行flutter clean清理历史构建缓存后,再执行release打包命令验证问题是否修复。
内容的提问来源于stack exchange,提问作者DZ UY Scuti
相关产品推荐
相关产品推荐

