Flutter Release APK资源目录异常,res/raw文件读取失败如何解决?
解决Flutter Release模式下Java库无法读取res/raw文件的问题
方案1:将文件迁移到Flutter Assets目录
把res/raw下的JSON和证书文件移到Flutter项目的assets目录(没有的话直接新建),然后在pubspec.yaml里声明这些资源:
flutter: assets: - assets/config.json - assets/cert.cer
之后在Android端的Java代码里,通过AssetManager读取这些文件:
InputStream is = getContext().getAssets().open("config.json"); // 后续根据需求处理输入流
这种方式的核心优势是Flutter的Assets在Debug和Release模式下的读取逻辑完全一致,不会出现目录结构差异导致的文件找不到问题。
方案2:修改Android构建配置,保留res/raw文件的完整性
如果必须保留res/raw目录的原有结构,可以从以下几个维度调整构建规则:
- 禁用资源压缩(按需选择):在
android/app/build.gradle的release构建类型中关闭资源压缩:
android { buildTypes { release { shrinkResources false // 其他原有配置... } } }
- 阻止目标文件被压缩:如果只是不想让JSON、证书这类文件被压缩处理,添加packagingOptions规则:
android { packagingOptions { doNotStrip '**/*.json' doNotStrip '**/*.cer' } }
- 保留资源ID不被混淆:如果是ProGuard/R8混淆导致资源引用失效,在
proguard-rules.pro里添加规则:
-keep class 你的应用包名.R$raw { *; }
替换成你实际的应用包名,确保Java库能正确引用到R.raw里的资源ID。
方案3:使用Android原生Assets目录
把文件放到Android模块的src/main/assets目录,然后在Java代码里通过AssetManager读取,逻辑和方案1类似,但不需要修改Flutter的pubspec.yaml,适合纯Android端的快速调整。
内容的提问来源于stack exchange,提问作者Imesh Jeewantha
相关产品推荐
相关产品推荐

