Legado Reader 工作原理及为何 Android 应用需要内置 JS 引擎
说实话,我平时很少关注移动端电子书阅读器。它们通常要么是系统文本渲染的简单包装,要么是充斥着广告和订阅服务的封闭应用。但 Legado 这个项目引起了我的注意。在这个 Android 阅读器的背后,隐藏着一种你更可能在服务器端数据采集工具中看到的架构,而非休闲图书阅读工具。
这款应用采用 Kotlin 编写,采用 GPL-3.0 许可证发布。本质上,它是一个网页爬虫、用户脚本执行引擎和本地 Web 服务器的组合,全部集成在一个移动界面中。
移动端爬虫的内部构造
如果你查看 README 中的依赖列表,就能清楚地了解作者们的设计思路。他们没有紧耦合特定的格式或网站,而是创建了一个灵活的工具,可以从任何地方提取内容。
这个系统的工作方式如下:
- HTML 和 JSON 解析。项目使用 Jsoup、JsoupXpath 和 json-path。通过 XPath 和 JSONPath 查询从网页中提取章节文本、标题和目录。
- JavaScript 执行。为了处理动态页面,应用嵌入了 rhino-android(Mozilla Rhino JS 引擎的移植版)。如果网站通过客户端脚本传递内容或使用复杂的标记,Legado 会在设备上直接执行自定义 JS。
- 本地 Web 服务器。使用 Nanohttpd 和 nanohttpd-websocket。应用在智能手机上启动 HTTP 和 WebSocket 服务器。你可以在电脑浏览器中输入手机 IP 地址,在大屏幕上阅读书籍或管理解析规则。
- UI 中的代码编辑器。io. github.rosemoe:editor 库提供了带语法高亮的代码编辑器。你可以直接在手机屏幕上调整文本提取规则。
源概念的工作原理
Legado 的主要特点是数据源与阅读器本身的可分离性。应用不包含内置的书籍数据库。相反,用户导入 JSON 格式的配置文件。
每个这样的文件描述了目标网站的结构。它指定了书籍的搜索规则、章节路径和文本提取选择器。如果网站受简单脚本保护,JS 代码会被嵌入到配置器中。结果是阅读器变成了一个灵活的内容清洗器:它移除横幅、格式化段落,并即时组装可用的 EPUB。
为了处理语言材料,作者集成了 HanLP——一个自然语言处理库。这有助于中文文本处理、正确的断词和字符转换。
你可能遇到的潜在挑战
仓库本身的文档极其稀少。README 仅限于列出使用的库和几个链接。大部分社区和现成的解析规则集中在中文互联网上,所以开箱即用的情况下,你不会在英文或俄语中找到太多内容。
要从特定的俄语资源设置书籍提取,你需要了解 Legado 的 JSON 源格式并手动编写规则。另一方面,如果你熟悉 XPath,内置的高亮编辑器会使这变得更容易。
为什么要研究这个项目的源代码
即使你不打算阅读网络小说,Legado 代码库作为技术案例研究也很有趣。
- 后台处理架构。代码展示了如何在不降低 UI 性能的情况下组织并行页面加载和解析。
- 嵌入服务器组件。使用 NanoHTTPD 进行手机到 PC 的通信,提供了构建本地混合界面的实用示例。
- 在 Android 上安全执行 JS。该项目清晰展示了 Kotlin 和 Rhino 的配对,用于处理用户代码。
Legado 是一个有趣的例子,展示了爱好者如何将一个熟悉的移动应用转变为一个先进的数据处理平台。对于希望获得在 Kotlin 中集成 Web 技术、脚本引擎和后台服务的实用示例的 Android 开发者来说,这个项目值得克隆和研究。
相关项目