为什么隐藏广告组件如此简单Morphe Patches的Litho组件过滤器与Protobuf拦截内幕【免费下载链接】morphe-patchesMorphe Patches项目地址: https://gitcode.com/gh_mirrors/mo/morphe-patchesMorphe Patches 是一个专注于给 YouTube / YouTube Music / Reddit 定制功能的补丁集合项目其中最常用的能力之一就是一键隐藏广告、商店横幅等干扰组件。它不靠“删文件”而是通过 Litho 组件过滤器 Protobuf 拦截两套机制在广告数据进入界面之前就把它们过滤掉。本文用尽量通俗的方式带你揭开这个“看起来简单”的背后原理。先搞懂两个名词Litho 是什么Protobuf 又是什么在开始之前先花 30 秒理解两个概念后面一切就都通了 LithoYouTube 客户端使用的一套 UI 组件框架。你看到的每一个视频卡片、横幅、按钮都是一个独立的 Litho 组件由服务器下发描述数据客户端再“拼”成界面。ProtobufGoogle 的数据序列化格式可以理解为服务器和 App 之间传数据的“压缩包”。广告内容就藏在这个数据流里。所以“隐藏广告”这件事本质上只有两种做法要么拦住数据Protobuf 拦截要么拦住界面组件Litho 过滤。Morphe Patches 两者都做了。内幕一Litho 组件过滤器——给每个组件“按地址查户口”核心补丁位于 LithoFilterPatch.kt它的思路非常巧妙每个组件都有“身份证”Litho 组件在创建时带有两个关键信息——identifier组件 ID和path组件路径相当于组件的名字和住址。在组件创建前设卡口补丁在解析组件的解析方法里插入一段钩子逐个检查组件的 ID 和路径命中黑名单就直接返回一个空组件广告卡片就“凭空消失”了。性能优先的匹配运行时的过滤器实现 LithoFilterPatch.java 使用前缀树Trie搜索来匹配 ID 和路径而不是低效的字符串循环即使组件成百上千地刷新也不会卡顿。用补丁文件里的伪代码来看逻辑其实只有两行if (extensionClass.shouldFilter()) { // 命中过滤规则 return emptyComponent; // 返回空组件广告消失 } return originalUnpatchedComponent; // 未命中则正常渲染那么具体的广告名单是谁维护的是各 App 自己的过滤器类比如 YouTube 的 AdsFilter.java里面列出了carousel_ad、_ad_with等大量广告组件的 ID 前缀和路径并且每个开关都由用户在设置里控制对应 HideAdsPatch.kt 中注入的“隐藏通用广告”“隐藏购物链接”等选项。内幕二Protobuf 拦截——在数据源头“删广告”光过滤组件还不够有些广告在数据层就带参数比如商店横幅的图片链接、声明横幅的标记所以项目在 ElementProtoParserHookPatch.kt 中提供了一个更底层的钩子hookElement()它钩住通用的 proto 元素解析方法让每个被解析的 proto 元素都会先经过你的扩展代码扩展代码拿到的是原始字节数组可以检查其中是否含有statement_banner、商店域名片段等广告特征命中就改写或丢弃。以 YouTube 广告补丁为例在 HideAdsPatch.kt 里只有一行声明hookElement($EXTENSION_CLASS-hideStatementBanner)这一行就让“声明横幅”广告在解析阶段被彻底移除。同时补丁还会在 BROWSE、SEARCH、NEXT 等网络请求的端点上挂钩改写请求参数让服务器“少发一点广告相关数据”。为什么能做到“如此简单”关键在指纹机制你可能已经发现上面的补丁代码里几乎看不到任何 YouTube 内部类的真实名字。这正是 Morphe Patches继承自 ReVanced 思路最精妙的部分——指纹Fingerprint。补丁作者不会写死“某个类、某个方法”而是描述一组特征方法调用序列、返回类型、包含的字符串常量等由框架自动在目标 APK 里找出真正的方法。相关指纹定义见 Fingerprints.kt。好处非常直观不怕改名官方升级后内部类名变了只要行为特征没变补丁依然能打多版本兼容同一套过滤器补丁可覆盖 README.md 中列出的多个 YouTube / Music 版本新旧机制自动切换老版本走非原生 ByteBuffer 路径新版本YouTube 20.22走原生 Upb 编码路径补丁根据版本标志自动选择用户完全无感。快速上手如何体验隐藏广告效果克隆补丁仓库补丁需要配合 Morphe 补丁器使用git clone https://gitcode.com/gh_mirrors/mo/morphe-patches使用 Morphe 补丁器对已解包的 YouTube / YouTube Music APK 应用Hide ads等补丁重新打包安装进入 App 的设置页面即可看到“隐藏通用广告”“隐藏商店横幅”等开关。每个补丁的详细描述和兼容版本都可以在 README.md 的补丁列表中查阅YouTube 相关补丁源码集中在 patches/src/main/kotlin/app/morphe/patches/youtube/跨 App 共享的机制则在 patches/src/main/kotlin/app/morphe/patches/shared/。小结简单背后的三层设计层次机制作用数据层Protobuf 拦截hookElement在解析源头删除广告数据组件层Litho 过滤器按 ID/路径命中广告组件返回空组件维护层指纹Fingerprint机制不依赖真实类名跨版本稳定兼容所谓“简单”其实是把复杂留给了补丁框架你只需声明要过滤什么定位、注入、兼容全部由框架自动完成。这也正是 Morphe Patches 这类字节码补丁项目的魅力所在——用几十行声明式代码就能让一个数亿行的商业 App 变得干净清爽。【免费下载链接】morphe-patchesMorphe Patches项目地址: https://gitcode.com/gh_mirrors/mo/morphe-patches创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
