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