Linux 是唯一一个允许 Chrome 用户安装托管在 Chrome 应用商店之外的扩展程序的平台。本文介绍了如何打包、托管和更新通用 Web 服务器中的 crx 文件。如果您仅通过 Chrome 应用商店分发扩展程序或主题,请参阅应用商店托管和更新。
软件包
扩展程序和主题背景以 .crx 文件的形式提供。通过 Chrome 开发者信息中心上传时,信息中心会自动创建 crx 文件。如果发布到个人服务器,则需要在本地创建 crx 文件或从 Chrome 应用商店下载该文件。
从 Chrome 应用商店下载 .crx 文件
如果扩展程序托管在 Chrome 应用商店中,则可以从开发者信息中心下载 .crx 文件。在“您的房源”下找到相应房源,然后点击“更多信息”。在弹出式窗口中,点击蓝色 main.crx 链接即可下载。

下载的文件可以托管在个人服务器上。这是在本地托管扩展程序的最安全方式,因为扩展程序的内容将由 Chrome 应用商店签名。这有助于检测潜在的攻击和篡改。
在本地创建 .crx 文件
扩展程序目录在“扩展程序管理”页面上转换为 .crx 文件。在多功能框中前往 chrome://extensions/,或点击 Chrome 菜单,将指针悬停在“更多工具”上,然后选择“扩展程序”。
在“扩展程序管理”页面上,点击开发者模式旁边的切换开关,启用开发者模式。然后选择延长套餐按钮。

在“扩展程序根目录”字段中指定扩展程序文件夹的路径,然后点击 PACK EXTENSION 按钮。对于首次提交的软件包,请忽略私钥字段。

Chrome 将创建两个文件,即 .crx 文件和 .pem 文件,其中包含扩展程序的私钥。

请勿丢失私钥!请将 .pem 文件保存在秘密且安全的位置;您需要使用该文件更新扩展程序。
更新 .crx 软件包
通过增加 manifest.json 中的版本号来更新扩展程序的 .crx 文件。
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
返回扩展程序管理页面,然后点击 PACK EXTENSION 按钮。指定扩展程序目录的路径和私钥的位置。

该页面将提供更新后的打包扩展程序的路径。

通过命令行打包
通过调用 chrome.exe 在命令行中打包扩展程序。使用 --pack-extension 标志指定扩展程序文件夹的位置,并使用 --pack-extension-key 标志指定扩展程序私钥文件的位置。
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
主机
托管 .crx 文件的服务器必须使用适当的 HTTP 标头,以允许用户通过点击链接来安装扩展程序。
如果满足以下任一条件,Google Chrome 会将文件视为可安装:
- 相应文件的内容类型为
application/x-chrome-extension - 文件后缀为
.crx,且满足以下两个条件:- 文件未使用 HTTP 标头
X-Content-Type-Options: nosniff传送 - 文件 is 使用以下内容类型之一进行提供:
- 空字符串
"text/plain""application/octet-stream""unknown/unknown""application/unknown""\*/\*"
- 文件未使用 HTTP 标头
无法识别可安装文件的最常见原因是服务器发送了标头 X-Content-Type-Options: nosniff。第二种最常见的原因是服务器发送了未知内容类型(不在上述列表中的内容类型)。如需修正 HTTP 标头问题,请更改服务器的配置,或尝试在其他服务器上托管 .crx 文件。
更新
浏览器每隔几个小时就会检查已安装的扩展程序是否有更新网址。对于每个网址,它都会向该网址发出请求,以查找更新清单 XML 文件。
- 更新检查返回的内容是一个 更新清单 XML 文档,其中列出了扩展程序的最新版本。
如果更新清单中提及的版本比已安装的版本新,浏览器会下载并安装新版本。与手动更新一样,新的 .crx 文件必须使用与当前已安装版本相同的私钥进行签名。
更新网址
托管在 Chrome 应用商店以外的服务器上的扩展程序必须在其 manifest.json 文件中包含 update_url 字段。
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
更新清单
服务器返回的更新清单应为 XML 文档。
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
此 XML 格式借鉴自 Google 的更新基础架构 Omaha 所使用的格式。扩展系统针对更新清单的 <app> 和 <updatecheck> 元素使用以下属性:
- appid
- 扩展程序 ID 是根据公钥的哈希值生成的,如打包中所述。扩展程序的 ID 显示在“扩展程序管理”页面上。
- 代码库
- 指向
.crx文件的 HTTPS 网址。 - 版本
- 供客户端用于确定是否应下载
codebase指定的.crx文件。它应与.crx文件的manifest.json文件中的“版本”值一致。
更新清单 XML 文件可以通过包含多个 <app> 元素来包含有关多个扩展程序的信息。
测试
默认更新检查频率为每隔数小时一次,但您可以使用“扩展程序管理”页面上的立即更新扩展程序按钮强制执行更新。

此命令将开始检查所有已安装的扩展程序。
高级用法:请求参数
基本自动更新机制旨在让服务器端工作变得非常简单,只需将静态 XML 文件放到任何普通的 Web 服务器(例如 Apache)上,并在发布新的扩展程序版本时更新该 XML 文件即可。
托管多个扩展程序的开发者可以检查请求参数,这些参数会指明更新请求中的扩展程序 ID 和版本。包含这些参数后,扩展程序可以从运行动态服务器端代码的同一网址更新,而不是从静态 XML 文件更新。
请求参数的格式如下:
?x=EXTENSION_DATA
其中 EXTENSION_DATA 是采用以下格式的网址编码字符串:
id=EXTENSION_ID&v=EXTENSION_VERSION
例如,两个扩展程序指向同一更新网址 (https://test.com/extension_updates.php):
- 扩展程序 1
- ID:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
- 版本:“1.1”
- 扩展程序 2
- ID:"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- 版本:“0.4”
更新每个单独扩展程序的请求将是,
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
和
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
对于每个唯一的更新网址,可以在单个请求中列出多个扩展程序。对于上一个示例,如果用户同时安装了这两个扩展程序,则这两个请求会合并为一个请求:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
如果使用同一更新网址的已安装扩展程序的数量足够多,以至于 GET 请求网址过长(超过 2000 个字符左右),更新检查会根据需要发出额外的 GET 请求。
高级用法:最低浏览器版本
随着更多 API 添加到扩展程序系统,可能会发布仅适用于较新浏览器版本的扩展程序更新版本。虽然 Google Chrome 本身会自动更新,但大多数用户可能需要几天时间才能更新到任何给定的新版本。为确保指定更新仅适用于 Google Chrome 的特定版本或更高版本,请向更新响应中的 <app> 元素添加“prodversionmin”属性。
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
这样一来,只有当用户使用的是 Google Chrome 3.0.193.0 或更高版本时,系统才会自动更新到版本 2。