Installing extensions on Linux(在 Linux 上安装扩展)
警告 此页面直接从 MV2 文档集迁移而来。它尚未经过验证是否符合 Manifest V3。
托管在 Chrome 网上应用店之外的扩展程序只能由 Linux 用户安装。本文介绍如何从个人服务器打包、托管和更新 .crx
文件。如果仅通过 Chrome 网上应用店分发扩展程序或主题,请咨询网上商店托管和更新。
# Packaging
扩展和主题作为 .crx
文件提供。通过 Chrome Developer Dashboard 上传时,仪表板会自动创建 .crx
文件。如果在个人服务器上发布,则需要在本地创建 .crx
文件或从 Chrome 网上应用店下载。
# Download .crx from the Chrome Web Store(从 Chrome 网上应用店下载 .crx)
如果扩展程序托管在 Chrome Web Store 上,则可以从开发人员仪表板下载 .crx
文件。在“您的列表”下找到扩展程序,然后单击“更多信息”。在弹出窗口中,单击蓝色的 main.crx
链接进行下载。
下载的文件可以托管在个人服务器上。这是在本地托管扩展程序的最安全方式,因为扩展程序的内容将由 Chrome 网上应用店签名。这有助于检测潜在的攻击和篡改。
# Create .crx locally(在本地创建 .crx)
扩展目录将在扩展管理页面转换为 .crx
文件。导航到 ominibox 中的 chrome://extensions/
,或单击 Chrome 菜单,将鼠标悬停在“更多工具”上,然后选择“扩展”。
在扩展管理页面上,通过单击开发人员模式旁边的切换开关启用开发人员模式。然后选择 PACK EXTENSION 按钮。
在扩展根目录字段中指定扩展文件夹的路径,然后单击打包扩展按钮。忽略首次包的私钥字段。
Chrome 将创建两个文件,一个 .crx
文件和一个 .pem
文件,其中包含扩展程序的私钥。
不要丢失私钥!将 .pem 文件保存在一个秘密和安全的地方;需要更新扩展。
# Update a .crx package
通过增加 manifest.json
中的版本号来更新扩展的 .crx
文件。
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
返回扩展管理页面并单击 PACK EXTENSION 按钮。指定扩展目录的路径和私钥的位置。
该页面将提供更新的打包扩展的路径。
# Package through command line(通过命令行打包)
通过调用 chrome.exe
在命令行中打包扩展。使用 --pack-extension
标志指定扩展文件夹的位置,使用 --pack-extension-key
标志指定扩展私钥文件的位置。
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
# Hosting
托管 .crx
文件的服务器必须使用适当的 HTTP 标头,以允许用户通过单击链接来安装扩展。
如果满足以下任一条件,Chrome 浏览器会认为文件可安装:
- 该文件的内容类型为
application/x-chrome-extension
- 文件后缀是
.crx
并且以下两项都成立:- 该文件未与 HTTP 标头
X-Content-Type-Options: nosniff
- 一起提供 该文件具有以下内容类型之一:
- empty string
- "text/plain"
- "application/octet-stream"
- "unknown/unknown"
- "application/unknown"
- "/"
- 该文件未与 HTTP 标头
无法识别可安装文件的最常见原因是服务器发送标头 X-Content-Type-Options: nosniff
。第二个最常见的原因是服务器发送了一个未知的内容类型——不在前面的列表中。要修复 HTTP 标头问题,请更改服务器的配置或尝试将 .crx
文件托管在另一台服务器上。
# Updating
每隔几个小时,浏览器就会检查已安装的扩展程序是否有更新 URL。对于每一个,它都会向该 URL 发出请求,以寻找更新清单 XML 文件。
- 更新检查返回的内容是一个更新清单 XML 文档,其中列出了扩展的最新版本。
如果更新清单提到的版本比安装的版本更新,浏览器会下载并安装新版本。与手动更新一样,新的 .crx
文件必须使用与当前安装的版本相同的私钥进行签名。
注意:为了维护用户隐私,谷歌浏览器不会随自动更新清单请求发送任何 Cookie 标头,并忽略对这些请求的响应中的任何 Set-Cookie 标头。
# Update URL
托管在 Chrome 网上应用店之外的服务器上的扩展程序必须在其 manifest.json 文件中包含 update_url 字段。
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
# Update manifest
服务器返回的更新清单应该是一个 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 是基于公钥的散列生成的,如打包packaging中所述。扩展程序的 ID 显示在扩展程序管理页面上Extensions Managment Page |
---|---|
codebase | .crx 文件的 HTTPS URL。 |
version | 由客户端用于确定是否应下载代码库codebase 指定的 .crx 文件。它应该与 .crx 文件的 manifest.json 文件中的“version”值匹配。 |
更新清单 XML 文件可以通过包含多个元素来包含有关多个扩展的信息。
# Testing
默认更新检查频率是几个小时,但可以使用扩展管理页面上的立即更新扩展按钮强制更新。
这将开始检查所有已安装的扩展。
# Advanced usage: request parameters(高级用法:请求参数)
基本的自动更新机制旨在使服务器端的工作变得简单,只需将静态 XML 文件放到任何普通 Web 服务器(如 Apache)上,并在新扩展版本发布时更新该 XML 文件。
托管多个扩展的开发人员可以检查请求参数,指示更新请求中的扩展 ID 和版本。包含这些参数允许扩展从运行动态服务器端代码而不是静态 XML 文件的相同 URL 更新。
请求参数的格式为:
?x=_<extension_data>_
其中 _<extension_data>_
是以下格式的 URL 编码字符串:
_id=<id>_&v=_<version>_
例如,两个扩展指向同一个更新 URL
(https://test.com/extension_updates.php
):
Extension 1
- ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- Version: "1.1"
Extension 2
- ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- Version: "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
对于每个唯一的更新 URL,可以在单个请求中列出多个扩展。对于上面的示例,如果用户安装了这两个扩展,那么这两个请求将合并为一个请求:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
如果使用相同更新 URL 的已安装扩展的数量足够大,以至于 GET 请求 URL 太长(超过 2000 个字符左右),更新检查会根据需要发出额外的 GET 请求。
# Advanced usage: minimum browser version(高级用法:最低浏览器版本)
随着更多 API 添加到扩展系统中,可能会发布仅适用于较新版本浏览器的扩展的更新版本。虽然谷歌浏览器本身是自动更新的,但大多数用户群更新到任何给定的新版本可能需要几天时间。要确保给定的更新仅适用于特定版本或更高版本的 Google Chrome 版本,请将“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。
By.一粒技术服务.