背景
严格来说,这不是Flutter范畴问题,但是确实是我在写Flutter插件时遇到的,实际上是一个Android问题,以此文做一个小小的备忘。
最近在更新Fluwx,正好对分享文件的功能进行重构,然后需要对该功能进行测试,然后在Android上会抛个异常:
java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
然而我并没有压缩啊,以前分享asset图片明明没问题啊!!!
重现
先看看我们是怎么引入的文件,在pubspec.yaml中如下:
assets:
- assets/doc/fluwx.docx
讲道理,在iOS上可以正常分享,这基本可以断定不是Flutter本身引起的问题。这就奇怪了,同样的方式引入图片都不会出现这样的问题,怎么我引入word就会有这样的问题?
分析
首先,我们要知道Flutter会打把assets下的文件打包到Android中的assets中,具体为app/assets/flutter_assets/。到这里,问题已经有眉目了。在apk打包过程中,aapt会选择性地对assets下的文件进行压缩。下面摘抄的Package.cpp的代码揭示了哪些格式的文件默认不会被压缩:
/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
".jpg", ".jpeg", ".png", ".gif",
".wav", ".mp2", ".mp3", ".ogg", ".aac",
".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
".amr", ".awb", ".wma", ".wmv"
};
解决
知道原因就很好解决了, 告诉aapt不要压缩他。
在你的Gradle文件(android/app/build.gradle)中添加如下代码:
android {
aaptOptions {
noCompress "docx"
}
}