ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Fulguris广告拦截源码深度剖析:ABP过滤器匹配引擎完整指南

Fulguris广告拦截源码深度剖析:ABP过滤器匹配引擎完整指南 Fulguris广告拦截源码深度剖析ABP过滤器匹配引擎完整指南【免费下载链接】Fulguris⚡Web Browser项目地址: https://gitcode.com/gh_mirrors/fu/FulgurisFulguris 是一款极致轻量的开源 Android 浏览器它的广告拦截能力完全构建在 ABPAdblock Plus过滤器语法之上。这篇文章将带你深入 Fulguris 源码拆解从网络请求拦截到过滤器匹配引擎的完整链路为什么它能毫秒级判定一个请求是广告被拦截的广告又是怎么被空资源替换的即使你从未读过 Kotlin也能看懂这套匹配引擎的设计精髓。Fulguris 广告拦截模块整体架构广告拦截的全部代码集中在两个包中模块路径职责拦截管理器AbpBlockerManager.kt请求入口、第三方检测、响应生成判定引擎AbpBlocker.kt五级优先级决策链用户规则AbpUserRules.kt类似 uBo 的动态过滤列表更新AbpListUpdater.kt下载/解析 EasyList 等过滤列表匹配引擎FilterContainer.kt标签索引 域名哈希查找统一过滤器UnifiedFilter.kt内容类型/第三方/域名三重校验匹配引擎部分源自 Yuzu 浏览器并做了深度优化位于app/src/main/java/jp/hazuki/yuzubrowser/adblock/目录。第一关拦截每一个网络请求一切从AdBlocker接口开始。AdBlocker.kt 只定义了一个方法shouldBlock(request, pageUrl)——浏览器每发起一个资源请求都会先问它这个请求能放行吗AbpBlockerManager.kt 的shouldBlock做了三件关键事白名单短路特殊 URL、应用内 scheme、favicon 缓存目录直接放行不进入匹配流程构造ContentRequest把原生请求包装成引擎能理解的结构包含 URL、页面主机、内容类型位掩码、第三方标志第三方判定用 PublicSuffix 公共后缀库比较两个域名的 effective TLD1 是否相同结果放入容量 100 的 LRU 缓存避免重复计算内容类型用位运算表示定义在 ContentRequest.kt脚本是0x02、图片是0x04、文档是0x20……多个类型可以用or组合一次位与运算就能判定类型是否命中。第二关ABP 过滤器匹配引擎如何工作引擎的核心是FilterContainer——一个按标签分桶的哈希表。每条 ABP 过滤器加载时会由 Tag 类 根据模式生成最优标签纯域名过滤器标签就是域名本身同标签的过滤器用next指针串成链表。匹配时 FilterContainer.get 分两条快速路径域名链查找从请求域名的完整形式逐级向上截取ads.example.com→example.com→com每一级只做哈希表 O(1) 查找——这正是||example.com^这类规则秒判的秘诀标签桶遍历若容器混有非域名规则再按请求 URL 生成的标签集合遍历对应桶命中候选过滤器后UnifiedFilter.isMatch 执行三重短路校验contentType and request.type位与运算——类型不符直接返回 falsecheckThird——是否匹配第一方/第三方约束checkDomain——页面域名是否在过滤器的域名白/黑名单内全部通过才比对 URL 模式忽略大小写的规则会预先小写化 URL避免运行时重复转换。此外容器还维护一个domainOnly标志纯域名列表可以跳过标签遍历源码注释标明这让加载提速 20–50%。第三关五级优先级的决策链AbpBlocker.shouldBlock 是整条链路的大脑判定顺序严格遵循 ABP 规范用户规则 → important白名单 → important拦截 → 普通白名单 → 普通拦截 → 修改过滤器各桶的文件前缀定义在 AbpUtils.ktb_拦截、w_白名单、i_/ia_important 拦截/放行、m_/me_修改/修改例外以及r_/re_重定向。其中有个容易忽略的细节important 拦截会被页面级例外规则否决第 30–35 行这与 AdGuard 官方文档的行为保持一致。而用户规则拥有最高优先级——AbpUserRules.kt 实现了 uBo 风格的动态过滤每条规则就是一个独立过滤器以页面主机作为标签实现只在这个网站屏蔽这个域名的精细控制。第四关被拦截的请求去哪了拦截不等于拒绝而是资源替换。AbpBlockerManager.kt 按内容类型返回不同的空包图片 → 1x1 透明 gif脚本 → 空noop.js媒体 → 静音的noop-0.1s.mp3iframe → 空noop.html这些占位资源存放在app/src/main/assets/blocker_resources/BlockerResponse.kt 还支持把 Google Analytics、Chartbeat 等追踪脚本重定向到对应的解毒空脚本。若是主框架整个页面被拦则生成一个自带样式的说明页展示被拦 URL 和拦截原因恶意软件列表/广告列表/用户规则见 createMainFrameDummy。进阶能力修改过滤器与列表自动更新修改过滤器能做的不止拦截。removeparam可以剥离 URL 中的追踪参数如 Facebook 的fbclid$header系列可以增删请求/响应头。当 ModifyResponse 生效时浏览器会用 OkHttp 重新发起修改后的请求——因为WebResourceRequest本身不可变只能代理转发。过滤列表更新由 AbpListUpdater.kt 负责用If-Modified-Since头做增量检查服务器返回 304 即跳过下载尊重仅 Wi-Fi 更新设置流量计费网络不自动更新列表若不是 ABP 格式自动回退到 HostsFileParser 解析 hosts 文件加载时用bf_badfilter 前缀清洗误杀规则并把各列表合并去重成联合列表避免每次请求重复扫描多个文件总结这套广告拦截引擎值得学什么位掩码代替 if-else内容类型、第三方属性全部用整数位运算判定成本趋近于零哈希分桶 域名链纯域名规则只需几次哈希查找这是大规模列表仍保持流畅的关键五级决策链用户规则 important 白名单 黑名单语义清晰且易于扩展资源替换而非粗暴拒绝按类型返回占位资源页面布局不会塌陷从 AbpBlockerManager.kt 的请求入口到 FilterContainer.kt 的匹配核心Fulguris 用不到千行代码实现了一个教科书级的 ABP 过滤引擎——对想理解浏览器广告拦截原理的你来说这是绝佳的学习样本。【免费下载链接】Fulguris⚡Web Browser项目地址: https://gitcode.com/gh_mirrors/fu/Fulguris创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表