剖析阅读Sigma源码架构:RuleAnalyzer规则解析流水线与 Room 数据库设计
剖析阅读Sigma源码架构RuleAnalyzer规则解析流水线与 Room 数据库设计【免费下载链接】legado-E阅读Sigma是legado的继承保持开源免费延续开源精神。项目地址: https://gitcode.com/gh_mirrors/legado2/legado-E阅读Sigmalegado-E是一款开源免费的 Android 阅读 App其核心竞争力在于书源规则解析——用规则把网页和接口变成可读的正文。本文以RuleAnalyzer 规则解析流水线与Room 数据库设计为主线带你快速看懂这款开源阅读应用的源码架构新手也能轻松上手 。一、源码结构总览每个模块管什么项目主代码位于 app/src/main/java/io/legado/app/ 目录与本文相关的模块可分成三块模块路径职责规则解析model/analyzeRule/拆分、解析并执行书源规则数据存储data/Room 数据库、DAO 与实体定义业务模型model/阅读、下载、搜索等动作的编排项目自带了两份模块说明文档data/README.md 和 model/README.md是阅读源码的绝佳入口。二、规则解析流水线书源生效的魔法2.1 RuleAnalyzer先把规则切开一条书源规则常常长这样class.name;css:div.title;text前面是 XPath后面是 JSoup 的 css 选择器。麻烦在于规则字符串本身就可能含有、、||比如正则或 jsonPath 里就有简单按符号切分必然出错。RuleAnalyzer.kt 就是来解决这个问题的它的设计思路很巧妙不用正则、不复制中间串只在原字符串上标记起点和终点pos指针最后一次性切片源码注释原话是高效快速准确切割规则识别平衡组遇到[...]或(...)筛选器时成对匹配括号整体取出见 RuleAnalyzer.kt 中chompBalanced的调用筛选器内部的符号不会骗过它区分引号与转义单引号、双引号、转义字符分别跟踪状态见 RuleAnalyzer.kt 的chompCodeBalancedJS 代码块里的不会被当成分隔符tailrec 尾递归splitRule方法使用 Kotlin 的tailrec注解RuleAnalyzer.kt避免深递归的性能损耗。2.2 AnalyzeRule 调度器按类型分派解析器规则切分完成后由 AnalyzeRule.kt 作为总调度接手它内置了四个解析器解析器文件用途XPathAnalyzeByXPath.ktHTML 结构解析的默认语言JSoupAnalyzeByJSoup.ktcss 选择器语法JsonPathAnalyzeByJSonPath.kt解析 JSON 接口响应正则AnalyzeByRegex.kt按模式抽取内容规则里的分隔符让四个解析器可以任意串联使用。同时 AnalyzeRule 内置了三份缓存stringRuleCache、regexCache、scriptCacheAnalyzeRule.kt——同一条规则字符串、正则、JS 脚本只编译一次后续直接复用这对翻页、批量加载章节时的解析开销优化非常明显。2.3 JS 脚本与变量传递书源规则还支持 JS 脚本引擎来自内置的 modules/rhino/ 模块Rhino 引擎。RuleData.kt 负责用variableMap管理跨页面传递的大变量第一页脚本写入的 token下一页规则可以取回——这正是翻页加载登录态保持等复杂书源能跑通的底层机制。三、Room 数据库设计管理 21 张表的账本3.1 单一入口appDb 全局单例所有数据库操作都经过一个懒加载的全局单例AppDatabase.ktval appDb by lazy { Room.databaseBuilder(appCtx, AppDatabase::class.java, AppDatabase.DATABASE_NAME) .fallbackToDestructiveMigrationFrom(false, 1, 2, 3, 4, 5, 6, 7, 8, 9) .addMigrations(*DatabaseMigrations.migrations) ... }短短几行讲了三件事数据库首次使用时才构建by lazy1~9 的远古版本直接采用重建策略第 10 版起才开始正规的增量迁移。3.2 89 个版本与 AutoMigration 自动迁移AppDatabase.kt 的Database注解中可以看到version 89以及 Book、BookChapter、BookSource、Bookmark、RssSource、ReadRecord 等 21 张表定义和一个BookSourcePart视图。项目大量使用 Room 的AutoMigration 自动迁移普通改动加列、加表由 Room 自动生成迁移 SQL只有需要手工回填数据的版本如 54→55、80→81、84→85才在 DatabaseMigrations.kt 中编写对应 spec 类把成本压到最低。另一个亮点是exportSchema true每个版本的数据库结构会被自动导出到 app/schemas/io.legado.app.data.AppDatabase/共 89 个 json 文件。对贡献者来说数据库结构的每一次变化都能在版本控制中看见这是多版本协作项目非常友好的实践。3.3 DAO 与 Entity清晰的职责分工按照 Room 官方推荐的惯例data/ 目录分两层entities/21 个纯数据类表结构如 Book 书籍表、BookChapter 章节表dao/21 个数据库读写入口如 BookDao.kt、BookChapterDao.kt、BookSourceDao.ktUI 与业务层只与 DAO 打交道不直接接触表。这种实体定结构、DAO 开门面的划分正是数据库能稳定迭代到第 89 版而业务代码几乎不用改的原因。四、两者如何协作从书源到书架的数据流 把解析流水线和数据库串起来一次典型的搜索 → 加书架 → 阅读流程是用户输入关键词App 依次执行各书源的搜索规则RuleAnalyzer 切分 → AnalyzeRule 分派解析器结果写入SearchBook表SearchBookDao.kt供界面展示加入书架时从BookSource表提取规则数据书籍信息写入Book表打开书籍后按BookChapter表逐章取内容阅读进度实时写入ReadRecord表。一句话总结解析流水线负责取数Room 数据库负责存数两者互不越界层次干净利落。五、新手源码阅读路线30 分钟上手如果想自己动手读源码推荐这个顺序先看 data/README.md 与 model/README.md 建立模块概念再看 AppDatabase.kt仅凭Database注解就能列出这款 App 有哪 21 张表然后精读 RuleAnalyzer.kt注释详尽splitRule是核心方法最后看 AnalyzeRule.kt理解四个解析器与 JS 脚本如何组合。想本地运行项目可以克隆源码git clone https://gitcode.com/gh_mirrors/legado2/legado-E阅读Sigma 的架构并不复杂它的功力藏在持续迭代中保持分层清晰上RuleAnalyzer 的规则切分、AnalyzeRule 的总调度、Room 的 89 版自动迁移——这三件小事做到位才撑起了它赖以生存的书源生态。【免费下载链接】legado-E阅读Sigma是legado的继承保持开源免费延续开源精神。项目地址: https://gitcode.com/gh_mirrors/legado2/legado-E创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kimi Work v3.2.15 并发 Agent 调度机制:基于虚拟线程的任务隔离与资源竞争分析

