升级NativeScript 8后读取bitmap触发FileNotFoundException异常如何解决
NativeScript 8升级后资源找不到报错排查与解决
报错信息参考
Error in reading bitmap - java.io.FileNotFoundException: ../files/app/assets/icon.png: open failed: ENOENT (No such file or directory)
排查步骤
- 首先解压构建生成的apk安装包,查看
assets/app/目录下的文件结构:确认icon.png是存在于assets/app/assets/子目录,还是被直接放在了assets/app/根目录 - 检查Webpack复制规则冲突:当前配置同时设置了
assets/**目录复制和**/*.png全局匹配规则,两条规则会同时生效,**/*.png规则会将src/assets下的png文件直接输出到构建产物的app根目录,而非assets子目录,导致按原路径访问时找不到文件 - 确认代码内的资源引用路径:NativeScript 8默认资源根路径为构建后的
app目录,若引用路径的相对层级有误也会触发该报错
解决方法
方案1:修正CopyWebpackPlugin规则(推荐)
移除重复的全局图片匹配规则,仅保留定向目录复制,避免路径覆盖,修改后的配置如下:
const copyTargets = [{ from: { glob: 'assets/**', dot: false } }, { from: { glob: 'fonts/**', dot: false } }, ...copyReplacements]; new CopyWebpackPlugin([...copyTargets], copyIgnore)
如果需要复制app目录下的零散图片,新增定向匹配规则即可,不要使用全局**匹配:
const copyTargets = [ { from: { glob: 'assets/**', dot: false } }, { from: { glob: 'fonts/**', dot: false } }, // 单独匹配app目录下的图片,保持原有目录结构 { from: { glob: 'app/**/*.jpg', dot: false } }, { from: { glob: 'app/**/*.png', dot: false } }, ...copyReplacements ]; new CopyWebpackPlugin([...copyTargets], copyIgnore)
方案2:调整资源引用路径
如果不需要保留assets目录结构,可直接将代码中~/assets/icon.png的引用路径修改为~/icon.png,适配全局匹配规则输出的文件结构。
验证操作
修改配置后先执行ns clean清空项目缓存,再重新构建运行,避免旧缓存干扰验证结果。
内容的提问来源于stack exchange,提问作者Deema
相关产品推荐
相关产品推荐

