Flutter打包后出现OnBackInvokedCallback等类找不到异常
解决Flutter打包后找不到Android API类的问题
问题本质
android.window.OnBackInvokedCallback和android.graphics.ImageDecoder$OnHeaderDecodedListener都是Android 13(API 33)新增的系统API。调试模式正常是因为默认没开启代码压缩,所有类都完整保留;打包时开启了R8代码压缩,工具误判这些类未被使用,将其移除,导致运行时找不到。
解决步骤
1. 升级Android编译版本
打开android/app/build.gradle,确保编译和目标SDK版本不低于33:
android { compileSdkVersion 33 // 推荐用34或最新稳定版 defaultConfig { targetSdkVersion 33 // 与compileSdkVersion保持一致或更高 } }
2. 添加ProGuard规则保留核心类
在android/app/proguard-rules.pro中加入以下规则,阻止R8删除这些API类:
# 保留Android 13返回键回调相关类 -keep class android.window.OnBackInvokedCallback { *; } -keep interface android.window.OnBackInvokedCallback { *; } # 保留ImageDecoder相关类 -keep class android.graphics.ImageDecoder$OnHeaderDecodedListener { *; } -keep interface android.graphics.ImageDecoder$OnHeaderDecodedListener { *; } -keep class android.graphics.ImageDecoder { *; }
3. 升级Flutter到稳定版
旧版Flutter可能对Android 13的API适配不完善,执行命令升级:
flutter upgrade
4. 启用核心库脱糖(兼容低版本Android)
如果你的App需要兼容Android 12及以下版本,在gradle.properties中开启脱糖:
android.enableD8=true android.enableR8=true android.useAndroidX=true android.enableJetifier=true coreLibraryDesugaringEnabled true
同时在android/app/build.gradle的依赖中添加脱糖库:
dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' }
5. 临时排查:关闭资源压缩
如果以上步骤无效,先关闭资源压缩确认问题根源:
buildTypes { release { minifyEnabled true shrinkResources false // 临时关闭,测试是否正常 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
若关闭后正常,说明资源压缩误删了相关依赖,需进一步调整资源压缩规则。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

