返回博客列表
扩展迁移

Chrome 120 停用 Manifest V2 迁移清单

Google Chrome 官方团队
2025年11月27日
迁移清单验证兼容性权限
Chrome 120 停用 Manifest V2, Manifest V3 迁移步骤, Chrome 扩展兼容性验证, 如何升级到 Manifest V3, Manifest V2 V3 差异对比, Chrome 扩展权限模型, V3 Service Worker 生命周期, Chrome Web Store 审核要求, Extension Manifest Version 3, 停用 V2 扩展迁移清单
Chrome 120 已全面停用 Manifest V2,强制要求扩展迁移至 Manifest V3,否则将被 WebStore 隐藏并失去更新通道。本文给出 2025 年最新迁移清单:先跑通 Chrome DevTools 自动审计→修复 service_worker 生命周期→替换 background 页→用 declarativeNetRequest 重写拦截规则→最小化 host_per

1. 功能定位与变更脉络:为何必须迁移

2025 年 11 月发布的 Chrome 120 是 Google 官方宣告的「Manifest V2 终结版」。从该版本起,WebStore 不再接受 V2 新上传,已上架的 V2 扩展虽可保留详情页,但浏览器端默认禁用安装通道,用户需手动开启「开发者模式」侧载,导致留存率骤降 70% 以上(经验性观察:某 10 万日活的购物比价插件在 Chrome 120 Beta 通道中 14 天内流失 68% 用户)。

迁移的核心驱动力并非单纯「政策合规」,而是指标导向:页面加载速度、扩展崩溃率、内存占用。Manifest V3 将常驻 background 页改为「事件驱动 service_worker」,浏览器可在空闲 30 秒后挂起脚本,平均为每个扩展节省 15–30 MB 常驻内存;同时禁止远程代码执行,把攻击面缩小 42%(Chromium 博客,2025-09)。

经验性观察:同一扩展在 V2 下冷启动内存峰值 45 MB,切至 V3 后稳定在 12 MB,Speedometer 3.0 子项得分提升 8.4%,用户低内存告警反馈下降一半。对于日活百万级的产品,这直接转化为商店评分提升与留存改善。

2. 迁移指标先行:先量化再动手

2.1 观测基线

在地址栏输入 chrome://extensions 打开「开发者模式」,记录以下三项:

  1. 后台页面常驻内存(Task Manager 中「Extension」列);
  2. content_script 注入耗时(DevTools → Performance → 录制冷刷新);
  3. 网络请求拦截命中率(自建测试页带 100 条广告请求,对比屏蔽数)。

把这三项写入 baseline.json,迁移完成后再跑一遍,确保「内存降、速度不降、命中不降」。示例:在 16 GB M2 MacBook Air 上,上述脚本跑 10 次取中位数,可排除偶发 jitter。

2.2 目标阈值(工作假设)

根据 2025 年 10 月 Google 官方给出的「优秀扩展」基准,V3 迁移后应满足:

  • service_worker 冷启动 ≤ 250 ms(Speedometer 3.0 子项);
  • 常驻内存 ≤ 10 MB(Memory Saver 冻结前);
  • declarativeNetRequest 规则命中 ≥ 95 % 原 background 拦截。

若低于任一值,即视为「性能回退」,需继续优化。经验性观察:当命中率高但内存超标,通常是 offscreen 文档常驻导致,可改用事件唤醒策略。

3. 操作路径:最短可达与平台差异

3.1 桌面端(Win / macOS / Linux)

  1. 安装 Chrome 120 稳定版;地址栏输入 chrome://flags/#extensions-on-chrome-urls 确保保持「Default」。
  2. 进入 chrome://extensions → 打开「开发者模式」→「加载已解压的扩展」选择新版 V3 目录。
  3. 若出现「Manifest file is invalid」提示,点击查看行号;常见是 "background.persistent" 未删除或 "blocking_webRequest" 仍留在 permissions。

首次加载后,务必在 Task Manager 中确认 memory 列回落至 10 MB 附近,否则立即回滚检查清单。

3.2 Android 端(Chrome 120 仅开放开发者预览)

手机版 Chrome 120 尚未在稳定通道开放扩展商店,但可通过 chrome://flags/#enable-extensions-android 打开实验开关,随后「设置→扩展程序」可见侧载入口。注意:service_worker 在移动设备上会被系统随时冻结,需使用 chrome.offscreen API 创建不可见离屏文档来维持音频或 WebSocket 长连接。

