Flutter Local Notifications Android发布版自定义通知图标失效排查
问题分析与解决步骤
从Logcat日志和你的描述来看,核心问题是发布版构建中自定义通知图标资源被优化移除或无法被正确识别,以下是针对性的解决方法:
1. 阻止ProGuard/R8混淆图标资源ID
发布版构建时,R8会自动优化未被显式引用的资源,而flutter_local_notifications是动态调用图标资源ID,R8无法识别这种引用关系,会把ic_notification的资源ID混淆或移除。
在android/app/proguard-rules.pro文件中添加以下规则,保留图标对应的资源ID:
# 保留自定义通知图标资源ID -keep class com.example.package.R$drawable { public static int ic_notification; }
如果不想逐个指定,可以保留所有资源类的字段:
-keep class **.R$* { public static <fields>; }
2. 禁用或配置资源压缩
如果你的release构建开启了资源压缩(shrinkResources true),需要明确告诉构建工具保留通知图标资源:
- 在
android/app/src/main/res/raw目录下创建keep.xml文件(如果raw目录不存在则新建) - 写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/ic_notification,@drawable/ic_notification_*" />
同时检查android/app/build.gradle的release配置,如果不需要资源压缩,可以直接关闭:
buildTypes { release { shrinkResources false // 其他配置... } }
3. 检查资源文件与目录的正确性
- 确认所有
ic_notification.png文件名完全小写,Android发布版构建对文件名大小写敏感 - 检查
drawable-anydpi/ic_notification.xml的内容,确保正确引用了对应的png资源,没有拼写错误 - 确认所有资源目录(如drawable-hdpi、drawable-xhdpi等)名称正确,没有大小写错误或拼写错误
4. 验证构建配置
执行发布版构建前,先清理构建缓存:
flutter clean flutter build apk --release
避免旧的缓存资源影响构建结果。
内容的提问来源于stack exchange,提问作者Toru
相关产品推荐
相关产品推荐

