Как устроена читалка Legado и зачем Android-приложению встроенный JS-движок

05 Aug, 2026
589
🔱 178
👥 4

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

Приложение написано на Kotlin и распространяется под лицензией GPL-3.0. По своей сути это скрапер веб-страниц, движок исполнения пользовательских скриптов и локальный веб-сервер, упакованные в единый мобильный интерфейс.

Что внутри у мобильного скрапера

Если заглянуть в список зависимостей в README, становится понятно, как авторы подошли к проектированию. Вместо жесткой привязки к конкретным форматам или сайтам, они создали гибкий инструмент для извлечения контента отовсюду.

icon_android

Вот за счет чего работает эта система:

  • Парсинг HTML и JSON. Проект использует Jsoup, JsoupXpath и json-path. Текст глав, заголовки и оглавления извлекаются из веб-страниц с помощью XPath- и JSONPath-запросов.
  • Исполнение JavaScript. Для обработки динамических страниц в приложение встроен rhino-android (порт JS-движка Mozilla Rhino). Если сайт отдаёт контент через клиентский скрипт или использует нетривиальную разметку, Legado выполняет кастомный JS прямо на устройстве.
  • Локальный веб-сервер. Задействованы nanohttpd и nanohttpd-websocket. Приложение поднимает HTTP- и WebSocket-сервер на самом смартфоне. Вы можете ввести IP-адрес телефона в браузере компьютера, чтобы читать книги на большом экране или управлять правилами парсинга.
  • Редактор кода прямо в UI. Библиотека io.github.rosemoe:editor добавляет редактор кода с подсветкой синтаксиса. Правило извлечения текста можно подправить прямо с экрана телефона.
idea

Как работает концепция источников

Главная фича Legado заключается в отчуждаемости источника данных от самого ридера. Приложение не содержит встроенной базы книг. Вместо этого пользователь импортирует конфигурационные файлы в формате JSON.

Каждый такой файл описывает структуру целевого сайта. Там указаны правила поиска книг, пути к главам и селекторы для получения текста. Если сайт защищен простыми скриптами, в конфигуратор встраивают JS-код. В итоге читалка превращается в гибкий клинер контента: убирает баннеры, форматирует абзацы и собирает готовый EPUB на лету.

Для работы с языковым материалом авторы подключили HanLP — библиотеку для обработки естественного языка. Это помогает при работе с китайскими текстами, правильным переносом слов и конвертацией символов.

С какими трудностями можно столкнуться

Документация в самом репозитории крайне скудная. README ограничивается перечислением использованных библиотек и парой ссылок. Большая часть сообщества и готовых правил парсинга сосредоточена в китайском интернете, поэтому из коробки на английском или русском языке мало что найдешь.

Чтобы настроить извлечение книг с конкретного русскоязычного ресурса, придется разобраться в формате JSON-источников Legado и написать правила вручную. С другой стороны, встроенный редактор с подсветкой облегчает эту задачу, если вы знакомы с XPath.

Зачем изучать исходники этого проекта

Даже если вы не планируете читать сетевые романы, кодовая база Legado интересна как технический кейс.

  1. Архитектура фоновой обработки. В коде показано, как организовать параллельную загрузку и парсинг страниц без проседания UI.
  2. Встраивание серверных компонентов. Использование NanoHTTPD для связи смартфона с ПК дает практический пример построения локальных гибридных интерфейсов.
  3. Безопасное исполнение JS в Android. Проект наглядно демонстрирует связку Kotlin и Rhino для обработки пользовательского кода.

Legado — интересный пример того, как энтузиасты могут превратить привычное мобильное приложение в продвинутую платформу для работы с данными. Проект стоит склонировать и изучить Android-разработчикам, которые ищут практические примеры интеграции веб-технологий, скриптовых движков и фоновых сервисов в Kotlin.

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