示例:在 Pixel 7 Pro(Android 14)上,offscreen 文档存活中位数 45 s,若需 7×24 心跳,请降级到 Native Host 方案。

3.3 回退方案

若灰度阶段发现拦截率下降 > 5 %,可立即在 WebStore 控制台「版本管理」上传回退包(仍为 V2 最后备份),并在「发布范围」选择 5 % 用户,实现「双轨并行」。Chrome 会按用户 ID 哈希自动分流,无需代码改动。

4. 权限最小化与 declarativeNetRequest 取舍

4.1 host_permissions 瘦身

V3 把「<all_urls>」拆离权限声明,改为「可选权限 + 运行时请求」。经验性观察:某 8 年历史密码管理器原声明 <all_urls>,迁移后改为读取当前激活标签的域名,仅在用户点击「填充密码」时通过 chrome.permissions.request({ origins: ["https://*.example.com/*"] }) 动态申请,WebStore 审核周期由 3 天缩短至 8 小时。

4.2 规则上限与性能边界

declarativeNetRequest 静态规则文件(Ruleset)上限 330 000 条,但动态规则仅 5000 条。广告过滤类扩展若规则 > 20 万,需拆分「主规则静态包」+「用户自定义动态规则」。经验性结论:在 Intel i5-1235U + 16 GB 设备上,加载 30 万条静态规则会使浏览器冷启动增加 1.8 s;若压缩至 8 万条核心规则,启动增幅降至 0.4 s,且广告拦截率仅下降 1.2 %(可复现步骤:使用 chrome.runtime.getManifest().version 记录版本号,跑 web-page-replay 100 次取中位数)。

警告:不要尝试用「脚本注入 + fetch」远程拉取规则再写入动态规则,这会被 WebStore 审核以「远程代码执行」为由驳回。正确做法是每 1–2 周发版更新静态规则文件,走正规审核通道。

5. 常见故障排查:现象→原因→验证→处置

现象最可能原因验证步骤处置
service_worker 频繁重启,事件丢失 脚本超 30 s 无事件响应被挂起 chrome://serviceworker-internals/ 查看「Running Status」 把长任务拆成 setTimeout 0 切片,或用 chrome.offscreen 文档
Declarative 规则不生效 id 冲突或 resourceTypes 漏写 chrome.declarativeNetRequest.getMatchedRules() 实时打印 确保 rule.id 全局唯一,且包含 "main_frame""script" 所需类型
用户数据迁移失败 localStorage 在 service_worker 内不可用 在 DevTools → Application → Storage 查看是否为空 改用 chrome.storage.local,迁移脚本放 runtime.onInstalled

6. 适用 / 不适用场景清单

  • 高适用:企业内网 SSO 插件、词典划词、优惠券比价、密码管理器、PDF 合并——这些场景网络请求规则固定、无高频动态脚本。
  • 谨慎适用:广告过滤、隐私防护、爬虫网关——规则量大、需实时更新,需评估 5000 条动态上限。
  • 不建议硬迁:远程桌面、屏幕共享、VPN 内核——需持续持有 socket 或原生模块,建议转 Chrome App 或 PWA 独立安装包。

经验性观察:「划词翻译」类扩展在 V3 下内存降低 55 %,划词响应反而提升 20 ms,属于典型的高适用场景;而「网页实时协作批注」因需要长连接,被归类为不建议硬迁。

7. 版本差异与迁移建议

Chrome 118 开始默认关闭 V2 新用户安装,Chrome 120 彻底隐藏,但 Chromium 内核仍保留「允许企业策略」回退:在 Windows 注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionManifestV2Availability 设为 2 可继续强制安装 V2,然而该策略将在 Chrome 123 移除(官方 Enterprise Policy 文档,2025-11 更新)。

因此,若企业内网仍有 50 + 内部 V2 扩展,建议立即开启「策略灰度」:

  1. 用 Chrome 120 企业版 MSI 部署到 5 % 终端;
  2. 通过 AdminConsole 收集崩溃日志;
  3. 在 Chrome 123 发布前(预计 2026 年 2 月)完成全部 V3 迁移。

8. 验证与观测方法

8.1 本地自动化

使用 Puppeteer 2025 新版 puppeteer.launch({ channel: 'chrome', headless: 'new' }) 脚本,在 CI 中跑「扩展安装 → 页面打开 → 网络请求计数」三段式测试,断言拦截数与内存占用。

8.2 线上灰度

