世界を動かす技術を、日本語で。

Show HN: Gander、権限を要求しないAndroidファイルビューア

2026年7月31日原文(github.com)

概要

Gander は、Android向けの 完全オフライン ファイルビューア。 PDF、Office文書、画像、動画、音声 など多様なファイル形式に対応。 一切の権限不要広告なし追跡なし で安全利用可能。 15MBの小型APK で、端末内で全てをレンダリング。 オープンソース かつMITライセンス、GitHubから入手可能。

Gander: 全ファイル対応・権限不要のAndroidファイルビューア

  • Gander はAndroid用の 超軽量・オープンソース ファイルビューア
  • PDF、Word(.docx)、Excel、PowerPoint(.pptx)、画像、動画、音声、Markdown、テキスト、コード ファイルを一つのアプリで閲覧可能
  • 完全オフライン動作インターネットアクセス不要追跡・広告・アカウント不要
  • ゼロパーミッション設計 :ストレージやネットワークの権限を一切要求しない
  • 15MB前後の小型APK で端末内レンダリングを実現

主な特徴

  • 1つのアプリ でほぼ全ての主要ファイル形式をサポート
  • ピンチズーム・スムーズスクロール ・高解像度画像のディープズーム表示
  • 最近開いたファイルフォルダブラウズ 機能、サムネイルプレビュー付き
  • シェアシート連携 や「 他のアプリで開く」機能対応
  • ファイル内検索 (Word, Excel, PowerPoint, Markdown, テキスト、コード)
  • プライバシー重視設計 :外部送信や分析、アカウント連携一切なし
  • Material 3 UI・ダークモード・エッジツーエッジ 対応
  • Android 8.0以降 で動作

対応ファイル形式とレンダラー

  • PDF :Pdfium(ネイティブ)

  • Word (.docx) :docx-preview(WebView内サンドボックス実行)

  • Excel (.xlsx, .xls, .xlsm, .xlsb, .csv, .ods) :SheetJS(WebView内)

  • PowerPoint (.pptx) :PPTXjs(WebView内)

  • 画像 :JPG, PNG, WebP, BMP, HEIC/HEIF, GIF, SVG, AVIF, ICO等(タイル分割ズームビュー/一部WebView)

  • 動画 :MP4, M4V, MOV, MKV, WebM, 3GP, AVI, FLV, MPEG-TS(Media3 ExoPlayer)

  • 音声 :MP3, M4A, AAC, FLAC, WAV, OGG, Opus, AMR(Media3 ExoPlayer)

  • Markdown :marked+DOMPurifyでHTML化(WebView内)

  • テキスト・コード :.txt, .json, .xml, 各種ソースファイル(テキストビューア)

    • レガシーバイナリ形式 (.doc, .ppt)は非対応(変換推奨)、.xlsは対応

