Android-просмотрщик, который открывает любые файлы без доступа к сети

01 окт 2026
1,112
50
2
1 неделя

Недавно мне прислали в мессенджер PDF со счётом за ремонт. Открываю на телефоне привычным приложением, а оно предлагает войти в аккаунт, чтобы синхронизировать документы. За счёт за ремонт. Знакомая ситуация? Так устроено большинство штатных просмотрщиков: файл уходит на чужой сервер, рендерится где-то там и возвращается на экран картинкой. Часто в компании рекламы.

Именно это раздражение и завело меня на репозиторий Gander от Arjun Maniyani. Открытый просмотрщик для Android держит PDF, Word, Excel, PowerPoint, фотографии, видео, аудио, Markdown и код в одном приложении. Файлы он обрабатывает на самом устройстве и не может отправить их в сеть, потому что в манифесте просто нет разрешения INTERNET.

Gander, открытый просмотрщик файлов для Android

Что это за проект

Gander это APK весом около 5 МБ на Kotlin, под MIT-лицензией, для Android 8.0 и выше. Ни рекламы, ни аналитики, ни аккаунтов, ни трекеров. Звёзд на GitHub уже больше тысячи, форков полсотни, хотя репозиторий молодой.

Автор позиционирует проект как противоположность тому, что обычно стоит на телефоне. Вместо дюжины полупросмотрщиков, каждый из которых норовит отправить документ в облако, один небольшой APK, рендерящий всё локально.

Реклама

Что он умеет

Список форматов для такого размера приличный: PDF, .docx и .doc, .odt, .rtf, таблицы .xlsx и .ods, слайды .pptx, изображения включая HEIC и AVIF, видео MP4 и MKV, аудио FLAC и Opus, Markdown, исходники, субтитры и .zip.

Демонстрация: недавние файлы, папки, PDF, Word, Excel и Markdown

Несколько вещей я отметил отдельно.

ZIP открывается как папка. Записи внутри листаются и запускаются в своём просмотрщике прямо из архива, на телефон ничего не распаковывается. Защищённые паролем файлы спрашивают пароль, а имена, записанные Windows-архиватором на другом языке, читаются как имена, а не как вопросительные знаки.

Ночной режим для PDF сделан аккуратнее, чем я ожидал. Страница переворачивается: бумага становится чёрной, текст белым, оттенки заголовков сохраняются. Фотографии внутри документа остаются такими, какими их напечатали.

PDF в обычном режиме

Тот же PDF в ночном режиме

Есть поиск по документу с переходом между совпадениями. Работает в PDF, Word, OpenDocument, по всем листам книги, по слайдам, Markdown и коду. В PDF ещё можно выделять текст и читать документ скринридером.

Файлы без известного расширения открываются как текст, содержимое показывается сырым, переименовывать не нужно. Крупные файлы подгружаются по 5 МБ с кнопкой "Показать ещё", поэтому открываются мгновенно.

3D-модели STL показываются объёмным телом: вращение одним пальцем, масштаб и сдвиг двумя, двойной тап возвращает в исходный вид. Размер в миллиметрах подписан снизу. Телефон с гигабайтом памяти потянет около полумиллиона треугольников.

Просмотрщик помнит, где вы остановились. Закрыли PDF на середине, в следующий раз он откроется на той же странице, как бы вы его ни запускали.

Главный экран с недавними файлами и превью

Фото в просмотрщике с глубоким зумом

Просмотр Word-документа

Просмотр слайдов PowerPoint

Просмотр таблицы Excel с вкладками листов

Как удаётся работать без разрешений

Механика для меня самое интересное. Gander не просит доступа к хранилищу вообще. Файлы попадают в него через Storage Access Framework и интенты "Открыть с помощью": система сама отдаёт приложению ровно те документы, которые вы выбрали, и ничего сверх этого.

Офисные форматы рендерятся внутри заблокированного WebView. Каждый запрос перехватывает WebViewAssetLoader: библиотеки грузятся из ресурсов приложения, сам документ читается из content-URI. Сетевой стек не задействован, да и объявлять INTERNET в манифесте разработчик не стал.

Обход папок построен на разовых разрешениях ACTION_OPEN_DOCUMENT_TREE. Одна деталь, о которой полезно знать: Android не выдаёт корень папки Downloads ни одному приложению. Выдавайте Documents, DCIM или подпапку внутри Downloads.

Отдельно отмечу экран "О приложении". Он спрашивает у Android, какие разрешения запрашивает Gander, и показывает ответ рядом с полным текстом лицензий всех вшитых библиотек. Приложение как бы проверяет собственное обещание.

Что под капотом

Внутри ViewerActivity выбирает поверхность для отрисовки по расширению файла, а если не вышло, по MIME-типу. Дальше четыре пути: тайловый просмотрщик фото, ExoPlayer для видео и звука, песочница WebView для всего, что рисуют встроенные JS-библиотеки, и список для архивов.

Библиотеки рендеринга вшиты в приложение: pdf.js, docx-preview, SheetJS, PPTXjs, marked, DOMPurify и ещё несколько. Нативных библиотек нет совсем, поэтому один APK подходит под любую архитектуру. Документы меньше 16 МБ отдаются WebView целиком, более крупные читаются кусками, чтобы в памяти держались только открытые страницы.

Ограничения обозначены честно. Старый бинарный .ppt не поддерживается: подходящего открытого рендерера, который был бы и точным, и достаточно маленьким, не нашлось, приложение предложит пересохранить файл в .pptx. Для PDF нужен Android System WebView 125 или новее, для Markdown 92, для Word 80. На давно не обновлявшемся телефоне Gander скажет об этом прямо, а не упадёт молча.

Кому это пригодится

Если вы часто открываете на телефоне чужие документы и не хотите, чтобы они уезжали на серверы, Gander закрывает вопрос. На устройствах без Google Play, где поставить нормальный офисный пакет сложно, он тоже выручает: APK лежит в релизах, ставится вручную и обновляется через Obtainium.

Держать в голове стоит простое правило: Gander это просмотрщик, а не редактор. Править .docx или собирать таблицу в нём не получится. В README нет ни слова про тесты, а документация ограничена парой разделов, так что контрибьютору придётся разбираться по коду.

Стоит ли ставить

Поставить стоит, если вам нужен предсказуемый офлайн-просмотрщик без рекламы и аккаунтов. Скачать можно из Google Play или взять APK из релизов на GitHub.

Доступно в Google Play

Каждый релиз подписан одним ключом, так что подлинность легко проверить:

apksigner verify --print-certs Gander-x.y.apk

Собрать самому тоже несложно, нужен JDK 21 и Android SDK уровня 36:

./gradlew assembleRelease

Gander подойдёт тем, кто ценит тишину в приложении больше десятка функций. Открыл файл и закрыл. Никто никуда не позвонил.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.