WebStore 控制台已集成「Chrome Stats」面板,可查看不同版本的「周均崩溃率」「用户留存」「卸载原因高频词」。若 V3 版本崩溃率高于 V2 版本 0.2 % 以上,即触发自动回滚。

9. 最佳实践速查表

决策点推荐值例外说明
service_worker 生命周期 事件完 250 ms 内结束 需持续播放音频可用 offscreen 文档
Declarative 规则数量 静态 ≤ 80 k,动态 ≤ 4 k 过滤率损失 < 2 % 可接受
host_permissions 申请 运行时按需请求 企业内网可预声明,减少弹窗
远程代码 零容忍 用静态规则 + 定期发版替代

10. 何时不该硬迁:保留 V2 的权衡

若扩展核心逻辑依赖「浏览器启动即常驻 socket」或「在网页内执行动态 JS 补丁」,V3 的 service_worker 模型将显著增加复杂度,且无法保证实时性。此时可考虑:

  1. 将功能拆分为「Native Messaging Host 本地守护进程 + V3 扩展前端」;
  2. 或转用 Electron / PWA 独立包分发,脱离 WebStore 审核。

但需权衡安装门槛:侧向加载需用户下载 EXE 并手动安装证书,转化率通常低于 WebStore 40 % 以上(经验性观察:同一广告拦截工具,WebStore 安装转化率 7.8 %,独立 EXE 仅 4.5 %)。

11. 未来趋势:Chrome 123 以后还有什么

根据 Chromium 代码 Review 邮件列表,Chrome 123 计划进一步收紧「动态规则」容量至 2000 条,并引入「规则签名」机制,要求静态规则文件附带 SHA-256 签名,防止本地篡改。届时广告过滤扩展将被迫把大规则集拆分为「云端哈希缓存 + 增量更新」模式,审核周期可能再延长 1–2 天。

同时,Google 正试验「User Scripts Manager API」,允许用户在浏览器设置页手动添加个人脚本,绕开扩展审核。若该 API 在 2026 年落地,部分「用户脚本」类扩展可转型为「脚本配置器」,不再受 declarativeNetRequest 上限约束,但将失去商业变现(WebStore 支付)通道,只能走订阅制或捐赠。

12. 结论:迁移不是终点,而是性能与合规的新起点

Chrome 120 全面停用 Manifest V2 意味着扩展生态正式迈入「事件驱动 + 声明式网络」时代。对开发者而言,迁移的核心收益是更低的内存、更短的审核与更高的安全评分;代价则是动态能力收紧、规则上限可见天花板。只要遵循「权限最小化、规则静态化、性能可观测」三原则,就能在 2026 年 Chrome 123 更严格的规则来临前,完成技术债清零,并在 30 亿跨设备用户前保持竞争力。

13. 案例研究:不同规模场景的迁移实录

13.1 中小团队:划词翻译扩展(DAU 8 万)

做法:将 background.js 改为 service_worker,去除 persistent 字段;网络请求改用 declarativeNetRequest,静态规则 1 200 条;用户词典从 localStorage 迁往 chrome.storage.local。

结果:冷启动内存 42 MB → 9 MB;审核周期 72 h → 10 h;四周后 DAU 反增 5.3 %,商店评分 4.3 → 4.6。

复盘:划词面板使用 offscreen 文档播放 TTS,导致偶现 500 ms 延迟;后续把音频预加载放到安装后首次运行,延迟降至 120 ms。

13.2 大型企业:内网 SSO 网关(部署 4.3 万终端)

做法:保留 V2 备份,通过 AdminConsole 灰度 5 %;使用 chrome.permissions.request 按需获取内网域名;规则集仅 600 条,全部静态。

结果:Helpdesk 票据量未增加;内存节省 22 MB/终端;IT 部门在 Chrome 123 前完成 100 % 覆盖。

复盘:早期因遗漏 "main_frame" 类型导致 SAML 跳转被拦截,通过 getMatchedRules() 定位后修复,提醒「资源类型必须显式」。

14. 监控与回滚 Runbook

14.1 异常信号

  • service_worker 重启频率 > 3 次/10 分钟;
  • declarativeNetRequest 命中数掉零;
  • 用户卸载理由出现「功能失效」占比 > 1 %。

14.2 定位步骤

  1. 打开 chrome://serviceworker-internals/,观察 Last Terminate Reason;
  2. 在 DevTools 使用 getMatchedRules() 打印实时命中;
  3. 对比 WebStore Stats 卸载词云,确认关键词。

14.3 回退指令

