📦

Flutter で Zip を扱うパッケージを3つ試した

2023/03/31に公開1

flutter_archive 5.0.0

https://pub.dev/packages/flutter_archive

Kotlin と Swift でプラグインを実装しているため、対応プラットフォームは Android と iOS / mac のみ
モバイルアプリど使う場合はこのパッケージを採用すれば良い感じがあったが、Zip作成後に展開時に壊れてしまうファイルがあったので採用見送り。採用してみて問題がなければおすすめではあると思うが、Android と iOS で別のコードなので不具合が合った時にちょっと不安

archive 3.3.6

https://pub.dev/packages/archive

Dart で実装されているのですべてのプラットフォームに対応ということになっている。
非同期関数が用意されていないため、そのまま使うと処理中にUIがフリーズする。isolateを使ってスレッドを分離して使うことになりそう

Zip 作成/展開時にメモリにすべてロードしてしまうため。ファイルが大きいとメモリ不足で失敗する。展開はInputFileStreamで展開すれば良いらしいが圧縮時の解決はなさそう?iOSで試したところ確保するメモリが少ないのか200MB程度で失敗するようになってしまった。

async_zip: ^0.0.2

https://pub.dev/packages/async_zip
C で書かれたシンプルなZipライブラリをFFI経由で呼ぶライブラリ
非同期で使えて archive パッケージで起きるようなメモリの問題も解決されているためかなり使いやすい。
メンテされるのか怪しい。

3つほど動かしてみて async_zip が使いやすく、問題も起きない、FFIを使ったプラットフォームで分岐がないシンプルなコードで気に入ったので採用しましたが、依存しているFFIのバージョンが古いのでクローンして依存関係を解消して使っています。
メンテされていくか怪しいけどコードが少ないのでバージョンアップ等で動かなくなっても簡単にマイグレーションできるでしょうということでasync_zipを採用しました。

Discussion