Kimi Work v3.2.15 并发 Agent 调度机制:基于虚拟线程的任务隔离与资源竞争分析

Kimi Work v3.2.15 并发 Agent 调度机制:基于虚拟线程的任务隔离与资源竞争分析上周在重构内部数据清洗流水线时,团队决定将原本基于 Akka Actor 模型的异步任务系统迁移到 Kimi Work v3.2.15 提供的并行智能体环境。初衷是看中其宣称的「300 个智能体并…

2026/10/2 20:47:12 阅读更多 →
计算机毕设选题推荐:基于Hadoop+Django的贷款审批决策数据挖掘分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习

计算机毕设选题推荐:基于Hadoop+Django的贷款审批决策数据挖掘分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习

✍✍计算机毕设指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!也可以在主页上或文…

2026/10/2 20:47:12 阅读更多 →
论文AI率太高怎么降?有保障承诺的降AI率网站推荐,降AI率没达标全额退回

论文AI率太高怎么降?有保障承诺的降AI率网站推荐,降AI率没达标全额退回

最近毕业季身边不少同学都踩了AI痕迹的坑,尤其在论文查重和AIGC检测上吃了大亏。根据教育部2025年发布的《高等学位论文质量监测年报》,全国本科毕业论文中疑似存在AI痕迹的比例高达29.7%,而硕士论文更是攀升至34.2%。随着政策不断收紧&#…

2026/10/2 20:47:12 阅读更多 →

最新新闻

如何把 Windows 11 任务栏找回经典快速启动工具栏?ExplorerPatcher 8 分钟配置完整指南

如何把 Windows 11 任务栏找回经典快速启动工具栏?ExplorerPatcher 8 分钟配置完整指南

如何把 Windows 11 任务栏找回经典快速启动工具栏?ExplorerPatcher 8 分钟配置完整指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher …

2026/10/2 21:26:36 阅读更多 →
Java 设计模式精讲:基于 Active Object 模式构建高效异步并发系统(附 java-design-patterns 源码剖析)

Java 设计模式精讲:基于 Active Object 模式构建高效异步并发系统(附 java-design-patterns 源码剖析)

示例工程教程 【免费下载链接】java-design-patterns Design patterns implemented in Java 项目地址: https://gitcode.com/GitHub_Trending/ja/java-design-patterns 点击查看 免费下载 导读:本文以开源仓库 java-design-patterns 中的 active-object…

2026/10/2 21:26:36 阅读更多 →
深耕计算机考研,助力码农突围 — 天任考研计算机科学与技术专项集训营正式启航

深耕计算机考研,助力码农突围 — 天任考研计算机科学与技术专项集训营正式启航

计算机科学与技术是近年来考研报考热度最高的专业之一。随着信息技术和人工智能产业快速发展,计算机类研究生就业薪资持续走高,吸引了大量本专业考生和跨专业考生报考。然而,计算机考研竞争异常激烈,408 计算机学科专业基础综合内…

2026/10/2 21:26:36 阅读更多 →
Candle 运行 XLM-RoBERTa 实战:Fill-Mask、Reranker 与文本分类三大任务指南

Candle 运行 XLM-RoBERTa 实战:Fill-Mask、Reranker 与文本分类三大任务指南

人工智能大模型机器学习深度学习本地部署模型推理服务 【免费下载链接】candle Minimalist ML framework for Rust 项目地址: https://gitcode.com/GitHub_Trending/ca/candle 点击查看 免费下载 本文基于 Candle 开源仓库中的 xlm-roberta 示例 与对应源码&#x…

2026/10/2 21:26:36 阅读更多 →
2025五一数学建模竞赛B题实战:矿山数据处理建模全流程与TaoToken辅助代码论文解析

2025五一数学建模竞赛B题实战:矿山数据处理建模全流程与TaoToken辅助代码论文解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 21:26:36 阅读更多 →
全模态数据平台:面向Agent的架构与落地实践

全模态数据平台:面向Agent的架构与落地实践

今年的云栖2026主题是"湖生万物,助力AI",其中被反复讨论的一个核心概念,就是面向Agent的全模态数据平台。做Agent开发的朋友应该都深有体会:模型能力越来越强,可肚子里的"货"却常常不够用。文本、…

2026/10/2 21:25:35 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →