首页/新闻资讯/正文详情

为什么隐藏广告组件如此简单?Morphe Patches的Litho组件过滤器与Protobuf拦截内幕

发布时间:2026/9/26 6:07:02 来源:云帆数科 栏目:资讯中心
为什么隐藏广告组件如此简单?Morphe Patches的Litho组件过滤器与Protobuf拦截内幕
为什么隐藏广告组件如此简单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),仅供参考

相关推荐

冒泡排序教学PPT转可调试C代码的完整实践指南
冒泡排序教学PPT转可调试C代码的完整实践指南

简介:本资源是一份面向计算机专业初学者的数据结构与算法教学课件,聚焦冒泡排序这一经典基础算法,系统讲解其原理、执行过程、时间空间复杂度分析及Java实现。课件内容覆盖排序基本概念、稳定性与效率衡量标准、多趟排序动态演示(… · 2026/9/26 6:06:56

ByteBuddy泛型解析:同名类型变量因声明位置不同导致签名退化
ByteBuddy泛型解析:同名类型变量因声明位置不同导致签名退化

1. 事故现场&#xff1a;接口与方法的同名 T&#xff0c;把返回值解析成了 Object先说结论&#xff1a;在 JVM 眼里&#xff0c;Repo<T>里的T和Repo.<T>resolve(T param)里的T是两条独立的类型变量&#xff0c;共享一个字母只是巧合。这个认知不到位&#xff0c;By… · 2026/9/26 6:06:56

冒泡排序:相邻元素两两比较
冒泡排序:相邻元素两两比较

冒泡排序&#xff1a;相邻元素两两比较软考程序员考试中&#xff0c;冒泡排序是排序算法章节的必考内容。今天我们就来聊聊这个最"温柔"的排序算法——它每次只敢和邻居比一比。一、为什么叫"冒泡"&#xff1f; 想象一锅烧开了的水&#xff0c;底部的气泡一… · 2026/9/26 6:06:56

SSM+Vue就医预约挂号系统毕设复盘:数据库设计、并发扣减与论文答辩要点
SSM+Vue就医预约挂号系统毕设复盘:数据库设计、并发扣减与论文答辩要点

每年三四月份&#xff0c;各大毕业设计群里总有人反复问“有没有好做的选题”“有没有现成的源码”。就医预约挂号系统是这类问题里出现频率最高的题目之一&#xff0c;它经典到每个导师都见过&#xff0c;也正因为经典&#xff0c;如果你只是交一个增删改查的CRUD&#xff0c;… · 2026/9/26 6:37:02

金融服务系统架构实战:账户、交易、对账与风控设计
金融服务系统架构实战:账户、交易、对账与风控设计

金融服务这个赛道&#xff0c;我前前后后做过交易、清结算、账户侧的项目&#xff0c;也算踩过不少坑。很多时候新同学一听"financial-services"&#xff0c;第一反应是高大上的量化交易、投资组合那一套&#xff0c;但实际业务里&#xff0c;最核心、最容易翻车的地… · 2026/9/26 6:37:02

变压器电感线圈设计实战:从磁芯气隙到漏感控制的完整经验
变压器电感线圈设计实战:从磁芯气隙到漏感控制的完整经验

1. 变压器电感线圈在能量转换系统中的真实地位我得先坦白一件事&#xff1a;在电子行业里摸爬滚打这些年&#xff0c;见过太多工程师把变压器当成"铁疙瘩"来用——仿真里放个理想模型&#xff0c;板子上按封装画个库&#xff0c;只要输出电压对了就万事大吉。直到你真… · 2026/9/26 6:37:02

微信图片查流向:从存储去重到内容溯源,一文拆透
微信图片查流向:从存储去重到内容溯源,一文拆透

前几天一个朋友在群里问我&#xff1a;你有没有遇到过那种图&#xff0c;自己发出去之后被人转了一大圈&#xff0c;又回到你面前&#xff1f;我说这不就是绕圈吗&#xff1f;他说不是&#xff0c;我是想查到底是谁传出去的。巧了&#xff0c;微信最近就悄悄上了这么个功能——… · 2026/9/26 6:37:02

从套壳到原生:Agent-Native架构设计与落地实践
从套壳到原生:Agent-Native架构设计与落地实践

最近圈子里一直在刷 agent-native 这个词&#xff0c;我一开始以为又是哪个团队造的新概念&#xff0c;直到自己动手把一个基于大模型的业务系统从“套壳问答”重写成“原生智能体”之后&#xff0c;才真正明白这四个字的分量。它不是指给现有应用挂一个聊天入口&#xff0c;而… · 2026/9/26 6:37:02

Atlas 300V 24G推理加速卡部署YOLOv5全流程解析
Atlas 300V 24G推理加速卡部署YOLOv5全流程解析

上个月我们组评估边缘视觉识别方案&#xff0c;硬件采购清单里放了一张 Atlas 300V 24G。团队第一个问题就抛给我&#xff1a;这卡到底是不是运算加速卡&#xff1f;我当时也觉得奇怪&#xff0c;24G显存听着挺唬人&#xff0c;怎么有人连这都要问。等我真正把驱动装好、用 YOL… · 2026/9/26 6:36:56

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介&#xff1a;万常选版《数据库原理与设计》课后习题答案资源&#xff0c;覆盖第2至6章及第9章&#xff0c;适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件&#xff0c;含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

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

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故&#xff0c;是很多团队绕不过去的坎。线上环境里&#xff0c;服务端明明已经上线了新版接口&#xff0c;老的移动端还在照着旧文档传参数。请求一到网关&#xff0c;校验直接拒绝&#xff0c;用户操作失败&#xff0c;客服群炸了锅&#xff0c;开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码