Flutter使用image_picker打包Release APK时图库选视频崩溃
排查步骤
1. 检查混淆规则
Release包默认开启代码混淆,若image_picker相关类被混淆,会导致反射调用失败。在android/app/proguard-rules.pro中添加以下规则:
-keep class io.flutter.plugins.imagepicker** { *; } -keep class io.flutter.plugins.imagepicker.** { *; } -keep class com.yalantis.ucrop** { *; }
同时确认android/app/build.gradle中开启minifyEnabled true时,上述规则已正确配置。
2. 修正权限配置与动态申请
- 移除不必要的权限:
MANAGE_EXTERNAL_STORAGE是特殊权限,image_picker无需此权限,反而可能引发兼容性问题,直接从AndroidManifest中删除。 - 适配Android版本权限:Android 13+依赖
READ_MEDIA_VIDEO,低于13版本依赖READ_EXTERNAL_STORAGE,务必在调用选择视频前动态申请权限(仅Manifest配置不生效),可借助permission_handler包实现:
import 'package:permission_handler/permission_handler.dart'; // 调用pickVideo前先申请权限 final status = await Permission.videos.request(); if (status.isGranted) { final XFile? res = await ImagePicker().pickVideo(source: ImageSource.gallery); }
- 移除
WRITE_EXTERNAL_STORAGE:Android 10+启用分区存储,image_picker已适配该机制,无需此权限,删除可避免权限冲突。
3. 调整image_picker版本
部分设备崩溃可能是当前版本的适配bug,尝试升级到最新稳定版,或回退到已知兼容的版本。修改pubspec.yaml:
image_picker: ^1.0.4 # 替换为最新稳定版
4. 捕获崩溃日志定位原因
没有日志无法精准排查,通过以下方式获取崩溃信息:
- 用Android Studio连接设备,打开Logcat,切换到Release包进程,操作触发崩溃后查看异常栈。
- 集成
firebase_crashlytics,Release包崩溃后会自动上传日志,可查看具体报错类型(如空指针、权限异常、类找不到等)。
5. 测试设备特定图库兼容性
部分定制系统(如小米、华为的自带图库)与image_picker存在交互兼容性问题:
- 尝试用系统文件选择器替代图库,验证是否仍崩溃。
- 测试同Android版本的其他品牌设备,确认是否仅特定品牌/型号设备出现问题,针对性查找适配方案。
6. 检查编译版本适配
确保android/app/build.gradle中的compileSdkVersion和targetSdkVersion与image_picker要求一致(最新版通常要求34),版本过低会导致API调用兼容性问题。
内容的提问来源于stack exchange,提问作者Shreyansh Sharma
相关产品推荐
相关产品推荐

