Flutter真机运行正常但安装APK后无法下载/读取文件问题
问题排查与解决建议
1. 先获取release包运行日志(无需root)
只要手机开启了USB调试,就能通过adb命令抓取应用运行日志,执行:
adb logcat -s flutter
这条命令会过滤出Flutter相关的所有日志,包括你代码里的print输出和未捕获的异常,拿到日志就能精准定位是下载还是读取环节出了问题。
2. 检查AndroidManifest权限配置
Debug模式下Flutter会自动添加INTERNET权限,但Release包必须显式声明。打开android/app/src/main/AndroidManifest.xml,确认存在以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
如果你下载路径用的是外部存储(而非应用私有目录),还需要添加存储权限并做动态申请;但你当前用的getApplicationDocumentsDirectory是应用私有目录,理论上不需要额外存储权限,不过仍需确认下载路径与读取路径一致。
3. 给Dio下载添加异常捕获
你当前的下载代码没有错误处理逻辑,无法判断下载是否成功。修改下载代码:
try { await Dio().download(fileurl, savePath); print('下载完成,文件路径:$savePath'); } catch (e) { print('下载失败详情:$e'); }
通过adb日志就能看到下载环节的具体状态。
4. 检查Release包的代码混淆规则
默认Release包会开启代码混淆,可能导致Dio、xml2json或你的业务代码被混淆后失效。打开android/app/proguard-rules.pro,添加以下规则:
# 保留Flutter核心类 -keep class io.flutter.app.** { *; } -keep class io.flutter.plugin.** { *; } -keep class io.flutter.util.** { *; } -keep class io.flutter.view.** { *; } -keep class io.flutter.** { *; } -keep class io.flutter.plugins.** { *; } # 保留Dio相关类 -keep class com.dio.** { *; } -dontwarn com.dio.** # 保留xml2json相关类 -keep class xml2json.** { *; } -dontwarn xml2json.** # 保留你的业务代码(替换为你的实际包名) -keep class com.yourpackage.** { *; }
添加后重新打包测试。
5. 验证文件路径与存在性
在路径获取和文件读取代码中添加打印:
Future<String> get _localPath async { final directory = await getApplicationDocumentsDirectory(); print('应用私有目录路径:${directory.path}'); return directory.path; } _readGPX() async { print("_readGPX"); final myTransformer = Xml2Json(); try { final file = await _localFile; print('待读取文件路径:${file.path}'); print('文件是否存在:${await file.exists()}'); // 后续读取逻辑... } catch (e) { print('文件读取异常:$e'); return 0; } }
通过adb日志确认下载的文件是否真的被写入目标路径,以及读取时文件是否存在。
内容的提问来源于stack exchange,提问作者Jorgen Timarey
相关产品推荐
相关产品推荐

