ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Titanium Browser 补丁机制深度剖析:patch.sh 如何用 100+ 条 sed 规则魔改 Chromium 源码

Titanium Browser 补丁机制深度剖析:patch.sh 如何用 100+ 条 sed 规则魔改 Chromium 源码 Titanium Browser 补丁机制深度剖析patch.sh 如何用 100 条 sed 规则魔改 Chromium 源码【免费下载链接】android-titanium-browserSecure open-source Android browser with support for extensions项目地址: https://gitcode.com/gh_mirrors/an/android-titanium-browserTitanium Browser 是一款基于 Chromium 的开源 Android 浏览器主打安全、开源与桌面级扩展支持。它的核心补丁机制藏在一份 patch.sh 脚本里不维护完整的 fork 代码树而是用近百条for 循环展开后接近 100 条sed规则对 Chromium 上游源码做外科手术式的定点修改从而在手机上装扩展、开桌面模式、解锁实验特性。这篇文章带你拆解这套补丁机制的设计思路与每一类规则的具体用途。一、什么是不 fork 代码的补丁机制Chromium 源码动辄上亿行完整 fork 后每次跟上游都是噩梦。Titanium Browser 的策略是分层叠加README.md 里的实现流程图清晰地展示了三层结构层次位置职责Vanadium 通用补丁vanadium/大批量.patch文件负责隐私与安全加固补丁脚本patch.sh100 条 sed 规则做细粒度功能开关与体验修复构建配置args.gnGN 构建参数决定编译成什么形态的浏览器patch.sh的特点规则即注释。每条sed后面往往跟着一行# 用途备注如# scheme guard、# virt、# ntp整份脚本就是一份可读性极高的修改清单新人也能快速看懂它到底动了 Chromium 的哪些地方。二、读懂一条 sed 规则三种基本招式sed是文本流编辑器脚本中 80 余条独立sed -i命令另有 for 循环批量生成的规则主要用三种写法理解它们就能读懂整个机制字符串替换s|旧文本|新文本|—— 最常用。例如把某处判断条件整体改写让原本被禁用的功能变为放行删除行/匹配模式/d—— 干脆利落地删掉不想要的代码行patch.sh 第 20 行 就是这样删除语言设置页的一个偏好项的插入行/匹配模式/a\新代码—— 在锚点行后面塞进一段新逻辑第 76 行 就是往下载校验函数里插入了一段允许从第三方扩展商店安装的白名单判断。 这种锚点定位 文本替换的方式对版本漂移有天然容错只要上游代码里那个锚点字符串还在规则就能命中比维护大段 diff 的 patch 文件更抗漂移。三、这 100 条规则到底改了什么3.1 扩展支持让桌面扩展跑在手机上 这是 patch.sh 的重头戏也是浏览器能装 uBlock Origin 等扩展的根本原因相关规则几乎都集中在# ext:注释分组下复活 Manifest V2把 MV2 弃用状态从硬性禁用改回kNone并将测试开关g_allow_mv2_for_testing置为true让旧扩展可以安装patch.sh#L71-L73开放商店外安装往download_crx_util.cc里插入一段逻辑允许从 Opera、Edge 等第三方扩展市场下载.crxpatch.sh#L76工具栏与弹窗在 XML 布局里插入扩展按钮占位、把弹窗锚点从按钮改为容器视图、手机上让弹窗直接占满全屏patch.sh#L79-L101隐私窗口支持把扩展进程与无痕模式的绑定判断强制放行让扩展可以在 Incognito 下运行patch.sh#L111-L112本地化与加载修复修复扩展locales目录以content://URI 打开时路径拼接失败的问题并跳过安装对话框的父窗口断言patch.sh#L118-L128。上面就是补丁生效后的实际效果手机浏览器里出现了完整的chrome://extensions管理页扩展的加载、卸载、详情一应俱全。3.2 桌面模式与特性解锁 构建参数 args.gn 第 2 行 设置了is_desktop_android truepatch.sh 则负责把桌面形态真正用起来批量开启特性往chrome_browser_field_trials.cc的桌面特性覆盖块中一次性插入 10 个EnableFeature包括底部导航栏、画中画、屏幕共享、启动时加载全部标签页等patch.sh#L35-L48给实验旗标续命Chromium 的chrome://flags实验项到期会自动失效脚本用一个 for 循环把 10 个实验旗标的expiry_milestone批量改为-1永不过期循环一次展开就是 10 条规则patch.sh#L29-L31地址栏站点搜索把kOmniboxSiteSearch从测试启用/默认关闭改成默认启用让地址栏支持直接搜站内内容patch.sh#L32-L33开发者入口强制显示开发者菜单与 DevTools 入口方便调试扩展patch.sh#L54-L58。3.3 移动端体验细节打磨 扩展页自适应给extensions.html注入viewportmeta 标签把扩展卡片宽度、工具栏输入框从固定像素改成96%让chrome://extensions在手机竖屏下不再出现横向滚动patch.sh#L64-L68协议守卫在启动意图分发链路上插入URLUtil.isNetworkUrl检查防止非网络协议如恶意intent://劫持打开patch.sh#L23-L25视频自动播放直接屏蔽渲染进程侧的自动播放判断减少移动端视频动不了的情况patch.sh#L61PDF 打开支持往AndroidManifest.xml注入application/pdfMIME 类型让浏览器可以直接接管 PDF 文件patch.sh#L7。3.4 上游 Bug 修复 脚本中还有一批标注了crbug.com编号的定点修复说明补丁机制同样承担上游还没修的问题无痕窗口下标签页列表的use-after-free崩溃新增HasLiveWebContentsForBrowserContext检查销毁 OTR Profile 前确认无存活的 WebContentspatch.sh#L156-L162无痕模式返回键行为错误patch.sh#L151API 31 下混合 Profile 类型导致的兼容问题patch.sh#L165-L166存储访问框架SAF打开未打包扩展的树形路径兼容patch.sh#L148。3.5 品牌定制连图标颜色都是算出来的 品牌层同样靠脚本驱动AndroidManifest.xml注入extractNativeLibsfalse以加快安装patch.sh#L6而应用图标则更巧妙——res/icon.sh 用 ImageMagick 从原始 PNG 中采样出深/中/浅三个色值再用sed把 res/icon.svg 里的占位色号批量替换掉最终渲染出与品牌色一致的主题化图标。一条脚本链实现了换色不换图。四、执行流程版本判断 → 打补丁 → 打标记补丁脚本的运行时行为由 common.sh 提供支撑SCRIPT_DIR定位脚本目录保证路径可移植版本分支version_lt函数common.sh#L27-L29比较 Chromium 版本patch.sh 据此对新旧版本执行不同的锚点规则——比如新标签页NTP覆盖判断在 152 版本前后的源码写法不同第 131~136 行 就是为这种差异准备的 if/else 分支扩展打包extensions/ 目录把内置扩展打成bundled.json索引并注入构建extensions/BUILD.gn运行时由 extensions/stage_bundled_extensions.inc 读取 APK 内资源、解压到扩展目录并写入偏好配合 patch.sh 第 13~17 行 对BUILD.gn和external_pref_loader.cc的注入完成出厂预装完成标记最后一行export PATCHED1patch.sh#L168让构建系统感知补丁已生效防止重复执行。五、为什么选 sed而不是传统 patch 文件对比一下就明白了大改动用 patch小改动用 sedVanadium 层用patches/*.patch承载成块的新功能代码patch.sh 只负责改一行、删一行、插一段级别的修改职责边界清晰可审查性极强每条规则一行 注释代码评审时 10 分钟就能看完全部改动意图抗版本漂移锚点字符串命中即成功失败时sed静默跳过配合version_lt分支跟上游升级的成本极低构建即文档脚本本身不需要任何解释文档它就是 Titanium Browser 相对上游的全部差异。小结 一句话总结Titanium Browser 的patch.sh用近百条可注释、可审查、抗漂移的 sed 规则把手机上装扩展、开桌面模式、修上游 Bug这类需求变成了 168 行 shell 脚本。对想魔改 Chromium 却不敢 fork 百万行源码的开发者来说这套补丁脚本化的思路非常值得借鉴——改代码之前先想清楚能不能只改那一行。项目采用 LICENSE 协议开源如果你也想动手构建仓库提供了完整的构建脚本与 args.gn 配置照着 CI 流程即可在 Ubuntu 上编译出签名 APK。【免费下载链接】android-titanium-browserSecure open-source Android browser with support for extensions项目地址: https://gitcode.com/gh_mirrors/an/android-titanium-browser创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表