如何将Chrome扩展预打包进自行编译的Chromium分发包?
我之前帮团队搞定过把自定义Chrome扩展预打包进编译版Chromium的需求,确实论坛上的零散信息不够完整,我把亲测有效的步骤整理给你:
1. 准备工作:规范你的扩展文件
首先确保你的扩展符合Chromium内置扩展的要求:
- 移除
manifest.json里的update_url字段(内置扩展不需要自动更新) - 如果用Manifest V3,确认Chromium源码版本支持(建议用对应版本的Chromium源码,避免兼容性问题)
- 把扩展的所有文件(manifest、js、html、资源等)整理到一个单独的文件夹,比如命名为
my_custom_extension
2. 将扩展放入Chromium源码目录
把你的扩展文件夹放到Chromium源码的chrome/common/extensions/extensions/目录下,这个目录是Chromium存放官方内置扩展的地方,我们的自定义扩展也放在这里。
3. 配置内置扩展列表
需要修改两个核心文件,让Chromium编译时识别你的扩展:
3.1 修改chrome/common/extensions/builtin_extensions_list.h
打开这个头文件,在kBuiltInExtensions数组里添加你的扩展信息:
constexpr BuiltInExtension kBuiltInExtensions[] = { // 保留原有官方扩展的条目 {"abcdefghijklmnopqrstuvwxyzabcdef", "extensions/my_custom_extension", BuiltInExtension::Type::kComponent, base::Time::UnixEpoch()}, // ...其他扩展 };
- 第一个字符串是你的扩展ID,可以通过Chrome加载未打包的扩展后,在
chrome://extensions里查看(开启开发者模式就能看到) - 第二个字符串是扩展在源码里的相对路径(就是我们刚才放的
extensions/my_custom_extension) Type::kComponent表示这是一个组件扩展,内置在Chromium中
3.2 为扩展添加BUILD配置
在你的扩展文件夹my_custom_extension里新建一个BUILD.gn文件,内容如下:
import("//chrome/common/extensions/extension_resource.gni") extension_resource("my_custom_extension") { sources = [ "manifest.json", "background.js", "popup.html", "popup.js", // 列出你的扩展所有需要打包的文件,包括图片、css等资源 ] root_dir = "." }
这个文件告诉Chromium的编译系统要把哪些文件打包进最终的二进制里。
3.3 更新主BUILD文件
打开chrome/browser/BUILD.gn,找到builtin_extensions数组,添加你的扩展:
builtin_extensions = [ // 保留原有条目 "//chrome/common/extensions/extensions/my_custom_extension", ]
4. 处理敏感权限(如果你的扩展需要)
如果你的扩展用到了敏感权限(比如tabs、webRequest等),需要在chrome/common/extensions/permissions/builtin_extension_permissions.h里添加权限声明,避免Chromium启动时阻止扩展:
constexpr const char* kMyCustomExtensionPermissions[] = { "tabs", "webRequest", // 你的扩展需要的权限 };
然后在builtin_extension_permissions.cc里把这个数组关联到你的扩展ID:
constexpr BuiltInExtensionPermissions kBuiltInExtensionPermissions[] = { // 原有条目 {"abcdefghijklmnopqrstuvwxyzabcdef", kMyCustomExtensionPermissions}, };
5. 编译Chromium
按照正常的Chromium编译流程执行编译命令,比如:
autoninja -C out/Default chrome
编译完成后,启动生成的Chromium,打开chrome://extensions(开启开发者模式),你会看到你的自定义扩展已经被内置加载了,不需要再用Selenium安装CRX。
常见坑点提醒
- 扩展ID一定要准确,否则Chromium无法识别
- Manifest版本要和Chromium源码版本兼容(比如Chromium 110+推荐Manifest V3)
- 如果扩展有依赖的第三方库,要确保这些库也被打包进扩展目录,或者在BUILD配置里正确引用
- 测试时可以用
--enable-logging=stderr启动Chromium,查看是否有扩展加载失败的日志
内容的提问来源于stack exchange,提问作者Nicholas DiPiazza

