Flutter asset檔案被壓縮的問題

JarvanMo發表於2020-05-15

背景

嚴格來說,這不是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"
    }
}
複製程式碼

相關文章