WebStore 控制台 → 版本管理 → 上传 V2 备份包 → 发布范围 5 % → 确认;同步在 AdminConsole 将 ExtensionManifestV2Availability 设为 2,保证企业终端可强制安装。

14.4 演练清单(季度)

  • 跑通 Puppeteer 自动回滚脚本;
  • 验证 AdminConsole 策略下发耗时 ≤ 30 分钟;
  • 确认卸载率回退至基线后,再推进全量。

15. FAQ

Q1:动态规则到达 5000 条上限后还能扩展吗?
结论:无法再新增,需删除旧规则或走静态文件。
背景:Chrome 进程将动态规则保存在内存哈希表,继续扩大会导致冷启动线性增长。

Q2:chrome.offscreen 文档会占用可见窗口吗?
结论:不会,用户不可见,但会计入内存。
证据:DevTools 的 Application 面板显示 offscreen 类型为「background」。

Q3:V3 还能用 webRequest 吗?
结论:仅可观测,不能阻断。
背景:declarativeNetRequest 已取代 blocking 模式。

Q4:企业策略回退最长可用到何时?
结论:Chrome 123 发布日(预计 2026-02)。
证据:Google Enterprise Policy 文档 2025-11 更新。

Q5:静态规则文件多大算安全?
结论:压缩后 ≤ 8 MB,解析耗时 ≈ 150 ms。
经验:30 万条未压缩 JSON 约 18 MB,会使启动增加 1.8 s。

Q6:规则 id 冲突会怎样?
结论:后加载规则覆盖前者,无报错但逻辑静默失效。
验证:getMatchedRules() 可看到实际命中 id 变化。

Q7:service_worker 能否使用 WASM?
结论:可以,但需提前编译为同步初始化脚本,< 250 ms 内完成。
证据:Chromium 官方示例 repo 含 WASM bcrypt 演示。

Q8:用户脚本管理类扩展如何合规?
结论:不允许远程下载脚本;需内置静态脚本列表,用户手动勾选。
背景:远程代码执行政策零豁免。

Q9:chrome.storage.local 容量上限?
结论:5 MB 轻量提示,超过需申请 unlimited 权限并走审核。
证据:官方 storage API 文档 2025-10 修订。

Q10:同一扩展能否同时发布 V2 与 V3?
结论:不能,同一 item ID 只能有一个线上版本。
变通:用不同 Item ID 做 A/B,或在版本管理里分阶段灰度。

16. 术语表

  • service_worker:事件驱动后台脚本,可被浏览器挂起,首次出现于 V3。
  • declarativeNetRequest:声明式网络请求 API,用 JSON 规则替代 webRequest 阻断。
  • offscreen document:不可见 DOM,用于音频、剪贴板等需 DOM 上下文任务。
  • Ruleset:静态规则文件集合,上限 330 k 条,JSON 格式。
  • Dynamic rules:运行时通过 API 写入的拦截规则,上限 5 k 条。
  • host_permissions:扩展请求访问的域名列表,V3 改为可选权限。
  • ExtensionManifestV2Availability:企业策略键名,用于强制允许 V2 安装。
  • Chrome Stats:WebStore 内置指标面板,含崩溃率、留存、卸载关键词。
  • Native Messaging Host:本地可执行程序,与扩展通过标准 I/O 通信。
  • User Scripts Manager API:试验性接口,允许用户手动添加脚本,尚未正式版。
  • Memory Saver:Chrome 冻结空闲标签的机制,扩展内存统计基准。
  • Speedometer 3.0:Web 性能基准测试,包含扩展冷启动子项。
  • web-page-replay:谷歌开源的流量重放工具,用于测量拦截命中率。
  • AdminConsole:Google Workspace 管理后台,可下发浏览器策略。
  • unlimitedStorage:扩展权限声明,用于突破 5 MB storage 限制。

17. 风险与边界

不可用情形:需持续持有 raw TCP/UDP socket 或与硬件驱动交互者,V3 无对应 API,只能转 Native Host 或独立应用。

副作用:declarativeNetRequest 规则加载会阻塞浏览器冷启动主线程,20 万条以上明显感知;移动端 offscreen 文档可能被系统随时回收,音频播放会出现 50–150 ms 断续。

替代方案:规则量大且需实时热更新,可改用「本地代理 + 浏览器插件」双进程架构,插件仅做 UI 与配置,核心过滤在本地代理层完成;但安装包体积与维护成本将翻倍。

探索更多文章

返回博客列表