# Provision 目录与打包

> 组织浏览器定制包，分发默认文件和插件，并区分安装目录数据与实例数据。

Source: https://console.getchrovia.com/zh/docs/sdk-provision

**Provision** 是浏览器安装侧的定制包，提供内置插件、发行元数据、可选的默认授权与配置文件，以及固定网络规则。各项能力需要对应的 [License 授权](https://console.getchrovia.com/zh/docs/sdk-capabilities)。

## 找到根目录

| 平台 | 标准 Chrovia 位置 |
| --- | --- |
| Windows | 浏览器可执行文件旁的 `Chrovia` |
| macOS | `Chrovia.app/Contents/Chrovia` |
| Linux | 浏览器可执行文件旁的 `Chrovia`，以该平台发行包是否可用为准 |

定制发行包可能使用不同的目录名。应使用实际发行包提供的目录，而不是根据用户数据目录猜测位置。macOS 上它位于 `Contents` 下，不在 `Contents/MacOS` 下。

```text
Chrovia/
  manifest.json
  Chrovia License
  Extended Preferences
  dnr_rules.json
  Extensions/
    chrovia-infra/
      manifest.json
      background.js
    my-plugin/
      manifest.json
      background.js
      index.html
```

License、EP 初始文件及 DNR 文件是否需要，取决于部署方式。保留插件已有资源；上述目录树用于说明文件职责，不是完整的发行文件清单。

## 每个文件的职责

| 文件 | 格式与行为 |
| --- | --- |
| `manifest.json` | 发行元数据 JSON 对象，不是 Chrome 扩展清单，也不是插件选择列表 |
| `Chrovia License` | 仅在用户数据目录没有 License 时使用的只读回退文件 |
| `Extended Preferences` | 向没有 EP 的用户数据目录复制一次，不覆盖已有实例文件 |
| `dnr_rules.json` | 固定规则 JSON 数组，需要 `declarativeNetRequest` |
| `Extensions/<目录>/manifest.json` | 单个内置插件的 Chrome 扩展清单 |

最小发行包清单：

```json
{
  "version": "1.0.0"
}
```

拥有 `instanceMetadata` 的授权代码可以通过 `chrovia.instanceMetadata?.provision?.manifest` 读取它。修改发行包版本不会修改插件版本、License 或已有 EP 文件。

## 共享安装目录，独立实例

每个 `--user-data-dir` 保存自己的浏览器数据。从同一可执行文件启动的实例共享 Provision 包。将插件放入安装目录后，这些实例都可加载它；把插件放在某个用户数据目录中，并不会将其安装为 Provision 插件。

需要不同插件集合时，应准备不同浏览器安装包，只包含当前 SDK 发行包支持的插件。

没有 Provision 时，浏览器没有 Provision 插件及相关定制。用户数据目录中的 License 仍能授权内核能力，但需要租约的部署还必须具有正常工作的续租集成。

## 内置页面 URL

支持 Provision URL 的配置，例如[导航重定向](https://console.getchrovia.com/zh/docs/sdk-navigation-redirect)，可以按插件目录名引用页面：

```text
provision-extension://my-plugin/index.html
```

仅在明确支持此形式的配置中使用。其他浏览器 API 可能要求普通 `chrome-extension://` URL，应从已安装扩展获取。保持插件目录名称稳定，不要复用从其他平台复制的扩展 ID。

## 打包与更新

1. 为目标产品准备完整的 Provision 目录树。
2. 复制到可执行文件旁，或 macOS 应用包的 `Contents` 下。
3. 安装有效 License，以及需要时正确签名的 EP 文件。
4. 完全重启浏览器，核对已加载插件和配置。

更改 EP 初始文件不会迁移现有用户数据目录。应明确更新实例文件，并重新签名已签名字段。替换回退 License 也不会覆盖用户数据目录中优先级更高的 License。

替换包前，备份自定义插件和配置。核对最终安装目录包含全部目标插件，以及需要时位于根目录的 `dnr_rules.json`。不要假设更新会保留此前手动加入安装目录的文件。

接下来阅读[内置插件安装与开发](https://console.getchrovia.com/zh/docs/sdk-plugins)。
