From ca806c0f07d2ed53a2c65a17672b2e61da5638dd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:20:02 +0000 Subject: [PATCH 1/2] Initial plan From 0f001888e45088e3fdb5780d20e2b628825619bd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 12:24:16 +0000 Subject: [PATCH 2/2] docs: create docs folder with comprehensive project documentation Co-authored-by: neokoni <90206655+neokoni@users.noreply.github.com> --- docs/README.md | 31 +++++++ docs/adding-devices.md | 169 ++++++++++++++++++++++++++++++++++++++ docs/architecture.md | 127 ++++++++++++++++++++++++++++ docs/deployment.md | 99 ++++++++++++++++++++++ docs/generate-ota-json.md | 100 ++++++++++++++++++++++ docs/getting-started.md | 71 ++++++++++++++++ docs/ota-json-format.md | 92 +++++++++++++++++++++ 7 files changed, 689 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/adding-devices.md create mode 100644 docs/architecture.md create mode 100644 docs/deployment.md create mode 100644 docs/generate-ota-json.md create mode 100644 docs/getting-started.md create mode 100644 docs/ota-json-format.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..e58af8e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,31 @@ +# Neokoni's OTA Center — 文档 + +本目录包含 **ota_site** 项目的完整技术文档。 + +## 文档目录 + +| 文档 | 描述 | +|------|------| +| [快速入门](./getting-started.md) | 本地开发环境搭建 | +| [项目架构](./architecture.md) | 项目结构与技术架构说明 | +| [添加设备](./adding-devices.md) | 如何添加新设备和 ROM 版本 | +| [OTA JSON 格式](./ota-json-format.md) | 面向刷机工具的 OTA JSON 文件格式说明 | +| [生成 OTA JSON](./generate-ota-json.md) | 使用 `generate_ota_json.py` 脚本生成 OTA JSON | +| [部署](./deployment.md) | CI/CD 与服务器部署说明 | + +## 项目简介 + +**ota_site** 是一个自托管的 OTA(空中升级)信息站点,用于展示 Neokoni ROM 构建的更新记录。用户可以在此站点: + +- 浏览所有受支持的设备列表 +- 查看每台设备上可用的 ROM 系统及版本 +- 阅读各版本的详细更新日志 +- 获取 OTA 下载包的 JSON 链接(供刷机工具自动识别) + +## 技术栈概览 + +- **前端框架**:[Vue 3](https://vuejs.org/) + TypeScript +- **构建工具**:[Vite](https://vite.dev/) +- **UI 组件库**:[MDUI 2](https://www.mdui.org/)(Material Design 3) +- **路由**:[Vue Router 4](https://router.vuejs.org/) +- **CI/CD**:GitHub Actions + SSH 部署 diff --git a/docs/adding-devices.md b/docs/adding-devices.md new file mode 100644 index 0000000..362c4e6 --- /dev/null +++ b/docs/adding-devices.md @@ -0,0 +1,169 @@ +# 添加设备与 ROM 版本 + +本文档介绍如何向站点添加新设备、新 ROM 系统或新版本,以及如何更新现有版本的更新日志。 + +## 数据结构概览 + +每台设备对应 `src/ota/` 目录下的一个 JSON 文件,格式如下: + +```jsonc +{ + "codename": "设备代号", // 设备代号(全小写,与文件名一致) + "name": "设备显示名称", + "systems": [ + { + "name": "ROM名称", // 例如 "AviumUI" + "description": "简介", // 可选 + "versions": [ + { + "version": "版本标识", // 例如 "avium-16" + "label": "版本显示名", // 例如 "类原生 AviumUI 16" + "otaUrl": "/AviumUI/avium-16/设备代号/ota.json", // 可选,OTA JSON 路径 + "releases": [ + { + "date": "YYYY-MM-DD", + "version": "可选,具体版本号", + "changes": [ + "更新内容条目1", + "更新内容条目2(支持 HTML,如 标签)" + ] + } + ] + } + ] + } + ] +} +``` + +> **注意**:`releases` 数组的排序无关紧要,站点会在展示时按日期降序自动排列(最新日期显示在最前)。 + +## 添加新设备 + +### 第一步:创建设备 JSON 文件 + +在 `src/ota/` 目录下新建一个以设备代号命名的 JSON 文件,例如 `src/ota/lisa.json`: + +```json +{ + "codename": "lisa", + "name": "Xiaomi 11 Lite 5G NE", + "systems": [ + { + "name": "AviumUI", + "versions": [ + { + "version": "avium-16", + "label": "类原生 AviumUI 16", + "otaUrl": "/AviumUI/avium-16/lisa/ota.json", + "releases": [ + { + "date": "2026-03-01", + "changes": [ + "初始构建版本" + ] + } + ] + } + ] + } + ] +} +``` + +新文件会被 `src/config/devices.ts` 中的 `import.meta.glob` 自动加载,**无需修改任何其他文件**。 + +### 第二步(可选):添加 OTA JSON 文件 + +如果刷机工具需要读取 OTA 信息,在 `public/` 目录下创建对应路径的 `ota.json`: + +``` +public/AviumUI/avium-16/lisa/ota.json +``` + +文件格式详见 [OTA JSON 格式](./ota-json-format.md)。可以使用 `scripts/generate_ota_json.py` 脚本自动生成,详见[生成 OTA JSON](./generate-ota-json.md)。 + +## 添加新 ROM 系统 + +在现有设备的 JSON 文件中,向 `systems` 数组追加一个新对象即可: + +```json +{ + "codename": "nabu", + "name": "Xiaomi Pad 5", + "systems": [ + { + "name": "AviumUI", + "versions": [ ... ] + }, + { + "name": "LineageOS", + "versions": [ + { + "version": "lineage-22", + "label": "LineageOS 22.1", + "releases": [ + { + "date": "2026-03-01", + "changes": ["初始构建"] + } + ] + } + ] + } + ] +} +``` + +## 添加新版本 + +在对应系统的 `versions` 数组中追加一个新版本对象: + +```json +{ + "version": "avium-17", + "label": "类原生 AviumUI 17", + "otaUrl": "/AviumUI/avium-17/nabu/ota.json", + "releases": [ + { + "date": "2026-06-01", + "changes": ["升级至 Android 17 基础版本"] + } + ] +} +``` + +## 更新现有版本的更新日志 + +直接向对应版本的 `releases` 数组中追加一条新记录即可,例如: + +```json +{ + "date": "2026-03-10", + "changes": [ + "上游代码:", + "1. 更新安全补丁", + "内核:", + "1. 修复已知崩溃问题" + ] +} +``` + +> **技巧**:`changes` 字段支持 HTML 内联标签,例如: +> - `链接文字` +> - `代码片段` +> - `删除线文字` + +## 验证 + +修改完成后,运行开发服务器检查展示效果: + +```bash +npm run dev +``` + +访问对应设备路径,确认更新日志正常显示。如需检查类型,也可运行: + +```bash +npm run type-check +``` diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..cf02cc0 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,127 @@ +# 项目架构 + +## 目录结构 + +``` +ota/ +├── public/ +│ └── AviumUI/ +│ └── avium-16/ +│ ├── nabu/ +│ │ └── ota.json # 小米平板5 OTA 信息(供刷机工具读取) +│ └── lemonades/ +│ └── ota.json # 一加9R OTA 信息(供刷机工具读取) +├── scripts/ +│ └── generate_ota_json.py # 自动生成 OTA JSON 的 Python 脚本 +├── src/ +│ ├── assets/ +│ │ └── main.css # 全局样式 +│ ├── config/ +│ │ ├── devices.ts # 设备数据类型定义与加载逻辑 +│ │ └── site.ts # 站点配置(ICP 备案、壁纸 API) +│ ├── ota/ +│ │ ├── nabu.json # 小米平板5 更新日志数据 +│ │ └── lemonades.json # 一加9R 更新日志数据 +│ ├── router/ +│ │ └── index.ts # Vue Router 路由定义 +│ ├── views/ +│ │ ├── HomeView.vue # 首页 +│ │ ├── DeviceSelectionView.vue # 设备选择页 +│ │ ├── DeviceView.vue # 设备详情页(系统列表) +│ │ ├── SystemView.vue # 系统版本列表页 +│ │ ├── ChangelogView.vue # 版本更新日志页 +│ │ └── NotFoundView.vue # 404 页面 +│ ├── App.vue # 根组件(顶部栏、侧边导航、主题切换) +│ └── main.ts # 应用入口 +├── docs/ # 项目文档 +├── .github/ +│ └── workflows/ +│ └── deployment.yml # CI/CD 自动部署工作流 +├── index.html # HTML 入口文件 +├── vite.config.ts # Vite 配置(含自定义插件) +├── tsconfig.json # TypeScript 配置(根) +├── tsconfig.app.json # TypeScript 配置(应用) +└── tsconfig.node.json # TypeScript 配置(Node 环境) +``` + +## 技术栈 + +| 技术 | 版本 | 用途 | +|------|------|------| +| Vue 3 | 3.5.x | 前端框架(Composition API) | +| TypeScript | ~5.9 | 类型系统 | +| Vite | ^7.x | 构建工具与开发服务器 | +| Vue Router 4 | ^4.6 | 客户端路由 | +| MDUI 2 | ^2.1 | Material Design 3 UI 组件库 | +| Roboto / Noto Sans SC | — | 字体(中英文) | + +## 路由结构 + +| 路径 | 组件 | 说明 | +|------|------|------| +| `/` | `HomeView` | 首页(品牌介绍 + 入口按钮) | +| `/devices` | `DeviceSelectionView` | 设备选择列表 | +| `/device/:codename` | `DeviceView` | 设备页(显示可用 ROM 系统) | +| `/device/:codename/:system` | `SystemView` | 系统页(显示可用版本) | +| `/device/:codename/:system/:version` | `ChangelogView` | 版本更新日志 | +| `/:pathMatch(.*)` | `NotFoundView` | 404 页面 | + +## 数据流 + +``` +src/ota/*.json + │ + ▼ +src/config/devices.ts ← import.meta.glob 动态加载所有 JSON + │ + ├─ devices[] → DeviceSelectionView / App.vue 侧边导航 + ├─ getDevice() → DeviceView / ChangelogView + └─ getSystem() → SystemView / ChangelogView +``` + +所有设备数据来源于 `src/ota/` 目录下的 JSON 文件,`devices.ts` 使用 Vite 的 `import.meta.glob` 在构建时自动加载所有文件,无需手动注册。 + +## App.vue 根组件功能 + +- **顶部应用栏**:品牌名称、菜单按钮、主题切换按钮 +- **侧边抽屉导航**:首页入口 + 所有设备快捷链接(自动从 `devices` 配置生成) +- **主题模式**:支持 `auto` / `light` / `dark` 三档,偏好保存到 `localStorage` +- **动态配色**:通过必应壁纸 API 提取主色调,调用 MDUI 的 `setColorScheme` 动态换肤 + +## Vite 自定义插件 + +`vite.config.ts` 中包含两个自定义 Vite 插件,用于向刷机工具(如 Avium 内置 OTA 检查器)暴露纯文本格式的更新日志: + +### `bpPlainTextMiddleware` + +- **触发条件**:请求的 `User-Agent` 中包含 `Build/BP` +- **匹配路径**:`/device/:codename/AviumUI/avium-16` +- **响应**:以 `text/plain` 格式返回该设备 AviumUI avium-16 版本的所有更新日志,HTML 标签被自动剥离 + +### `alwaysPlainTextPagePlugin` + +- **匹配路径**:`/plain/device/:codename/AviumUI/avium-16` +- **开发/预览模式**:动态返回纯文本更新日志 +- **生产构建**:在 `dist/plain/device/:codename/AviumUI/avium-16/index.txt` 生成静态文本文件 + +纯文本格式示例: + +``` +2026-02-26 +================== +上游代码: +1. 更新AviumUI 16.2版本(QPR2) +内核: +1. 更新KernelSU + +2026-01-16 +================== +... +``` + +## 站点配置 + +`src/config/site.ts` 导出两项配置: + +- **`siteConfig`**:页脚 ICP 备案信息数组,每项包含 `icp`(备案号)和 `icpLink`(链接) +- **`wallpaperConfig`**:壁纸 API 地址,用于动态配色初始化 diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 0000000..2fade18 --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,99 @@ +# 部署 + +## 自动部署(GitHub Actions) + +项目使用 GitHub Actions 实现代码推送后的自动构建与部署。工作流文件位于 `.github/workflows/deployment.yml`。 + +### 触发条件 + +| 触发方式 | 说明 | +|----------|------| +| 推送到 `main` 分支 | 自动触发构建与部署 | +| 向 `main` 分支提交 Pull Request | 触发构建,用于验证 | +| 手动触发(`workflow_dispatch`) | 在 GitHub Actions 页面手动运行 | + +### 工作流步骤 + +``` +1. 检出代码(actions/checkout@v4) +2. 配置 Node.js 环境(actions/setup-node@v4,使用 latest 版本) +3. 安装依赖(npm install) +4. 构建项目(npm run build → 输出到 dist/) +5. 通过 SCP 将 dist/ 上传到服务器(appleboy/scp-action@v0.1.7) +``` + +### 服务器部署路径 + +构建产物会上传至: + +``` +/opt/1panel/www/sites/ota.neokoni.ink/index/ +``` + +上传时 `dist/` 前缀会被去掉(`strip_components: 1`),并清除服务器上的旧文件(`rm: true`)。 + +### 配置 GitHub Secrets + +自动部署需要在 GitHub 仓库的 **Settings → Secrets and variables → Actions** 中配置以下 Secrets: + +| Secret 名称 | 说明 | +|-------------|------| +| `SERVER_HOST` | 服务器 IP 地址或域名 | +| `SERVER_USERNAME` | SSH 登录用户名 | +| `SERVER_PASSWORD` | SSH 登录密码 | + +## 手动构建与部署 + +如需手动构建并部署: + +```bash +# 1. 安装依赖 +npm install + +# 2. 构建生产版本 +npm run build + +# 3. 将 dist/ 目录内容上传至服务器 +scp -r dist/* user@your-server:/opt/1panel/www/sites/ota.neokoni.ink/index/ +``` + +## 本地预览生产构建 + +```bash +npm run build +npm run preview +``` + +访问终端输出的地址(默认 `http://localhost:4173`)预览生产版本效果。 + +## 静态文件说明 + +构建后,`dist/` 目录除了 Vue 应用的 HTML/JS/CSS 文件外,还包含: + +- `public/` 目录下的所有静态资源(OTA JSON 文件等) +- `plain/device/:codename/AviumUI/avium-16/index.txt`:各设备的纯文本更新日志(由 Vite 插件在构建时自动生成) + +## 服务器 Web 服务器配置建议 + +站点使用 Vue Router 的 HTML5 History 模式,因此 Web 服务器需要将所有非文件请求回退到 `index.html`。 + +**Nginx 配置示例:** + +```nginx +location / { + try_files $uri $uri/ /index.html; +} +``` + +**Apache `.htaccess` 示例:** + +```apache + + RewriteEngine On + RewriteBase / + RewriteRule ^index\.html$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.html [L] + +``` diff --git a/docs/generate-ota-json.md b/docs/generate-ota-json.md new file mode 100644 index 0000000..9ff551d --- /dev/null +++ b/docs/generate-ota-json.md @@ -0,0 +1,100 @@ +# 生成 OTA JSON + +`scripts/generate_ota_json.py` 脚本用于从 ROM ZIP 包和 `build.prop` 文件自动生成 `ota.json`,无需手动填写构建时间戳、文件大小和 SHA-1 哈希。 + +## 前置要求 + +- Python 3.x(无需额外依赖) +- ROM ZIP 包(例如 `AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip`) +- 从 ROM ZIP 包中提取的 `build.prop` 文件(位于 `system/build.prop`) + +## 基本用法 + +```bash +python3 scripts/generate_ota_json.py [选项] +``` + +示例: + +```bash +python3 scripts/generate_ota_json.py \ + AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip \ + build.prop +``` + +脚本会: +1. 从 `build.prop` 读取 `ro.system.build.date.utc` 时间戳 +2. 计算 ZIP 文件的大小和 SHA-1 哈希 +3. 从文件名解析设备代号、ROM 名称和版本信息 +4. 根据解析结果构造下载 URL +5. 预览生成的 JSON 内容,并询问是否保存 + +## 命令行参数 + +| 参数 | 说明 | 示例 | +|------|------|------| +| `files` | (必填)ZIP 文件和 build.prop 文件路径,顺序不限 | `rom.zip build.prop` | +| `--version` | 覆盖版本标识(用于 URL 和 JSON 中) | `--version=avium16` | +| `--os` | 覆盖 ROM 名称 | `--os=AviumUI` | +| `--date` | 覆盖日期(YYYY-MM-DD 或 YYYYMMDD 格式) | `--date=2026-02-26` | +| `--base-url` | 覆盖下载基础 URL(默认:`https://pan.neokoni.ink/d/OneDrive-Public`) | `--base-url=https://example.com/dl` | + +## 文件名解析规则 + +脚本期望 ZIP 文件名遵循以下格式: + +``` +{ROM名称}-{版本号}-{设备代号}-{日期(YYYYMMDD)}-{标签...}.zip +``` + +脚本会自动识别 8 位数字日期(如 `20260226`),并以此为分隔点解析: +- **日期之前**:ROM 名称和版本信息 +- **日期前一位**:设备代号 +- **日期之后**:附加标签(忽略) + +## 输出路径 + +生成的 `ota.json` 将保存至: + +``` +public/{ROM名称}/{版本标识}/{设备代号}/ota.json +``` + +例如,处理 `AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip` 时,输出路径为: + +``` +public/AviumUI/AviumUI-16.2.0-nabu/nabu/ota.json +``` + +> **提示**:如果输出路径与预期不符,可使用 `--version` 参数手动指定版本标识以控制路径。 + +## 交互式确认 + +脚本在保存文件前会显示 JSON 预览并询问确认: + +``` +============================== +JSON Content Preview: +{ + "response": [ + { + "datetime": 1772097425, + "filename": "AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip", + "id": "618bedfd390a3031da6bd063ac21d6d68b2e2faf", + "size": 2590263421, + "url": "https://pan.neokoni.ink/d/OneDrive-Public/nabu/avium16/2026-02-26/...", + "version": "AviumUI-16.2.0-nabu" + } + ] +} +============================== +Target File: /path/to/public/AviumUI/AviumUI-16.2.0-nabu/nabu/ota.json + +Save to file? (y/n): +``` + +输入 `y` 确认保存,输入其他任意内容或按 `Ctrl+C` 取消操作。 + +## OTA JSON 格式详情 + +生成的 JSON 结构详见 [OTA JSON 格式](./ota-json-format.md)。 diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..ad29f9b --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,71 @@ +# 快速入门 + +本文档介绍如何在本地搭建开发环境并运行 ota_site 项目。 + +## 前置要求 + +| 工具 | 最低版本 | 推荐安装方式 | +|------|----------|-------------| +| Node.js | 20.19.0 或 ≥ 22.12.0 | [nodejs.org](https://nodejs.org/) | +| npm | 随 Node.js 附带 | — | +| Git | 任意版本 | [git-scm.com](https://git-scm.com/) | + +## 克隆仓库 + +```bash +git clone https://github.com/neokoni/ota.git +cd ota +``` + +## 安装依赖 + +```bash +npm install +``` + +## 启动开发服务器 + +```bash +npm run dev +``` + +启动后,在浏览器中访问 `http://localhost:5173`(端口号以终端输出为准)。 + +## 可用命令 + +| 命令 | 说明 | +|------|------| +| `npm run dev` | 启动本地开发服务器,支持热重载 | +| `npm run build` | 类型检查 + 构建生产版本(输出到 `dist/`) | +| `npm run build-only` | 仅构建,跳过类型检查 | +| `npm run type-check` | 运行 TypeScript 类型检查(`vue-tsc`) | +| `npm run preview` | 在本地预览生产构建结果 | + +## 推荐开发工具 + +- **IDE**:[Visual Studio Code](https://code.visualstudio.com/) + - 扩展:[Vue - Official (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.volar)(请禁用 Vetur) +- **浏览器 DevTools 插件**: + - Chrome/Edge/Brave:[Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - Firefox:[Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + +## 目录结构速览 + +``` +ota/ +├── public/ # 静态资源(OTA JSON 等) +├── scripts/ # 辅助脚本(generate_ota_json.py) +├── src/ +│ ├── assets/ # 全局样式 +│ ├── config/ # 设备配置与站点配置 +│ ├── ota/ # 各设备更新日志 JSON +│ ├── router/ # Vue Router 路由配置 +│ └── views/ # 页面组件 +├── docs/ # 项目文档(当前目录) +├── index.html # HTML 入口 +├── vite.config.ts # Vite 配置 +├── package.json +└── tsconfig.json +``` + +更多细节请参阅[项目架构](./architecture.md)文档。 diff --git a/docs/ota-json-format.md b/docs/ota-json-format.md new file mode 100644 index 0000000..453627c --- /dev/null +++ b/docs/ota-json-format.md @@ -0,0 +1,92 @@ +# OTA JSON 格式 + +`public/` 目录下的 `ota.json` 文件供刷机工具(如 AOSP/LineageOS 系 Updater App)读取,以实现自动检测和下载新版本。 + +## 文件路径约定 + +``` +public/{ROM名称}/{版本标识}/{设备代号}/ota.json +``` + +示例: + +``` +public/AviumUI/avium-16/nabu/ota.json +public/AviumUI/avium-16/lemonades/ota.json +``` + +部署后,这些文件可通过以下 URL 访问: + +``` +https://ota.neokoni.ink/AviumUI/avium-16/nabu/ota.json +``` + +## 文件格式 + +```json +{ + "response": [ + { + "datetime": 1772097425, + "filename": "AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip", + "id": "618bedfd390a3031da6bd063ac21d6d68b2e2faf", + "size": 2590263421, + "url": "https://pan.neokoni.ink/d/OneDrive-Public/nabu/avium16/2026-02-26/AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip", + "version": "AviumUI-16.2.0-nabu" + } + ] +} +``` + +## 字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| `response` | 数组 | 固定键名,包含一个或多个版本条目(通常只含最新版本) | +| `datetime` | 整数 | 构建时间戳(UTC Unix 时间戳),从 ROM 的 `build.prop` 中的 `ro.system.build.date.utc` 字段读取 | +| `filename` | 字符串 | ZIP 包文件名(含扩展名),例如 `AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip` | +| `id` | 字符串 | ZIP 包的 SHA-1 哈希值,用于完整性校验 | +| `size` | 整数 | ZIP 包文件大小(字节) | +| `url` | 字符串 | ZIP 包的完整下载地址 | +| `version` | 字符串 | 版本标识字符串,格式通常为 `{ROM}-{版本号}-{设备代号}` | + +## 文件名命名约定 + +ZIP 包文件名遵循以下格式: + +``` +{ROM名称}-{版本号}-{设备代号}-{日期(YYYYMMDD)}-{标签...}.zip +``` + +示例: + +``` +AviumUI-16.2.0-nabu-20260226-Unofficial-GMS.zip +``` + +| 片段 | 示例值 | 说明 | +|------|--------|------| +| ROM名称 | `AviumUI` | ROM 的名称 | +| 版本号 | `16.2.0` | ROM 版本号 | +| 设备代号 | `nabu` | 目标设备的代号 | +| 日期 | `20260226` | 构建日期(YYYYMMDD) | +| 标签 | `Unofficial-GMS` | 可选附加标签(如认证状态、GMS 包含情况) | + +## 手动生成 + +可以手动创建 `ota.json`,也可以使用仓库提供的脚本自动生成。推荐使用脚本以减少人为错误,详见[生成 OTA JSON](./generate-ota-json.md)。 + +## 在网站中关联 OTA JSON + +在对应设备的 `src/ota/*.json` 中,将 `otaUrl` 字段设置为 `ota.json` 的路径即可: + +```json +{ + "version": "avium-16", + "label": "类原生 AviumUI 16", + "otaUrl": "/AviumUI/avium-16/nabu/ota.json", + "releases": [ ... ] +} +``` + +站点会在更新日志页面展示"查看系统更新文件 (JSON)"链接,指向该 URL。