如何在Chrome 138/139及更高版本中继续使用manifest v2扩展

最近Chrome 138正式release了,之前写过《如何在Chrome上强制安装世界最强广告屏蔽插件uBlock Origin》,所以又研究了一下让Chrome继续支持manifest v2方法。Chrome 138是最后能够支持manifest v2的版本,从139版本开始默认禁用manifest v2,但是139、140版本还是有办法让chrome继续支持manifest v2。
1 使用Chrome Enterprise policy来延续manifest v2扩展支持
从Chrome 128每次新版本第一次打开就不会提示“xxx扩不再支持、被停用”。需要在“扩展”里重新启用这个扩展才能使用。如果你不想看到这个提示(manifest v2扩展自动被停用),可以使用Chrome Enterprise policy来禁用Chrome这个动作。
1.1 Windows
选择以下任意一种方式:
方法一:使用命令行
执行下面命令,然后在 Chrome 中打开 chrome://policy/
,点击“重新加载政策”按钮。
reg.exe add "HKLM\SOFTWARE\Policies\Google\Chrome" /v ExtensionManifestV2Availability /t REG_DWORD /d 2 /f
reg.exe query "HKLM\SOFTWARE\Policies\Google\Chrome" /v ExtensionManifestV2Availability
方法二:导入注册表文件
保存下面内容为ExtensionManifestV2Availability.reg
,然后双击这个文件导入注册表。然后在 Chrome 中打开 chrome://policy/
,点击“重新加载政策”按钮。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
“ExtensionManifestV2Availability”=dword:00000002
1.2 Mac
在终端中执行以下命令:
sudo tee /Library/Managed\ Preferences/com.google.Chrome.plist >/dev/null <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ExtensionManifestV2Availability</key>
<integer>2</integer>
</dict>
</plist>
EOF
1.3 Linux
在文件中/etc/opt/chrome/policies/managed/enable-manifestv2.json,添加下面内容:
{
"ExtensionManifestV2Availability": 2
}
这个方法适用于Chrome 110 到138版本
具体请查看 https://chromeenterprise.google/policies/#ExtensionManifestV2Availability
2 使用flag或命令行启用manifest v2扩展支持
虽然从139版本开始无法使用ExtensionManifestV2Availability
(Chrome Enterprise policy),但是还是有办法继续使用manifest v2扩展。
Chrome提供了相关的flag来控制manifest v2废弃的节奏:
- extension-manifest-v2-deprecation-disabled
- extension-manifest-v2-deprecation-unsupported
- extension-manifest-v2-deprecation-warning
在138、139版本中,extension-manifest-v2-deprecation-unsupported
默认为Disabled,extension-manifest-v2-deprecation-disabled
和extension-manifest-v2-deprecation-warning
默认为Enabled。
这些flag最后可用的版本是137,不过Chrome提供了另外的flag(temporary-unexpire-flags-m{$recent_mstones},这里的recent_mstones是前两个版本的版本号)来启用前两个版本过期的flag。
同时提供flag allow-legacy-mv2-extensions
用于开发者能够对manifest v2扩展(未打包的源码)进行维护(迁移、升级等),这个flag默认是Disabled,最后可用版本是139版本。
2.1 使用Flag来启用manifest v2的支持
打开
chrome://flags/#temporary-unexpire-flags-m137
,设置为Enabled重启chrome,打开并设置这些
chrome://flags/#extension-manifest-v2-deprecation-warning [Disabled] chrome://flags/#extension-manifest-v2-deprecation-disabled [Disabled] chrome://flags/#extension-manifest-v2-deprecation-unsupported [Disabled] chrome://flags/#allow-legacy-mv2-extensions [Enabled]
这个方法适用于Chrome 138、139版本
2.2 使用命令行来启用manifest v2的支持
由于flag列表里 temporary-unexpire-flags-m
前缀的flag,只会有两个。即只支持启用前两个版本过期的flag,所以140版本的flag里没有temporary-unexpire-flags-m137
,无法配置这些flags(extension-manifest-v2-deprecation-warning、extension-manifest-v2-deprecation-disabled、extension-manifest-v2-deprecation-unsupported)。
但是在140版本代码中还未删除manifest v2相关的代码,还可以通过命令行中的--disable-features
来禁用相关feature(ExtensionManifestV2Unsupported、ExtensionManifestV2Disabled),从而启用manifest v2的支持。
chrome --disable-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled
这个方法适用于Chrome 131.0.6754.0以上版本,直到chrome完全不支持manifest v2(完全删除manifest v2相关的代码)的前一个版本。
其实在Chrome内部,每个flag对应一个feature,比如flag extension-manifest-v2-deprecation-disabled
对应feature里的ExtensionManifestV2Disabled
。具体的映射关系,可以查看这个代码。
从140.0.1287.0版本开始ExtensionManifestV2Unsupported
默认为Enabled,相关diff [Extensions MV2] Enable “ExtensionManifestV2Unsupported” by default 。
预计142版本可能会完全删除manifest v2相关的代码。
2.3 相关代码
expired_flags_list.cc;l=435-437
生成的temporary-unexpire-flags-m的flag
自动生成temporary-unexpire-flags-m的flag脚本
extension_features.cc;l=83-107
flag-metadata.json;l=4749-4761
CalculateCurrentExperimentStage
3 Reference
https://github.com/uBlockOrigin/uBlock-issues/discussions/3690
https://github.com/uBlockOrigin/uBlock-issues/discussions/2977#discussioncomment-13593599
https://www.reddit.com/r/uBlockOrigin/comments/1itw1bz/end_of_support_for_ubo_on_chrome_chromium/
https://www.reddit.com/r/Adblock/comments/1luqxs1/whats_currently_the_best_way_to_force_reenable/
https://www.tjsky.net/tutorial/1009
https://meta.appinn.net/t/topic/73073
https://tg.okhk.net/posts/6182
https://www.v2ex.com/t/1144737