启用R8后Android 6.0设备MAUI应用崩溃:缺失OnBackInvokedCallback类
解决.NET MAUI启用R8后Android 6.0(API23)崩溃(缺失OnBackInvokedCallback类)问题
问题根源
android.window.OnBackInvokedCallback是Android 13(API33)才引入的系统类,你使用的AndroidX Activity 1.6.x版本依赖了这个类,但原本通过兼容层在低API设备上运行。启用R8后,代码收缩过程误删了低版本兼容逻辑,导致应用在API23设备上找不到该类而崩溃。
解决方案
1. 添加R8混淆规则
在Android项目根目录(Properties/AndroidManifest.xml所在目录)创建proguard.cfg文件,写入以下规则:
-keep class android.window.OnBackInvokedCallback { *; } -keep class androidx.activity.OnBackPressedDispatcher { *; } -keep class androidx.activity.OnBackPressedCallback { *; } -keep class androidx.activity.ComponentActivity { *; }
然后在Visual Studio中:
- 右键Android项目 → 属性 → Android选项 → 打包
- 勾选“启用代码收缩和混淆(R8)”
- 在“自定义混淆文件”中选择刚创建的
proguard.cfg
2. 降级AndroidX Activity依赖包
AndroidX Activity 1.6.x对低API设备兼容性较差,尝试降级到1.5.2版本,同时同步调整相关依赖:
- Xamarin.AndroidX.Activity 1.5.2
- Xamarin.AndroidX.Activity.Ktx 1.5.2
降级时注意同步更新其他关联NuGet包,避免版本冲突。
3. 调整API级别设置
- 确认项目最低API级别为23,目标API级别设置为33或更高(R8需要足够高的目标API来处理新类的兼容逻辑)
- 路径:项目属性 → Android选项 → 应用程序 → 最低Android版本/目标Android版本
4. 禁用R8严格模式(临时应急方案)
如果以上方法无效,可在项目的.csproj文件中添加以下配置:
<PropertyGroup> <AndroidR8EnableStrictMode>false</AndroidR8EnableStrictMode> </PropertyGroup>
该配置会降低R8对缺失类的检查严格度,避免误删兼容代码。
验证步骤
- 清理解决方案,手动删除项目的
bin和obj目录 - 重新构建Release版本,在API23实体设备上测试
内容的提问来源于stack exchange,提问作者YouBT
相关产品推荐
相关产品推荐

