Android-ридер для комиксов, манги, вебтунов, книг, аудиокниг с OCR и переводами.
Модульное Kotlin-приложение: растровые страницы, reflowable-книги, локальные словари, TTS и кастомизация чтения.
Changelog · Документация · Рекомендации по коду · Сторонние лицензии · Contributing · Security
- О проекте
- Статус разработки
- Что изменилось в 2.2.0
- Возможности
- Поддерживаемые форматы
- Технологии
- Структура проекта
- Сборка
- CI/CD
- Лицензия
Mr.Comic — Android-ридер для комиксов, манги, вебтунов, книг, аудиокниг с OCR-переводами, словарями и кастомизируемым интерфейсом библиотеки.
Ридер построен на отдельных контейнерах для растровых страниц, вертикальных лент, текстовых страниц и вертикального текста. Это позволяет каждому формату использовать оптимальный путь рендеринга.
main — единственная поддерживаемая рабочая линия. Reader QA, перевод, словари и OCR развиваются по связанным GitHub issues; для translation/AI scope см. issue #154. Неофициальные APK, архивные snapshots и пользовательские книги не публикуются в репозитории.
Mr.Comic придерживается local-first подхода: локальные книги и словари должны оставаться на устройстве, а отправка текста внешнему AI/translation provider выполняется только через явно выбранный пользователем сценарий. Для security reports используйте SECURITY.md, для contribution workflow — CONTRIBUTING.md.
Версия 2.2.0 — крупное техническое обновление ридера: исправлены критичные баги чтения, ускорены горячие пути и разложены большие классы на отдельные контроллеры.
| Направление | Главное |
|---|---|
| Стабильность чтения | Исправлены P0/P1-регрессии: белая вспышка WebView при смене стиля, переполнение страниц в TextPaginator, нестабильный EPUB-прогресс, race/null-safety проблемы. |
| Производительность | Webtoon-документ строится инкрементально, bitmap-кэш освобождает вытесненные изображения, словарные операции перенесены на IO dispatcher. |
| EPUB | EpubFormatReader декомпозирован на специализированные модули: cache serializer, page resolver, HTML chunker/renderer, TOC resolver, archive manager и spine builder. |
| Reader UI | ReaderViewModel и ReaderScreen разнесены на контроллеры и composable-компоненты: навигация, прогресс, настройки, сноски, перевод, OCR, закладки, WebView. |
| Архитектура | Добавлены EpubCacheStore, KMP shared-слой, adapter-подход для Room-кэшей и подготовка к более чистым engine boundaries. |
| Тесты | Добавлены регрессионные тесты для P0-фиксов, EPUB cache/page resolver, пагинации, footnotes, progress persistence и reader harness. |
Полный список изменений: CHANGELOG.md.
| Категория | Описание |
|---|---|
| Комиксы и манга | CBR, CBZ, ZIP, RAR, 7Z, TAR, папки с изображениями, PDF, DJVU — постраничный и вертикальный режимы |
| Книги | EPUB, FB2, TXT, HTML, Markdown, RTF, MOBI, AZW3, DOCX, ODT — пагинация и webtoon-поток |
| Инструменты чтения | TOC-навигация, закладки, прогресс, цитаты, сноски, словарный поиск, перевод, LLM-объяснения |
| Стили чтения | Paper, sepia, newspaper, night ink, OLED black, e-ink пресеты + типографика и кастомные шрифты |
| Аудио и OCR | TTS, воспроизведение аудиокниг, медиа-контролы, OCR-входные точки |
| Переводы | Оффлайн-словари (WordNet, JMdict, CC-CEDICT, Kaikki), онлайн-перевод, OpenRouter LLM |
| Категория | Форматы |
|---|---|
| Растровые | CBR, CBZ, ZIP, RAR, 7Z, TAR, PDF, DJVU, папки с изображениями |
| Текстовые | EPUB, FB2, TXT, HTML, Markdown, RTF, MOBI, AZW3, DOCX, ODT |
| Аудио | Локальные аудиокниги через Media3 |
Архивы классифицируются перед рендерингом: последовательности изображений используют растровые контейнеры; текстовые книги внутри архивов делегируются соответствующему текстовому ридеру.
| Слой | Технологии |
|---|---|
| Язык | Kotlin, Java 17 toolchain |
| UI | Jetpack Compose, Material 3 |
| Архитектура | Модульное Android-приложение (16 модулей), MVVM + StateFlow |
| DI | Hilt |
| Хранение | Room (v9, 8 миграций), DataStore |
| Медиа | Android Media3 |
| Изображения | Coil |
| Сеть | Retrofit, OkHttp |
| Архивы | Zip4j, Junrar, Apache Commons Compress |
| EPUB | Readium-ориентированный движок + формат-адаптеры |
| Сборка | Gradle wrapper, AGP 9.2.1, Kotlin 2.2.21 |
| CI | GitHub Actions (тесты всех модулей + lint + сборка APK) |
├── android/
│ ├── app/ → Точка входа, навигация, DI-корень
│ ├── core-model/ → Общие модели, каталог форматов, enum'ы
│ ├── core-data/ → Room, DataStore, репозитории, миграции
│ ├── core-domain/ → Доменная логика, перевод, словари, аналитика
│ ├── core-ui/ → Тема, дизайн-примитивы, shared UI
│ ├── engine-api/ → Граничные интерфейсы движков чтения
│ ├── engine-epub-readium/ → Интеграция EPUB/Readium
│ ├── engine-formats/ → Ридеры форматов: архивы, EPUB, FB2, PDF, DJVU...
│ ├── engine-llm/ → LLM-интеграция (OpenRouter)
│ ├── engine-registry/ → Регистрация и обнаружение движков
│ ├── engine-rendering/ → Кэш битмапов, предзагрузка, рендеринг
│ ├── feature-library/ → Библиотека, импорт, аудиоплеер, прогресс
│ ├── feature-reader/ → Экран чтения, контейнеры, TTS, жесты
│ ├── feature-settings/ → Настройки и кастомизация
│ ├── feature-ocr/ → OCR-модуль
│ └── feature-onboarding/ → Онбординг
├── docs/ → Документация, аудиты и рекомендации
├── scripts/ → Скрипты проверки и сборки словарей (harness)
├── config/ → Конфигурация статического анализа (detekt)
└── .github/ → CI/CD workflow
- Android Studio (последняя стабильная)
- Android SDK (compileSdk 37)
- JDK 17
- Gradle wrapper из репозитория
# Linux / macOS
./gradlew --no-daemon --console=plain :app:assembleDebug
# Windows
.\gradlew.bat --no-daemon --console=plain :app:assembleDebugРезультат: android/app/build/outputs/apk/debug/Mr.Comic-debug.apk
# Все модули
./gradlew --no-daemon testDebugUnitTest
# Конкретный модуль
./gradlew --no-daemon :engine-formats:testDebugUnitTest
./gradlew --no-daemon :feature-reader:testDebugUnitTestGitHub Actions workflow (.github/workflows/build-apk.yml):
| Job | Описание |
|---|---|
unit-tests |
Запуск unit-тестов всех 16 модулей |
lint |
Android Lint для :app |
build |
Сборка Debug + Release APK (после прохождения тестов и lint) |
python-scripts |
Smoke-тест скриптов сборки словарей |
Триггеры: push в main, pull request в main, ручной запуск.
Исходный код Mr.Comic опубликован по Mr.Comic Source-Available License 1.0. Она разрешает изучение, локальную сборку для личного некоммерческого тестирования и contribution workflow, но не разрешает коммерческое использование, redistribution или публичные modified builds без отдельного письменного разрешения. Полный текст — в LICENSE.
Сторонние библиотеки, компоненты Android, словари и ассеты остаются под своими лицензиями. См. THIRD_PARTY_NOTICES.md.