インストール方法

  • Android 8.0以降 対応
  • GitHub Releases から最新版APKをダウンロード(例:Gander-x.y-arm64.apk)
  • 端末にコピーし、タップして「 不明なアプリのインストール」許可
  • Play Protect 警告時は「 インストールを続行」を選択
  • アップデート は新APKを上書きインストール(履歴・権限は維持)
  • Obtainium 利用で自動アップデートも可能(https://github.com/mokshablr/gander を追加)
  • 署名確認 推奨:SHA-256フィンガープリントで真正性検証可能

セキュリティとプライバシー

  • Storage Access Framework や「 Open with」インテント経由で明示的に選択したファイルのみアクセス
  • OfficeファイルサンドボックスWebView 内でオフラインレンダリング
  • ネットワークスタック未使用INTERNET権限未宣言 で外部送信リスクゼロ
  • フォルダブラウズ はACTION_OPEN_DOCUMENT_TREE権限で一時的アクセスのみ
  • Downloads直下 はAndroidの仕様で不可、 DocumentsやDCIM等 を指定

ビルド方法

  • JDK 17+Android SDK(platform 35) が必要
  • コマンド例:
    • ./gradlew assembleDebug (デバッグビルド)
    • ./gradlew assembleRelease(リリースビルド・未署名)
  • リリース署名 にはローカルkeystore(gitignore推奨)を使用

アーキテクチャ概要

  • ViewerActivity が拡張子・MIMEタイプで適切なビューにルーティング
  • PDF はネイティブビュー、 画像 はタイルズームビュー、 動画・音声 はMedia3 ExoPlayer、 その他 はサンドボックスWebView
  • MainActivity は履歴・付与フォルダをサムネイル付きで表示
  • サムネイル生成 は別スレッドでキャッシュ

ライセンス・貢献

  • MITライセンス
  • 依存ライブラリ はMIT/Apache/BSD系
  • Issue・PR歓迎、CONTRIBUTING.md参照
  • GitHubスター で支援可能

Gander開発の背景と今後

  • ファイルを安全に開く ための動機:大容量オフィススイートや、ストレージ権限・クラウド送信を要求する無料ビューアへの不信
  • Ganderゼロパーミッション でOSがファイル流出を物理的に防止
  • PDFはPdfiumメディアはMedia3OfficeはWebView+JSライブラリ で完全ローカルレンダリング
  • 複雑なPowerPointスプレッドシートのグラフ は一部非対応、 古いバイナリ.doc/.pptは未対応
  • 今後の計画 :F-Droid掲載、レガシーOffice対応、iOS版(QuickLookラッパー)、ユーザーフィードバック重視
  • 容量14-15MB、MITライセンス、GitHub公開
  • レンダリング不具合や新形式要望 はIssue投稿歓迎

Gander は、Androidユーザーが 安全・快適・軽快 に多様なファイルを閲覧できる、現代的なファイルビューアの新定番。

Hackerたちの意見

すべてオフラインだから、レンダリングを忠実に保ちながらサポートするのが一番難しかったフォーマットは何だったの?

文書のレンダリングにインターネット接続が必要な理由は何?

pptxは全然ダメ。スライドは絶対位置に配置された形状で、レイアウトの継承があって、JSレンダラーがレイアウトエンジンを再実装しちゃうんだ。結果的に「だいたい合ってる」ところで止まっちゃう。チャートは諦めた。docxは別の意味で面倒だった。しばらくの間、箇条書きがゴミ文字になってて、原因がわからなかったんだ。Wordがそれをシンボルフォントのプライベートユースエリアのコードポイントとして書き込むから、正確なフォントがないとゴミ文字になるんだよね。レンダリング後にユニコードに戻してる。xlsxは簡単だった、SheetJSが難しい部分をやってくれるから。ただ、LibreOfficeのように忠実ではない。要するに「ドキュメントを読めて、大体合ってる」って感じで、14MBのアプリに求めてたのはそれなんだ。

面白いね。アプリにインターネットアクセスを与えるのはAndroidでは避けられないと思ってた。アプリがインターネットを要求しない場合、本当に外部と通信できないって保証されてるの?それとも、ブラウザを開いたり、カスタムURLを使ったりする別の手段があるのかな?アップデート:Geminiに聞いてみたけど、あんまり良くないみたい。INTERNET権限がないAndroidアプリは、外部と隔離されているとは限らないんだ。直接ネットワーク接続はできないけど、データを外部に送信するためのいくつかの他のメカニズムを使えるんだよ。例えば、Intentベースの通信(ブラウザ)。アプリは、インターネットアクセスを持つ他のアプリにデータを渡すために、明示的または暗黙的なIntentを起動できる。つまり、送信したいデータを含むURLを使ってシステムブラウザを開くことができるってこと。自分のUIタスク内でChromeカスタムタブを読み込んで、URL文字列を通じてデータを渡すこともできる。他にもプロセス間通信があって、同じ開発者の2つのアプリがユーザーID(sharedUserId)を共有していると、同じプロセスで動作して、インターネットアクセスを含むすべての権限を共有するんだ。コンテンツプロバイダーの概念もあって、アプリ同士でデータを共有できる。オフラインアプリが共有データベースやパブリックコンテンツプロバイダーにデータを書き込むことができて、オンライン対応の別のアプリがそのデータベースを読み取って内容をアップロードできるんだ。

なるほどね。プライバシー重視じゃないAndroidディストリビューションのほとんどは、ユーザーがインターネット権限をオフにできないから、権限を安全に保つことが優先事項じゃなくなったのかも。バイパスの完全なリストはもっと大きいだろうね。バグバウンティの範囲には入らないから。

それはちょっと暗い話だね。アプリケーションサンドボックス(1)でもそれが機能すると思ってるけど、どう解釈すればいいのか間違えてるかな。グラフェンOSへの移行を早めないと。 (1) https://source.android.com/docs/security/app-sandbox

あなたも知ってると思うけど、本当に安全なコンピュータデバイスって、ネットワークに接続できなくて、武装警備がついてるやつだけだよね? 編集:それに、LLMは「エンゲージメント」のために調整されてて、「十分に安全だから、次に進んで」みたいな答えにはならないってこともね。

残念ながら、これは本当にその通りだね。GoogleはAndroidをインターネット家電用のOSとして設計したから、ローカルファイルで動くローカル専用アプリには興味がないんだよね。でも、OPが作ったものや、ローカル専用にする意図には拍手を送りたいな。プライバシーを本当に尊重するアプリは、モバイル分野でまだ残っている数少ないチャンスの一つだと思ってる。こういうものを作る開発者がもっと増えたらいいのに。

GrapheneOSは、アプリをインストールする時にインターネットの権限を求めるよ。

それは、アプリが送信したいデータを含むURLを使ってシステムブラウザを開けるってことだね。これを軽減するためには、URLCheckみたいなアプリをデフォルトブラウザに設定して、開くURLを表示・編集できるようにするといいよ。Firefoxを使ってるなら、プライベートモードで開く選択肢や、トラッキングパラメータを自動で削除する機能もあって便利だよ。

"Geminiに聞いてみたら、モサドが私のデータを盗むことができるってわかった。" - インターネット権限がないアプリは、インターネットにアクセスしようとするとクラッシュする。これは、すべてのAndroid開発者が新しいプロジェクトで通る通過儀礼みたいなもんだよ、権限を忘れちゃうんだ。 - インテントを起動するのはめちゃくちゃ目立つ。フルブラウザが開くからね。GET専用で専用のURLに限られてるから、データをクエリパラメータに詰め込むなんてことはできないよ。 - 別のアプリがインストールされていて、そのインテントを静かに受け取ってアクティビティを表示しない場合でも、別のアプリが必要だ。同じパッケージからのアクティビティではダメ。 - Chromeカスタムタブを読み込むと、目の前にブラウザが開くから、見逃すと思う? - 共有ユーザーIDも、2つの異なるアプリのインストールが必要で、複数を宣言することはできない。アプリを同じキーで署名しないと、sharedUserIdは使えない。FacebookとsharedUserIdはできないから、また専用のアプリインストールが必要だ。 - ContentProviderは、書き込みアプリと読み取りアプリの両方に専用の権限が必要で、これもまた非常に目立つ。リストにもう一つ追加するけど、アプリがダウンロードフォルダ内にファイルを書き込むリクエストを出せて、別のアプリがそれを開くようにポップアップを表示することもできる! もし誰かがハンマーを持ってドアに現れたら、指を強く叩いてデータを教えさせることもできる。Androidアプリは、デフォルトで非常によく隔離されてる。INTERNETは他の権限と同じようなもので、危険なものとして表面化してないだけ(例えば、バックグラウンド位置情報への永久アクセスみたいに)、またはランタイムのもの(アプリがフォアグラウンドにあるときの現在位置へのアクセスみたいに)。

ルート化した電話と、Linuxファイアウォールを使っているafwall+を使ってるよ。モバイルデータとWiFiデータの権限も手動で変更できる。

Hacker Newsで議論の続きを見る