Flutter asset文件被压缩的问题

3,253 阅读1分钟

背景

严格来说,这不是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"
    }
}