---
name: user-guide
description: EVCC 软件使用手册。当用户问"怎么用 / 怎么操作 / 功能介绍 / 使用说明 / 教程 / 怎么设置 / 公式怎么写 / 自动化怎么配"等使用层面的问题时使用此 SKILL。本 SKILL 只涉及软件操作层面，不涉及代码实现原理。
---

# EVCC 使用手册 — 完整参考

> **EVCC** — 车辆工程控制台 (Ecarx Vehicle Control Console)
>
> 官网：**coauto.cc**
> 适用平台：龙鹰一号/双龙鹰一号芯片的 FlymeAuto 系统车型（需 Root 权限）
> 当前最新发布版本：v2.7.9（以应用内更新页和官网下载页为准）
>
> 本软件仅在"技术共创星球"群内免费提供，仅限群成员使用。
>
> 本 SKILL 下载地址：`https://evcc.coauto.cc/static/evcc_user_guide.md`
> 把它导入 AI 即可让 AI 全面理解 EVCC 的使用方法。

你是 EVCC 的使用指导助手。用户会向你提问关于 EVCC 软件的使用方法、功能介绍、配置方式、公式写法、故障排查等问题。请基于以下完整的使用手册内容，用清晰、友好的中文回答用户问题。

**回答原则**：
- 只回答软件使用层面的问题，不解释代码实现和内部原理
- 给出具体的操作步骤，而非笼统的描述
- 如果涉及高风险操作（写入车辆属性、Frida 注入、系统级命令），提醒用户谨慎操作
- 公式相关问题给出可直接使用的示例
- 不确定的内容如实告知，不编造功能

---

## 第一章 概述与首次使用

### 1.1 EVCC 是什么

EVCC 是一款运行在龙鹰一号/双龙鹰一号芯片 FlymeAuto 系统车机上的工程控制台应用。它提供：

- **自定义控制台** — 拖拽式组件布局，可绑定大量隐藏车辆属性，按钮/开关/滑块一键操控
- **自动化引擎** — 触发器 + 条件 + 动作的可视化规则系统，属性变化、定时、开机等多种触发方式，比车机自带的场景助手强大得多
- **音乐小窗桥接** — 将汽水音乐、网易云等第三方 App 的播放信息无缝桥接到车机原生小窗，支持歌词同步、桌面歌词、模拟蓝牙歌词和 L7 HUD 歌词，还能方向盘控制、语音控制
- **HUD 小窗投屏** — 将导航地图投射到 HUD 窗口，基于自带地图 App 的保留活动组件投放，能同步自带地图状态
- **仪表投屏** — 将任意内容投放到仪表物理屏幕（龙鹰一号等支持的车型）
- **VHAL + APVP + AIDL + CAPI + AdaptAPI 五源诊断** — 五条属性链路可独立开关，覆盖常规 CarProperty、底层信号、服务属性及带语义名称的适配属性
- **Frida 动态注入** — 内置脚本库和守护模式，支持 EAS 鉴权绕过、DPI 逐应用修改、HUD 控制等高级 Hook 场景
- **远程控制** — 钉钉/Telegram/飞书三平台机器人，远程查看状态、执行命令、管理服务
- **悬浮工具栏** — 可拖拽的悬浮快捷按钮，自定义功能、主题跟随、透明度可调
- **小窗应用** — 将任意 App 以小窗形式投射到主屏或副屏，支持自由拖拽、缩放、旋转和多窗口同屏
- **终端面板** — 一键执行内置/自定义 ADB 命令，支持云端命令同步
- **应用管理器** — 六类分组浏览，支持对系统/用户应用的启停、卸载、禁用等操作，专为龙鹰车机定制
- **文件管理** — 浏览本地文件、EVCC 下载站和远程网盘/协议目录，支持安装 APK、图片查看、视频/音频播放、编辑文本、批量复制/移动/删除和扫码输入
- **云端配置同步** — 属性元数据、ADB 命令、Frida 脚本、模板/规则商店均支持云端下发和版本管理
- **STR 休眠防护** — 通过定时写入 VHAL 属性阻止车机进入深度休眠，方便进行远程操控
- **DPI 调节** — 按应用独立调整界面缩放（目前不太稳定，不建议长期使用）

### 1.2 软件适用平台与支持车型

**适用平台**：已适配的 FlymeAuto 系统车型，设置向导会按车型方案自动选择对应连接链路。

**设置向导车型方案**：
- 银河 E5 / A7
- 26 款星舰 7
- 老款领克 07/08
- 其它龙鹰通用
- 银河 L6/L7 竖屏
- 其它 8155 通用
- 25 款星舰 7
- 其它 E02 通用

> 注意：EVCC 不支持极氪车型。若云端识别到当前车型暂不支持，设置向导会直接显示“不支持此车型”，不会继续自动配置。

### 1.3 安装

本软件需使用 ADB 安装在车机上，因此需要你的车辆已经可以打开 ADB。请自行上网搜索你的车机是否可以打开 ADB。

建议打开 ADB 后，使用**应用管家**安装。本软件安装后，可在软件内部进行一键更新，后续更新无需手动下载 APK 安装。

也可以使用 **EVCC 安装器**。安装器只负责下载并安装/更新 EVCC、打开已安装的 EVCC、上传安装错误日志；已安装 EVCC 时不会进入维护模式，也不再提供本地 APK 安装或应用启动器。多用户车机会自动尝试兼容安装，无需手动选择用户。安装器会直接下载测试版通道的最新 EVCC。

如果安装器提示网络连接失败，优先关闭热点后重试；仍失败再切换网络或上传错误日志。

### 1.4 激活

为避免软件滥用、传播，软件首次启动后所有功能页面处于锁定状态，需要先完成激活。

**自动激活**（推荐）：
1. 点击顶部栏的设备名称/设备 ID
2. 把弹出的设备 ID 发送给软件管理员
3. 管理员进行授权后软件会自动激活

**自助激活**：
1. 打开 EVCC 功能导航里的"EVCC 本体激活"，或直接访问 EVCC 本体在线激活页：`https://evcc.coauto.cc/activate-evcc`
2. 输入 EVCC 锁屏/首页显示的设备 ID、购买到的激活码，并完成页面验证码
3. 提交成功后回到 EVCC，并保持联网，软件会通过原有自动激活流程获取授权

自助激活码格式通常为 `XXXXX-XXXXX`。粘贴时多出的空格、缺少横杠或横杠位置不对，一般会自动按标准格式识别。一个激活码只能绑定一台设备，一旦绑定不能换到其他设备；后续换机请使用 EVCC 的"设备迁移"功能。若在线激活页配置了购买入口，可直接点击"去购买激活码"跳转到发卡网站；未配置时页面不会显示购买按钮。

在线激活页支持在网址里带激活码参数，例如 `https://evcc.coauto.cc/activate-evcc?code=ABCDE-23456`，打开后会自动预填激活码；也支持 `activation_code` 或 `c` 作为参数名。

管理员也可以在服务端仪表盘快捷生成一个 EVCC 本体自助激活码；生成后后台会显示激活码、`https://evcc.coauto.cc/activate-evcc` 和一段可直接复制给用户的引导文案。该文案可在服务端"自助激活 → EVCC · 设置"里修改。

如果在线激活页提示"云端还没有发现这个未激活设备"，请先打开 EVCC 并保持联网，等服务器记录到该设备 ID 的未激活状态后再回来激活；完全没被云端发现过的设备 ID 不能直接绑定激活码。

如果在线激活页提示设备仍在"心跳异常"列表中，请先联系管理员处理异常；管理员忽略或删除对应异常后，才能继续自助激活。

**手动激活**：
1. 点击顶部栏的设备名称/设备 ID
2. 在弹出的"设备信息"对话框中，连续快速点击"设备 ID"文字 **7 次**
3. 弹出激活码输入框 → 输入激活码并确认

设备 ID 始终显示在顶部栏，方便提供给管理员进行激活。激活前的锁屏界面会展示官网入口、官网网址下方的“作者/版权所有@四十六”声明，以及设备信息卡片；设备信息卡片会显示设备 ID（可长按复制）、SN、品牌/型号/设备代号、Android/SDK 版本、应用版本和构建时间。

### 1.5 EVCC 用户服务协议

EVCC 首次进入设置向导时会先显示独立的 **EVCC 用户服务协议** 页面。协议会说明 EVCC 主要用于个人技术研究与学习、涉及 Root/ADB/车辆属性读写/自动化/Frida/投屏/日志诊断等高级能力，以及激活授权、设备信息、日志上传、实验功能和用户责任等风险边界。

首次阅读协议时，底部 **"我知道了"** 按钮会先显示 10 秒倒计时，倒计时结束后才可点击确认；确认后再次打开设置向导仍会先显示协议页面，但不会再倒计时，可直接点击 **"我知道了"** 继续。

### 1.6 新手引导（设置向导）

首次安装并激活后，软件会自动启动设置向导，分步引导你完成基础配置：

| 步骤 | 说明 |
|------|------|
| 开始 — 用户服务协议 | 阅读并确认 EVCC 用户服务协议，首次确认前会有 10 秒倒计时 |
| 开始 — 身份选择 | 选择"设置向导"进入完整向导，或选择"跳过向导"直接结束 |
| 1 — 选择车型 | 云端可按车机型号精确匹配并推荐方案，也可手动从 8 个车型方案中选择 |
| 2 — ADB 连接授权 | (8155 方案专用) 尝试自动完成加密 ADB 授权、证书注入和无线调试配置；失败后再提示手动指令 |
| 3 — 基础服务配置 | 自动连接 RootService 和核心服务 |
| 4 — Frida 引擎 | 说明 Frida 的适用功能和风险，可选择部署或跳过 |
| 5 — 系统白名单 | 配置保活白名单，提升后台存活率 |
| 6 — 音乐桥接 | 询问是否开启音乐转发桥接；选择开启时会按车型方案自动选择桥接车型 |
| 7 — 推荐配置 | 若当前车型配置了云端推荐问题，会在基础服务、Frida、白名单和音乐桥接选择处理完成后显示问题、说明和选项，按"是/否"自动应用推荐配置；未配置时会直接跳过 |
| 8 — 完成 | 设置完成，提示重启车机使配置生效 |

向导支持中途退出，已完成的配置会自动保存，下次启动时可从中断处继续。如需重新运行向导，可在设置页面点击"设置向导 / 新手引导"按钮；新安装默认控制台也会提供"如果您未完成新手引导，可点击此处重新完成引导"组件，点击可直接进入向导，后续可在编辑控制台时删除。系统白名单步骤会按当前车型配置显示或跳过；若云端未下发匹配结果，向导不会自动选中车型，需要用户手动选择。推荐配置只在云端为当前车型配置了有效问题时出现，并且会等前面的车型方案、服务开关、Frida、白名单和音乐桥接选择处理完成后再应用；音乐桥接会在推荐配置前单独询问，选择开启后会打开"音乐桥接"开关，并按车型方案选择桥接车型：龙鹰和未知车型默认使用龙鹰通用，8155 与 E02 方案使用银河 L6 / L7，老领克07/08 使用同名方案。悬浮窗等其它能力仍可由推荐配置中的分享码按车型和问题选择按需套用。选择"是"后会按推荐分享码应用控制台、EVCC mini 控制台、自动化、音乐桥接、悬浮窗或配置包等内容，遇到脚本、危险自动化或高风险配置时仍会弹出安全确认；单个分享码失败不会中断整个向导，结果会显示在问答页。设置向导不再主动引导进入控制台模板商店，需要模板时可在完成向导后从控制台或内容商店自行进入。完整走完设置向导后，主界面仍会继续弹出界面缩放调整，界面缩放会显示云端下发的当前车型默认 DPI，并提醒修改 DPI 可能导致控制台或软件界面显示异常，建议保持默认；随后会显示主界面功能引导，覆盖控制台、内容商店、服务、属性、终端、自动化、应用管理、文件、脚本和设置等入口。

> **提示**：如果 ADB Shell 连接总是异常，请使用应用管家"永久打开无线ADB"。并且确认应用管家右上角显示已连接，若应用管家也连不上，先解决该连接问题。

### 1.7 界面概览

软件采用顶部标签页 + 左右滑动/点击切换的布局，共 **9 个标签页**：

| 序号 | 标签名 | 功能简述 |
|------|--------|----------|
| 1 | 控制台 | 自定义仪表盘，实时显示/控制车辆属性 |
| 2 | 属性 | VHAL/APVP 属性浏览、搜索、读写、监控 |
| 3 | 服务 | 音乐桥接、HUD小窗投屏、悬浮窗、STR 防护、应用 DPI 调节、远程控制等 |
| 4 | 终端 | ADB / Root Shell 命令面板，一键执行内置/自定义命令 |
| 5 | 自动化 | 自动化规则引擎，触发器+条件+动作 |
| 6 | 应用 | 应用管理器，查看/卸载/启停应用 |
| 7 | 文件 | 本地/远程文件管理、APK 安装、媒体预览、文本编辑、批量操作 |
| 8 | 脚本 | Frida 动态注入和 Lua 编程脚本 |
| 9 | 设置 | 所有功能的启动状态管理、保活白名单配置、日志、版本更新 |

在设置页"配色方案"下方点击"调整一级菜单顺序"，可以打开排序弹窗。拖动左侧把手重新排列后点击"保存顺序"，顶部标签会立即按新的顺序显示；点击"恢复默认"可回到官方默认顺序。右侧的"EVCC 自身 DPI"可直接调整主界面缩放，作用等同服务页 DPI 调节卡片中的 EVCC 自身 DPI 调整。

### 1.8 多语言

EVCC 支持三种语言：中文（默认）、英文、俄文。可在设置页切换。

### 1.9 主题

支持白天/夜间/自动三种主题模式。自动模式跟随系统暗色模式切换。

### 1.10 皮肤系统（v2.3.6+）

EVCC 支持一整套**皮肤自定义**：配色、图表色、卡片圆角 / 边框 / 阴影 / padding、全局字号、页面背景（纯色 / 线性渐变 / 径向渐变）、以及**每个 widget 单独的样式覆盖**，日间和夜间可以各配一套，也可以共用一套。

#### 快速上手 — 从皮肤商店挑一个

控制台顶部"模板"菜单 → "控制台皮肤" → "🏪 浏览皮肤商店"会进入内容商店。顶部可在规则商店 / 模板商店 / 组件商店 / 皮肤商店 / 脚本商店之间切换；皮肤商店里有 6 款官方预置（赛博朋克 / 极简白 / 车载仪表 / 海洋蓝 / 复古绿 / 特斯拉极简）以及社区上传，点一下"应用"就装上。"我的上传"旁边的"恢复初始皮肤"可清除当前控制台皮肤并回到 EVCC 默认外观。

**上传自己做的皮肤到商店**：打开"🏪 浏览皮肤商店"后，右上角有一个「📤 上传当前皮肤」按钮。先通过 Web 编辑器 / 粘贴 JSON / 导入文件其中一种方式把皮肤应用到本机，再点"上传当前皮肤"，填写名称和简介即可提交到公共商店；勾选「隐私上传」时不会进入公开商店审核/上架，只能通过分享码分享；上传署名在内容商店顶部"我的署名"统一设置。上传后会生成数字分享码，审核上架前或隐私上传时也可以把分享码发给别人，让对方在内容商店顶部点"输入分享码"后确认下载。皮肤本身支持 `imageDataUrl` 这类自包含背景图；如果皮肤 JSON 引用本地图片 / 音频 / 视频等资源，上传时也会一起保存，别人应用时会自动下载并关联到本机路径。

#### 用 Web 皮肤编辑器自己调

控制台"模板"菜单 → "📱 打开 Web 皮肤编辑器 (扫码)"，用手机 / 平板 / 电脑扫弹出的二维码（或复制链接 `https://evcc.coauto.cc/static/skin-editor/` 到别的设备）。车机屏幕太小操作不便，所以不直接跳转，而是扫码到别的设备上编辑。

**编辑器功能**：
- **三栏布局**：左侧可视化面板（色板 / 形状 / 背景 / 图表 / 信息），中间实时预览，右侧 JSON 代码
- **预览界面切换**：控制台 / 设置 / 自动化 / 属性 / 对话框 5 种主界面都能预览皮肤效果
- **样板间 vs 真实布局**：样板间展示所有 9 种 widget + 8 种图表；点"上传控制台 JSON"可以导入你的布局，在真实布局上看效果并**点任意 widget 单独改它的样式**（覆盖圆角 / 描边 / 背景 / accent / chart 色等）
- **日夜两套独立**：顶部"🌞 日间 / 🌙 夜间"切换。勾"日夜共用"则夜间复用日间配置
- **随机数据动画**：看配色在动态场景下的表现
- **预设方案**：色板 tab 顶部有一键套用的 5 种预设（第一个"空白起点"是从零开始的模板）
- **📖 AI 说明书**：顶部按钮打开完整 DSL 规范，一键复制给 ChatGPT / Claude，让 AI 帮你根据风格描述写皮肤 JSON（比如"海洋蓝 + 珊瑚橙 accent + 大圆角"）

**编辑完应用到车机** — 三种途径任选：
1. 编辑器点"导出皮肤"下载 `.evccskin` 文件，传到车机，控制台菜单 → "📂 导入皮肤文件"
2. 编辑器右侧 JSON 视图点"复制"，到车机控制台菜单 → "📋 粘贴皮肤 JSON 代码"，粘贴即应用
3. 上传到皮肤商店让别人也能用（编辑器里"上传"功能）

#### 控制台菜单 — 皮肤相关入口汇总

控制台顶部"模板" → "控制台皮肤" 分类下：
- 🏪 浏览皮肤商店
- 📱 打开 Web 皮肤编辑器 (扫码)
- 📋 粘贴皮肤 JSON 代码  — 直接丢一段 JSON 就应用
- 📂 导入皮肤文件 (.evccskin)
- ⬇️ 导出当前皮肤  — 把现在用的皮肤存到 Download/EVCC/skins/
- ❌ 移除当前皮肤  — 恢复默认配色

#### 皮肤作用范围

皮肤作用于**整个主 UI 的所有界面**（控制台 + 设置 + 自动化 + 属性 + 对话框...）。**悬浮窗、HUD、AVM** 等用独立主题系统的模块不受皮肤影响（保留原配色）。

---

## 第二章 控制台（仪表盘）

控制台是 EVCC 的主界面，用于展示和操作车辆属性的可视化仪表盘。

### 2.0 EVCC mini（独立小窗 APK · 增值服务）

> v2.4.0 起，原"系统小窗控制台"被拆分成一个独立 APK —— **EVCC mini**（包名 `com.kooo.evcc.mini`）。独立 APK 利用 Flyme Auto 的 `only_windowmode` 声明让图标每次点击都稳定进入小窗形态，零闪烁。
>
> **v2.4.4 起 EVCC Mini 转为增值服务**：首次使用需先在主 EVCC 里开启 7 天试用或输入激活码。主 EVCC 本体功能不受影响。

**两个 APK 的分工**：
- `com.kooo.evcc` (主 EVCC) — 所有配置、根服务、VHAL/APVP/AIDL/CAPI/AdaptAPI 订阅都在这里；图标不变
- `com.kooo.evcc.mini` (EVCC mini) — 极简小窗壳，点图标即小窗形态启动，无 root 依赖，通过 ContentProvider/AIDL 向主 EVCC 请求数据和动作路由

**何时显示 mini 入口**：主 EVCC tab 栏 `+` 右侧的圆圈按钮（类似老款 iPhone Home 键）仅当检测到 EVCC mini 已安装时才出现。卸载 mini 会自动隐藏入口，无需重启。

**进入 mini 编辑器**：点击圆圈按钮 → 首次使用会弹出授权卡片（见 2.0.0） → 授权后进入编辑器，顶部出现页面 tab 栏 + 预览区 + 列数/DPI/模板/授权状态等操作条。

#### 2.0.0 授权激活（v2.4.4+）

点击圆圈按钮进入 mini 编辑器时会检查授权状态。四种可能：

| 状态 | 编辑器行为 |
|---|---|
| **从未使用** | 弹出授权卡片，二选一：「**开始 7 天试用**」（立即解锁）或「**我已有激活码**」（跳到输入界面）；用户必须选一项才能进入编辑器 |
| **试用中** | 直接进入编辑器，顶部 toolbar 显示「试用 X天Y小时」chip；点 chip 可随时升级为永久激活 |
| **已激活** | 直接进入编辑器，toolbar 显示「已激活」chip |
| **试用已结束** | 弹出「试用已结束」对话框，必须输入有效激活码才能继续 |

**激活码格式**：`XXXXX-XXXXX`（10 个字符，不区分大小写，粘贴时带或不带 `-` 都能识别）。

**激活流程**：
1. 输入激活码 → 点「下一步」
2. 二次确认对话框显示**设备 ID** 和**激活码**，提示「激活码将与此设备 ID 永久绑定，不可在其他设备使用」
3. 点「确认激活」后网络请求服务端校验，成功后 Toast 提示「已激活」，editor 立刻放行

**试用期规则**：
- 倒计时从首次点「开始 7 天试用」瞬间起算，共 7×24 小时
- 没有点过「开始试用」的设备**不占用任何试用期额度**，第一次进入时仍可正常申请试用
- 试用结束后必须激活，否则 mini 小窗不会显示任何数据（主 EVCC 本体不受影响）

**设备迁移**：如果要把车机换成另一台设备，使用主 EVCC 「设备迁移」功能迁移，EVCC Mini 授权会**跟随迁移到新设备**——试用剩余时长、已激活状态、绑定的激活码都会转移。试用已结束的迁移不会重新给 7 天。

**离线使用**：
- 已正式激活：断网 30 天内可正常使用；超过 30 天需联网一次重新校验
- 试用期中：倒计时按真实时间走，不给离线宽限

**激活失败常见原因**：
| 提示 | 含义 | 对策 |
|---|---|---|
| 激活码无效 | 码不存在或格式错 | 检查拼写，复制粘贴时勿带多余字符 |
| 激活码已被使用 | 已被其他设备绑定 | 找管理员确认或要一个新码 |
| 激活码已被撤销 | 管理员撤回 | 联系管理员 |
| 失败次数过多，请稍后再试 | 公开激活入口每小时 20 次、每天 50 次触发限流 | 按提示等待后重试 |
| 设备未注册 | 当前设备 ID 还没登录过 | 先让主 EVCC 完成首次激活（可由管理员授权，也可使用 EVCC 本体自助激活页） |

**如何获取激活码**：打开在线激活页时可点「去购买激活码」跳转购买；若群内管理员另有发放方式，以群内说明为准。
若在线激活页未显示购买按钮，说明管理员暂未配置购买入口，请按群内说明获取。

**未激活时 mini 的表现**：打开 mini 小窗会显示「EVCC Mini 小窗快控为增值服务，请在 EVCC 主程序里开始 7 天免费试用或输入激活码」占位页，不会看到任何 widget 或音乐。

#### 2.0.1 多页面滑动切换（v2.4.4+）

mini 支持多个页面左右滑动切换。新用户默认就是三页：控制台、音乐控制、应用菜单；老用户已有页面配置不会被覆盖。页面类型分三种：

| 类型 | 用途 |
|---|---|
| **控制台 / 仪表** (DASHBOARD) | 传统控制台，拖拽组件、绑属性、按钮/开关/滑块 |
| **音乐** (MUSIC) | 全屏音乐页：模糊封面 + 歌词 + 歌名/歌手 + 进度 + 三键控制；对标 Flyme AutoMediaControl 官方小窗的 1:1 复刻，不需要配 widgets |
| **应用菜单** (APP_MENU) | 只显示用户自己添加的常用 App，可从 mini 小窗里直接启动，也可用虚拟屏幕方式投射到下一页 |

在编辑器顶部的 tab 栏里：

| 操作 | 效果 |
|---|---|
| 点击 `+` | 弹出对话框，选"仪表"、"音乐"或"应用菜单"并命名 |
| 点击某个 tab | 切换到该页；DASHBOARD 页展示网格预览，MUSIC 页展示占位文案，APP_MENU 页展示已添加应用数量 |
| 长按某个 tab | 弹出菜单：重命名 / 删除 / 上移 / 下移 |
| 删除最后一页 | Toast 阻止（至少保留一个页面） |

保存页面变更后，mini 端 ContentObserver 立刻感知，ViewPager 热更，不需要退出重进 mini。

**老用户首次进入新版本**：原有的 mini widgets 自动包装成第一页"仪表"，数据无损迁移。

如果某个 EVCC mini 控制台页没有任何组件，mini 小窗里会显示"还没有配置控制台"引导卡片。点击"添加小窗模板"会通过主 EVCC 打开模板商店，并自动搜索 `[小窗]` 模板；应用模板后会直接写入 EVCC mini 控制台，mini 会自动刷新出新组件。

#### 2.0.2 仪表页能做什么

- 网格大小可调：列 2~6 × 行 4~10（默认 3×6 竖窗），每页独立保存 widgets
- 支持所有组件（信息卡/开关/按钮/滑块/下拉/按钮组/图表/音乐）**除了分区标题**
- **拷贝组件**：从任意主控制台 tab 多选勾选 widget 一键拷贝过来（自动分配新 ID，超尺寸的缩减到小窗网格上限）
- **模板按钮**：保存/加载本地模板、浏览组件商店、浏览模板商店、上传共享 —— 小窗生成的模板自动加 `[小窗]` 前缀区分主控制台
- **空白引导**：控制台页没有组件时，小窗内可直接跳转到主 EVCC 的 `[小窗]` 模板商店，应用后自动刷新
- **DPI** 按钮：运行时统一等比放大 (0.8× ~ 3.0×)，字/按钮/间距同步变化，不影响布局计算

#### 2.0.3 应用菜单页能做什么

应用菜单页用于把常用 App 做成 mini 小窗里的启动面板。页面本身不会默认展示系统所有应用，只显示用户手动添加过的 App；最后一个图标位是"添加"按钮，点击即可继续加入 App。

- **虚拟屏幕模式**：默认模式。点击 App 后会临时在该应用菜单页后面插入一个虚拟屏幕页，并自动跳转过去；mini 按当前小窗可见区域创建虚拟屏幕，主 EVCC / RootService 负责把目标 App 启动到该 display。每个 App 可单独设置是否开启沉浸式状态栏；开启时会优先请求目标 App 自身的系统装饰 / 状态栏背景，车机系统不支持时会保留顶部 Flyme caption / 状态栏避让，并用目标 App 顶部颜色填充避让区；关闭时内容会保守避让顶部 Flyme caption / 状态栏。不再露出左右/底部边框。mini 只保留一个应用菜单虚拟屏 display：如果同一个 App 已经在虚拟屏幕中，再次点击会直接切回原虚拟屏幕页，不会重新启动；如果点击不同 App，会在同一个 display 上直接启动新 App，不会释放旧 display 或把上一个 App 迁回 Display 0。点 Flyme 小窗右上角放大按钮会直接全屏唤醒当前虚拟屏幕里的 App。
- **直开模式**：点击 App 后由 EVCC mini 直接启动目标 App，让目标 App 继承当前 Flyme 小窗状态，并会尝试显示目标 App 的 Flyme 小窗放大按钮；适合地图、音乐、设置等需要稳定小窗入口的场景。
- **全屏开启模式**：点击 App 后通过主 EVCC 的全屏 task 代为启动目标 App，不继承 EVCC mini 的小窗状态；适合希望临时退出 mini 小窗、直接全屏使用的 App。
- **单 App 配置**：长按 App 不移动会打开设置，"启动方式"会打开选择菜单，可选直开 / 虚拟屏幕 / 全屏开启；DPI 可手填，也可点 160 / 200 / 240 / 280 / 320 / 360 / 420 / 480 预设；也可调整虚拟屏幕沉浸式状态栏或删除；长按后直接拖动会进入桌面式排序状态，图标轻微晃动，拖完点"完成"退出。
- **添加应用**：添加弹窗会先打开界面再后台读取系统应用，支持搜索，并以图标网格展示可添加 App。
- **排版规则**：应用菜单页有独立的"每行应用数量"、"显示行数"和"图标大小"设置，长按 App、长按添加按钮或在主 EVCC 编辑器里都可调整；列数范围 2-6 列，默认 4 列；行数范围 4-8 行，默认 6 行；图标大小可选超小 / 小 / 默认 / 大 / 超大，超大约为默认的 2 倍。
- **主题适配**：长按菜单、DPI 弹窗和添加应用弹窗跟随 mini 的白天 / 夜间主题，不再使用系统默认浅色弹窗。
- **生命周期**：虚拟屏幕页是运行时页面，只在虚拟屏幕模式启动 App 后出现；左右滑走不会销毁虚拟屏幕，当前虚拟屏 display 会继续保留，再启动其他 App 时会复用该 display。mini 会记住当前停留的普通页面，长按修改应用菜单配置或重启后不会无故切回第一页。手动关闭虚拟屏幕页会立即释放；如果没有 App 继续占用该 display，空闲一段时间后也会自动释放并从 ViewPager 中移除。
- **作为目标屏幕**：主 EVCC 的启动应用、APP 投屏、HUD/小窗投屏、悬浮窗和自动化目标屏幕选择器中可选"EVCC mini 虚拟屏幕"。它在内部使用占位 display id `-10`，选择后会按需打开 EVCC mini 并创建真实虚拟屏幕。

> 直开模式和全屏开启模式无法强制修改目标 App 自身 DPI；虚拟屏幕模式可为每个 App 单独设置 DPI，但依赖主 EVCC 和 RootService 的特权启动链路。

#### 2.0.4 音乐页能做什么

完全基于"服务 → 音乐桥接"的同一套数据源（见 4.1 节），不需要额外配置。默认使用新版大封面样式，也可在 mini 编辑器的「EVCC mini 设置」里切回旧版封面卡片：

- 封面视图：封面从顶部延伸铺满上半区，底部渐变融入模糊背景
- 歌词视图：全屏模糊封面铺底 + 暗化 scrim 保证文字可读
- 顶部 28sp 大标题 + 22sp 歌手名
- 中部滚动歌词支持渐进模糊和更舒展的字距/行距，跨行切换带淡入淡出
- 底部可拖动进度条 + 当前时间/总时长；支持 seek 的音乐 App 可直接拖动调整播放位置
- 最下方 74dp 播放键 + 50dp 上一首/下一首，间距 28dp
- 歌词位置和进度显示走本地 tick 外推，平滑不卡顿
- 点击标题区 → 拉起上次使用的音乐 App
- 点 Flyme 小窗右上角放大按钮 → 全屏打开当前正在播放的音乐 App；控制台页仍会放大为主 EVCC
- 未连接音乐源时显示"未连接音乐源 · 点击启动"，点击自动唤起音乐 App

> 想体验音乐页：先开"服务 → 音乐桥接"并等桥接生效（重启车机后约 60 秒）；然后在 mini 编辑器点 `+` 加一个"音乐"页保存。左右滑动就能看到。

#### 2.0.5 数据联动与持久化

- 每页配置以多页数据结构（`mini_pages_v1`）保存在主 EVCC 的 SharedPreferences
- 主 EVCC 通过 `ContentProvider` 暴露给 mini 进程（URIs: `mini_pages`、`mini_grid`、`mini_settings`）
- mini 实时值订阅走 AIDL (`IEvccBridge`)；用户操作以 `DashboardAction` 回传主 EVCC，由 ActionRouter 路由到真实的 VHAL/APVP/AIDL/CAPI/AdaptAPI/Root/自动化
- 主 EVCC 保存任何 mini 配置后 `notifyChange`，mini 端 ContentObserver 立即触发 refresh，ViewPager 热更
- 应用菜单页的每行数量、显示行数、图标大小、App 列表、启动方式、DPI 和单 App 沉浸式状态栏设置保存在该页的 `configJson`；mini 端长按修改后通过 Bridge 写回主 EVCC，再由 Provider 热刷新
- 虚拟屏幕页不持久保存，只由 mini 运行时插入；应用菜单虚拟屏在 mini 生命周期内复用同一个 display，手动关闭或 display 空闲一段时间后再移除；特权 DPI 准备、按 display 启动 App、触控 / 按键注入由主 EVCC / RootService 执行
- mini 独立于主控制台，widgets 在不同命名空间不互相影响；但两边共享同一套属性订阅、变量、自动化引擎、音乐桥接，实时数据完全一致
- 音乐页和主控制台的 MUSIC widget 使用同一个 `MusicSourceRegistry`，同步毫秒级一致

#### 2.0.6 MC 卡片直开 EVCC mini

在 mini 编辑器左侧/顶部的「EVCC mini 设置」卡片里，可以开关「MC 卡片直开 EVCC mini」。开启后，首次点击屏幕左下角 Flyme 音乐控制卡片时，会直接打开 EVCC mini，而不是进入 Flyme MC 界面；如果 2 秒内再点一次，会保留 Flyme 官方音乐窗，不再继续唤起 EVCC mini，已经在路上的 mini 唤起也会被取消。虚拟屏幕的沉浸式状态栏不是全局开关，而是在应用菜单中按单个 App 长按配置。

触发方式有两种：
- **无障碍方式（默认）**：通过无障碍服务识别 SystemUI 的音乐卡片点击，支持当前的隐藏/再次拉起等行为。大多数车型建议使用这个方式。
- **Log 监测方式（旧车型兼容）**：监听 Flyme `SmartBarMediaController.openMusicWindow` 日志触发，逻辑更接近早期版本；如果某些车型无障碍方式不生效，可以切换到这个方式。选择无障碍方式时，EVCC 不会启动这条 Log 监测。

### 2.1 组件（Widget）类型

仪表盘由一个个"组件"组成，每个组件可以：

- **信息卡片 (INFO)**：绑定车辆属性 ID，实时显示当前值。可配置运算公式转换显示（如 `x * 0.1` 将原始值缩放）、值映射表（如 `0=关闭, 1=开启`）、小数位数
- **按钮 (BUTTON)**：点击执行设定的操作
- **开关 (TOGGLE)**：切换开/关，分别写入不同的属性值
- **滑块 (SLIDER)**：通过滑块调整属性数值
- **下拉选择 (DROPDOWN)**：从预设选项中选择值写入
- **按钮组 (BUTTON_GROUP)**：多个按钮组合，每个按钮对应一个值
- **时间/日期卡片 (TIME)**：显示当前时间/日期，格式字段使用 Java SimpleDateFormat 模式（如 `HH:mm`, `yyyy/MM/dd`）
- **音乐控制 (MUSIC)**：与"音乐小窗桥接"共享数据源，展示当前歌曲的封面、歌名、歌手、进度和歌词，提供上一首/播放暂停/下一首三键控制。最小 2×2，尺寸越大呈现越丰富：
  - 2×2：封面全幅 + 歌名 + 中央播放键
  - 3×2 / 2×3：左封面 + 右歌名/歌手 + 可拖动进度条 + 三键
  - 3×3 / 4×2+：封面 + 歌名/歌手 + 可拖动进度条 + 三键 + 1 行当前歌词
  - 4×3+：沉浸式，封面模糊铺底 + 居中封面 + 可拖动进度条 + 三键 + 3 行滚动歌词
  
  点击卡片默认打开当前音乐 App，编辑时可改为"切换播放/暂停"或"不响应"。支持 seek 的音乐 App 可直接拖动进度条调整播放位置。依赖"服务 → 音乐小窗桥接"已开启；未桥接时卡片显示"未连接音乐源 · 点击启动"，点击会唤起上次使用的音乐 App

### 2.2 支持的动作类型

控制台组件可以绑定以下动作，自动化也复用其中大多数动作：

| 动作类型 | 说明 |
|----------|------|
| 设置属性 | 写入 VHAL 车辆属性值（最常用） |
| 执行命令 | 以 Root 权限执行 Shell 命令（比较常用） |
| 触发自动化 | 触发指定自动化规则 |
| 启动应用 | 启动指定包名的应用（比较常用） |
| APP投屏 | 将指定应用启动到目标屏幕，或勾选"投放当前前台应用"把当前前台 task 迁移到目标屏幕 |
| 关闭应用 | 强制停止指定应用，或勾选"杀死当前前台应用"一键关掉当前可见的应用 |
| 修改 Settings | 写入系统 Settings (Global/Secure/System) |
| 设置系统属性 | setprop 设置系统属性 |
| 发送广播 | 发送 Android 广播 Intent |
| HTTP 请求 | 发送 HTTP GET/POST 请求 |
| 设置音量 | 调整系统音量 |
| 播放声音 | 播放提示音，可通过拖动条以 5% 步进设置播放音量/增益（0-300%，100 为原始音量）；通过文件选择器选择本地音频时会转存到 EVCC 私有目录，减少共享存储权限变化导致的播放失败 |
| 媒体控制 | 播放/暂停/上一首/下一首；其中"播放/暂停"动作可选择"切换 / 播放 / 暂停"，也可勾选"全局媒体键模式"改由系统向当前音频焦点发送媒体键，适合 CarPlay 盒子、蓝牙盒子等不响应默认音乐桥接控制的来源。控制台、悬浮窗和自动化中的媒体动作共用 EVCC mini 音乐页同一套默认控制链路 |
| 设置变量 | 设置自动化变量 |
| TTS 语音播报 | 文字转语音播报 |
| 循环属性写入 | 定时循环写入属性值 |
| 显示 Toast | 显示提示信息 |
| 发送通知 | 发送系统通知 |
| BLE 广播 | 发送 BLE 蓝牙广播，可自定义厂商 ID、数据载荷和广播时长 |
| 小窗应用 | 打开/关闭/切换/隐藏小窗应用，可指定目标应用和屏幕 |
| 延迟等待 | 延迟指定毫秒后继续执行后续动作。**支持变量/公式**：除直接填数字外，也可写 `$myVar`（读用户变量）、`{x*1000}`（数学表达式）、`$prop(123)`（读属性值）等动态决定等待时长 |
| 返回桌面 | 执行 Home 键返回桌面 |
| 应用退到后台 | 将指定应用退到后台，可选择回到桌面或切回上一个应用，或勾选"退出当前前台应用"自动作用于当前可见应用 |
| 停止规则 | 立即终止当前规则的全部后续动作 |
| 条件中断 | 普通/最终动作判断主条件；放在分支动作里时判断当前命中的分支条件，不满足时停止当前分支后续动作，最终动作仍会继续 |
| 发送远程消息 | 通过已配置的远程机器人（钉钉/Telegram/飞书）发送消息 |
| 打断语音助手 | 抢夺音频焦点以打断车机语音助手 |
| EVCC 卡片动作 | 一键开关 EVCC 自身服务卡片下的功能（v2.4.6+），见下方说明 |
| EVA 联动 | 发送 EVA 动作编组，可编排表情、转头、延迟、TTS、循环和结束动作 |
| 米德宝联动 | 开启米德宝 BLE 直发模式后发送动作编组，可编排基础控制、表情、音乐律动、延迟、连续动作和自定义 HEX |
| 热点控制 | 打开 / 关闭 / 切换 / 仅配置系统热点，可同步设置热点名称、密码、安全类型、频段、信道和隐藏名称 |
| 设置向导 | 打开新手引导 / 设置向导，仅用于主控制台按钮 |

选择"触发自动化 / 触发其他自动化"时，规则选择项和已选规则会同时显示规则名称与规则 ID；如果两条规则名称相似，可以用 ID 区分。

**使用目标 App 图标**：控制台按钮组件、悬浮窗按钮在选择「启动应用 / APP投屏 / 关闭应用 / 应用退到后台 / 小窗应用 / 系统小窗」等需要固定包名的动作后，按钮图标行的「选择...」旁会出现「使用App图标」。先填写包名或点「浏览应用」，再点击/勾选此项即可把按钮图标换成目标 App 图标；如果动作选择的是当前前台应用，因为没有固定包名，这个选项会自动隐藏。

#### 米德宝联动动作（v2.9.44+）

开启米德宝联动卡片的 BLE 直发模式后，自动化、控制台组件和悬浮窗按钮都可以选择"米德宝联动"动作。动作编辑器顶部是已规划动作，可上移、下移或删除；下方除基础控制、表情和音乐律动外，还提供直接动画、语音动作、动作音效、迎宾/行车场景屏效和音乐表情。点击任意动作会加入已规划动作，并立即发送一次，方便现场确认机器人反应。

延迟动作可直接选择 0.5 秒或 1-10 秒，也可输入任意秒数。打开"连续动作"后再点击任意动作，会弹出次数和间隔设置，用于一次性发送重复动作。自定义 HEX 只需要填写一个字节，例如 `F0` 或 `06`，EVCC 会自动按米德宝控制格式发送。优先级默认是"高"：高优先级动作会打断低优先级动作；同优先级默认忽略新的触发，"实时"优先级可相互打断，适合手动测试按钮。

#### EVCC 卡片动作（v2.4.6+）

让自动化、组件、悬浮窗按钮直接操作 EVCC 自身服务卡片的开关 / 数值 / 按钮，等价于"自动帮你去服务卡片里点开关"。无需打开 EVCC 主界面。

**配置方式（三处通用）**：动作类型选「EVCC 卡片动作」→ 选卡片（1 级）→ 选项目（2 级）→ 设置值（开/关/切换 或 数值/选项）。

**已支持的卡片（持续补充）**：
- **仪表投屏**：总开关 / 切换主屏预设（动态枚举已保存的预设）/ 关再开（深睡唤醒后用，内置 1.5s 延迟）/ 重启信息卡 session
- **HUD 投屏**：总开关 / 画面透明度 0~100（同时写白天和夜间两组配置）
- **HUD 直投**：VHAL 激活（第 1 步）/ 绑定 CastService（第 2 步）/ 发起 HUD 投屏（第 3 步）/ 停止投屏。一条龙 = 串这 3 个动作中间各加 1 秒「延迟等待」
- **悬浮窗**：主屏总开关 / 副屏开关
- **媒体桥接**：总开关 / 桌面歌词 / 冷启动获取桥接焦点 / EAS 鉴权绕过
- **STR 防护**：总开关
- **声浪模拟**：总开关
- **BLE 信标**：总开关（关时立即停止全部正在广播的信标）
- **AVM 限速解除**：应用解除（数值参数 0~200 km/h，0 = 完全解除）/ 恢复原厂限速；执行时会按需准备系统分区写入权限
- **蓝牙增强（按车型显示）**：查询状态 / 全量增强 / 恢复原厂；执行增强或恢复时会按需准备系统分区写入权限，并重启蓝牙进程。全量增强会提示风险，建议只用于对比测试
- **远程控制 (MQTT)**：总开关
- **DPI 缩放**：总开关
- **仪表车模颜色（实验）**：总开关（开启前会提示风险）/ 颜色选择 / 立即应用
- **5GHz 热点增强**：总开关

**典型用法**：
- 开始导航 → 自动开启仪表投屏（条件触发自动化 + 此动作）
- 夜间 → 自动关闭副屏悬浮窗
- 到达某地 → 开 STR 防护；离开 → 关 STR 防护
- 自带音乐打开 → 关闭媒体桥接；第三方音乐打开 → 开启媒体桥接或桌面歌词
- 开机后 → 仪表投屏关再开（避免深睡唤醒后画面卡死）

**三态值**：开 = 强制开启；关 = 强制关闭；切换 = 根据当前状态翻转。自动化里推荐用"开/关"明确动作，组件按钮可以用"切换"简化操作。

后续版本会继续补充更多服务卡片和参数。

#### 热点控制

让自动化、控制台组件、悬浮窗按钮直接操作车机系统热点。它和"5GHz 热点增强"不同：热点控制负责开关和修改原生热点配置；热点增强负责在热点已经开启后优化速率参数。

**配置方式（三处通用）**：动作类型选「热点控制」→ 选择「切换热点 / 打开热点 / 关闭热点 / 仅更新配置」→ 按需填写热点名称、密码、安全类型、频段、信道、是否隐藏名称。

**参数说明**：
- 名称、密码、频段、安全类型、信道均可留空；留空时保留系统当前配置，只执行开关动作。
- 选择"开放网络"时不需要密码；选择 WPA2 / WPA3 / WPA2-WPA3 时建议填写 8 位以上密码。
- 频段可选自动、2.4GHz、5GHz、6GHz；信道填 0 表示交给系统自动选择。
- 频段、信道、隐藏名称是否完全生效取决于车机系统 ROM 暴露的热点接口。如果系统拒绝某个参数，动作会失败并在日志中显示原因。

### 2.3 编辑模式

1. 点击右上角"**编辑**"按钮进入编辑模式
2. 编辑模式下可以：
   - **拖拽排序**：长按组件拖动调整位置
   - **调整大小**：拖拽组件边缘调整宽度和高度
   - **编辑组件**：点击组件打开编辑器，修改名称、图标、颜色、绑定属性、动作等
   - **删除组件**：点击组件右上角的删除按钮，确认后删除
3. 编辑完成后点击"**完成**"保存

### 2.4 添加组件

- 点击"**+**"按钮 → 打开组件编辑器 → 配置组件参数后保存
- 也可通过"**组件商店**"从云端下载预设组件

### 2.5 多页/分组

仪表盘支持多个页面/标签，可以按功能分组组织组件（如"驾驶信息"、"灯光控制"、"空调控制"等）。

### 2.6 模板系统

点击模板按钮可以：

| 操作 | 说明 |
|------|------|
| 保存当前为模板 | 将当前仪表盘布局保存为本地模板 |
| 加载模板 | 从本地模板新增一个控制台页 |
| 删除模板 | 删除已保存的本地模板 |
| 模板商店 | 从云端浏览和下载其他用户分享的模板 |
| 上传到模板商店 | 将当前布局截图并上传到云端共享，车型由云端按设备自动匹配 |
| 组件商店 | 从云端下载单个预设组件 |
| 恢复默认 | 将仪表盘恢复为出厂默认布局 |

商店支持按名称、车型、署名、简介或分类搜索；右上角可点"时间 / 名称 / 评分 / 下载量"切换排序，默认按最新上传显示，各商店都提供刷新按钮。规则、模板、组件、皮肤、脚本和配置现在统一进入内容商店，顶部菜单可直接切换；主控制台应用模板后会新增一个控制台页并自动切换过去，不会覆盖当前控制台，小窗模板仍会写入 EVCC mini 控制台；组件、规则应用成功后会留在商店页并弹出结果提示。组件卡片的"测试"会打开一个临时组件弹窗，可直接点击按钮、开关、滑块或选项验证动作；顶部"输入分享码"可输入别人给的数字码，确认内容信息后直接下载或应用，对方内容尚未审核上架或设为隐私上传时也有效；顶部"我的上传"会进入当前商店自己的"我的上传"页，可复制分享码、重命名、删除，或直接下载应用到本机，自己上传的内容即使还没审核上架也可以这样使用；"我的上传"会显示已上架、待审核、隐私上传或已驳回状态；需要管理其他类型时，先切到对应商店再进入"我的上传"；旁边的"我的署名"可保存到云端，署名需要唯一，保存后会同步到该设备此前上传和后续上传的内容，设备 ID 迁移时署名和内容归属也会一起迁移。上传模板、组件、规则、皮肤时只填写名称和简介，脚本上传可继续填写版本、权限等脚本专用信息；配置商店可把多项控制台、自动化、皮肤、脚本和服务页配置打成一个配置包，上传和下载时都可以按条目勾选，只会覆盖选中的配置项，包里没有或未勾选的本机配置会保留；服务页配置会尽量按服务页功能板块展示，地图投屏和主屏地图美化可分别勾选；上传规则、模板、组件、皮肤、脚本或配置包时可勾选「隐私上传」，云端不会把它放入公开审核/上架流程，也不会出现在公开商店列表，只能通过分享码分享；风险 Shell 和敏感内容检测仍会执行，云端管理员仍可删除或忽略异常内容。配置包上传时会默认排除密码、token、远程服务凭据等敏感字段。上传成功后，公开列表和"我的上传"都会显示该内容的分享码；分享码默认从 4 位数字开始，码段用尽后会自动扩展为更多位。商店列表会按当前屏幕列数补齐占位，少量搜索结果或上传内容也会正常显示；模板、组件、规则和皮肤列表会优先显示上次成功加载的本地快照，再刷新云端数据。上传模板、组件、规则或配置包时不再手动填写车型，云端会按设备 ID 匹配当前车型并显示为后台适配配置里的备注车型名。模板商店、组件商店和配置商店上传/下载时会自动携带配置中引用的本地图片、音频、视频等资源，导入后路径会改成本机可用的资源副本；例如"播放声音"动作里选的本地音频不用再单独拷贝。如果组件或模板里的动作绑定了"触发自动化"，上传时会连同被引用的自动化规则一起提交；配置包中的控制台和自动化也会保留它们之间的关联。商店管理页提供"重新匹配车型"按钮，可按当前云端车型配置重新计算现有条目的车型备注；内容商店上报的品牌前缀会先归一化，之后只按精确车型键命中，不再做包含式模糊匹配。云端后台的"全部内容"和各独立商店页都会显示分享码，并支持按分享码搜索；全部内容、规则、模板、组件、皮肤、脚本和配置后台都采用统一分页筛选，输入名称、车型或分享码时会在服务端筛选后只展示当前页；新增"内容审阅"页会集中显示所有待审核内容，可勾选后批量通过，脚本和配置可进入详情页查看源码或完整配置包；后台可将单条内容标记为「锁定」，锁定后上传者不能再从 App 端改名或删除该内容，管理员仍可在后台处理。配置包详情页会显示配置项摘要、完整 JSON 和 AI 风险审核意见。皮肤后台的用户上传预览会优先加载缩略图，点开后再查看原图。旧内容的分享码只在服务端启动时一次性回填，之后新上传内容会在上传时直接生成。商店卡片会显示下载次数、评分和分享码，用户可点"♥"点赞；同一设备对同一条内容只保留一个点赞状态，再次点击会取消点赞。管理员标记为"优质"的内容会始终优先靠前显示，不受排序方式影响。

### 2.7 确认执行

组件可以配置"确认执行"选项，开启后点击按钮会弹出确认对话框，避免误操作。建议对高风险操作（写入属性、执行命令）开启此选项。

### 2.8 网格列数

仪表盘支持 5~12 列网格配置，可根据屏幕大小和显示密度调整。

### 2.9 显示表达式与值映射

**显示表达式**（运算公式）：用公式对原始属性值进行转换后显示。公式中 `x` 代表当前属性的原始数值。

示例：
- `x * 0.1` — 原始值除以 10 显示
- `map(x, 0, 255, -40, 215)` — 将 0~255 映射为温度 -40~215°C
- `round(x / 3.6)` — km/h 转 m/s 并取整
- `if(x == 0, -1, 1000 / x)` — 避免除零

**值映射表**：将特定值映射为文字。旧版 `valueMap` 按原始值精确匹配；新版"数值映射规则"会先计算显示表达式，再按规则顺序判断。

示例：
- `0=P档, 1=R档, 2=N档, 3=D档`
- `0=关闭, 1=开启`

数值映射规则支持"等于 / 不等于 / 大于 / 小于 / 区间 / 直接成立 / 兜底"。其中"直接成立"不判断数值，执行到这一条就直接使用它的映射文本，常放在最后作为显式默认值。映射文本可以留空；如果没有配置"直接成立/兜底"且前面的规则都未命中，就显示原始或公式处理后的数值。

**小数位数** (decimalPlaces)：公式结果显示的小数位数。使用 `pad()` 格式化时会跳过此设置。

> 完整的公式语法请参见第九章。

---

## 第三章 属性（诊断）

属性页用于浏览、搜索、监控和写入车辆属性。这些属性基本上等同在车机上能够检测到、控制的所有车辆功能，包括最基本的空调、灯光、车门状态等，以及更底层的电池电压电流甚至压差等信息。

### 3.1 数据源

顶部有多个数据源标签：

| 数据源 | 说明 | 默认端口 |
|--------|------|----------|
| **VHAL** | Android Vehicle HAL 属性，通过 gRPC 连接 | 40004 |
| **APVP** | 底层 APVP Transfer 协议信号，更底层的车辆信号 | 40005 |
| **AIDL** | AIDL 绑定服务属性 | - |
| **CAPI** | 自定义 API 属性 | - |
| **AdaptAPI** | 从当前车机适配层动态发现的语义属性，属性名与支持范围随车型而变 | - |

**该用哪个数据源？**

| 想找什么 | 首选数据源 | 说明 |
|----------|-----------|------|
| 空调、灯光、车门、车窗等常见功能 | VHAL | 大部分日常功能都在 VHAL，读写权限清晰 |
| 电池单体电压、电流、温度等底层数据 | APVP | 原厂工程信号，颗粒度最细 |
| 方控按键、座椅记忆等服务型功能 | AIDL | 经过 Service 封装，适合事件型 |
| 仪表显示、HUD 内容等自定义通路 | CAPI | 车型定制的私有 API |
| 希望用直观名称补充或交叉验证现有属性 | AdaptAPI | 语义 ID 与名称成套提供，可能与其它源读取到同一底层车辆状态 |

> 同一个功能可能在多个数据源都有一份值（例如车速）。AdaptAPI 的属性 ID、名称与支持范围全部由当前车机的适配接口现场枚举，不下载服务端语义目录，也不会套用 P145、E245 或其他车型的固定映射。它与 CAPI 在 EVCC 中连接、缓存和开关完全独立，但车机系统内部最终可以共用 CarProperty 服务。优先选择在当前车型上名称清楚、读写稳定的一路。

**连接状态**：每个数据源顶部有绿/红色指示灯。未连接时在“连接”页打开对应开关。AdaptAPI 默认关闭，关闭时不会扫描系统适配接口、连接属性服务或启动监听；云端只决定是否显示以及采用哪种车端扫描架构，不提供属性目录。

### 3.2 属性列表

属性以表格形式展示，包含以下列：
- **ID**：属性 ID（十六进制）
- **名称**：属性名称
- **描述**：属性说明
- **模块/分组**：所属模块
- **区域 (Area)**：区域 ID
- **访问类型**：只读 / 只写 / 读写
- **数据类型**：Int32 / Float / Boolean / String / 字节数组等
- **当前值**：实时值

点击表头可按该列排序（升序/降序切换）。值变化时会自动高亮。

### 3.3 搜索与过滤

| 过滤方式 | 说明 |
|----------|------|
| 搜索框 | 按名称、ID、描述模糊搜索（支持中英文、十六进制 ID） |
| 仅变化属性 | 只显示值发生过变化的属性（进入页面后首次值不算变化） |
| 仅可写属性 | 只显示有写入权限的属性（找"控制类"属性时最有用） |
| 仅收藏 | 只显示已收藏的属性 |
| 模块筛选 | (APVP/AdaptAPI 模式) 按信号或属性所属模块过滤，减少列表干扰 |
| 回避探测 | 隐藏"已经变化过"的属性，让下一次操作的新变化更显眼 |

**常用搜索关键词**：

| 你要找的 | 关键词 |
|---------|--------|
| 大灯 / 近光 / 远光 | `headlight` / `high beam` / `low beam` / `大灯` |
| 转向灯 | `turn` / `signal` / `indicator` / `转向` |
| 空调 | `hvac` / `ac` / `temperature` / `空调` |
| 车窗 | `window` / `车窗` |
| 门锁 | `door lock` / `门锁` |
| 电量 | `battery` / `soc` / `电量` |
| 车速 | `speed` / `vehicle speed` / `车速` |
| 胎压 | `tire pressure` / `胎压` |

> 属性名称由云端 AI 翻译提供，可能有偏差。**实在搜不到就用属性监视器法**：触发一次动作看哪些属性变了（见 6.5）。

### 3.4 属性操作

| 操作 | 方法 |
|------|------|
| **写入属性值** | 点击属性值 → 弹出写入对话框 → 修改值并写入 |
| **收藏** | 标记常用属性，方便快速查找 |
| **备注** | 为属性添加自定义笔记 |
| **自定义描述** | 编辑属性描述文本 |
| **属性配对** | (APVP/AIDL) 将读写属性配对分组 |

不同数据类型有不同的编辑方式：
- **Boolean**：开关切换
- **枚举**：下拉选择；APVP 枚举属性会优先显示车辆下发的枚举项，直接选择即可写入对应值
- **Struct**：APVP 结构体属性会按字段分别填写，写入时自动按字段类型编码
- **Bytes/Mixed**：列表中只显示轻量摘要；点开后会按需读取当前原始值，优先尝试显示为图片，其次按 UTF-8/UTF-16/GB18030 等编码显示文本；短二进制值会显示为十进制，无法识别时再显示 HEX 预览
- **APVP transfer mode**：APVP 写入弹窗可勾选 REAL 或 DEBUG 指定写入前切换的 transfer mode；APVP 的 R/RX 属性也会直接显示为可点击写入框，不勾选时自动按 TX=REAL、RX=DEBUG 处理；RX/只读属性写入属于 DEBUG 模拟写入，弹窗会明确提示。输入框、选项和快捷按钮会使用带底色/边框的主题样式，日夜模式都能更清楚地看出可点区域
- **Int32/Float**：数字键盘输入
- **字符串**：文本输入

### 3.5 导出 CSV

支持将当前属性列表导出为 CSV 文件，保存到设备存储 `/data/media/11/Download/EVCC/exports/properties/` 目录下。CSV 包含 21 列完整属性信息。

### 3.6 MCU 日志查看器

特定属性（如 MCU 日志属性）的值可以打开实时日志查看器。

---

## 第四章 服务

服务页集成了音乐桥接、投屏、悬浮窗等多种高级功能。左侧功能卡片统一使用标题前状态圆点：灰色表示未运行或无独立运行状态，绿色表示对应功能已启动。

### 4.1 音乐小窗桥接

将第三方音乐 App（如汽水音乐、网易云音乐等）的播放信息桥接到车机小窗、大卡片、仪表盘等位置，同时实现系统级方向盘切歌和语音控制。ICCOA 和 HUAWEI 手机互联音乐如果已由系统媒体中心上报歌词，EVCC 也会识别并用于桌面歌词等歌词显示。使用伪装注册源时由原车链路负责仪表显示，EVCC 不再重复推送。

**操作步骤**：
1. 打开"**音乐桥接**"开关
2. 软件自动连接 MediaCenter 并监听 MediaSession
3. 音乐播放时，歌曲信息（标题、歌手、封面、歌词）自动推送到车机小窗；ICCOA / HUAWEI 手机互联音乐有歌词时也会被识别；银河 L6/L7 在注册源选择 EVCC 音乐时会同步推送到仪表 DIM 显示链路
4. 小窗上的播放控制会同步回音乐 App

> **重要**：该功能完成配置后，务必重启一次车机。车机启动后，约 1 分钟左右音乐转发桥接生效（生效较慢的原因是要等待媒体中心和注册源白名单载入，该操作每次重启车机会自动进行一次）。

> 领克车型如果音乐桥接状态显示“领克授权异常”，表示车机媒体中心返回 401 授权失败。领克音乐桥接依赖 Frida 注入，建议先重启车机，等待约 1 分钟后再播放音乐验证。

> 对已经由 MediaCenter 原生接管的音乐 App，EVCC 会优先让 App 自己走原生 MC 通道，并通过 MediaCenter 反向读取状态；只有未被原生 MC 接管的 App 才走 Android MediaSession 桥接。

**子选项**：

> 界面中车型选择后面是桌面歌词；注册源下方提供“添加自选”和“强制上送”。注册源及其后几个高级选项建议保持默认，调整后可能带来未知问题。

| 选项 | 说明 |
|------|------|
| 车型 | 选择当前音乐桥接方案：龙鹰通用、银河 L6/L7/E02、新龙鹰测试、老领克07/08；新龙鹰测试用于 P171-A1 适配验证；老领克07/08 方案会通过 Frida 绕过 EAS 鉴权限制，开启后需等待 Frida 注入完成 |
| 桌面歌词 | 开启后在所选显示屏显示桌面歌词，默认底部居中、单行、无底色；仅在音乐桥接运行、正在播放且有有效歌词时出现，暂停后短暂保留并淡出；ICCOA / HUAWEI 手机互联音乐由系统上报歌词时同样支持 |
| 桌面歌词样式 | 可选择显示屏、桌面歌词偏移（-10~+10 秒，0.5 秒步进）、水平 / 垂直位置（支持 -20% 到 120%，100% 为贴右 / 贴底，120% 为额外溢出）、旋转角度、位置锁定 / 触控穿透、最大宽度、字号（12~56）、透明度、描边强度、轻微阴影、单 / 双 / 三行、底色框，以及跟随状态栏、跟随白天/夜间、固定颜色或自定义日夜配色 |
| 注册源 | 选择 EVCC 在 MediaCenter 中采用的注册源，一般保持默认；该选项不代表实际播放音乐的 App。只有当前选中的注册源会被同步到媒体中心白名单。注册源自身回读会被 EVCC 视为注册反射状态，不作为真实播放源接管。银河 L6/L7 默认使用 EVCC 音乐注册源，由 EVCC 同步仪表显示；如手动选择伪装源，则由原车链路负责仪表显示，避免重复推送 |
| 添加自选 | 在现有注册源之外添加自定义包名和显示名称，添加后会出现在注册源列表中；只有被选中时才会上送白名单 |
| 强制上送 | 立即把当前选中的注册源补写到媒体中心白名单，并等待系统媒体组件重启后重新推送，同时刷新注册源列表 |
| 冷启动获取桥接焦点 | 仅影响冷启动、深度睡眠恢复后没有当前播放状态时，是否用上次音乐状态恢复桥接焦点。正常获取 = 按原逻辑恢复上次音乐；仅第三方 = 上次音乐为第三方 App 时恢复，原生音乐不主动补焦点；不获取 = 没有当前播放状态时不恢复上次音乐。已有真实播放状态时仍优先跟随当前播放 |
| 音乐桥接范围 | 管理哪些 Android MediaSession 和 MediaCenter 回读来源会被 EVCC 接管。默认“自动桥接”保持现状；“排除所选 App”可屏蔽视频等不需要桥接的 App；“仅桥接所选 App”只接管勾选 App，留空时不桥接任何 Android MediaSession，只从 MediaCenter 反向读取状态；“忽略 MediaCenter 视频类源”默认开启，已手动保存过该选项的用户保持原设置 |
| 使用全局媒体键控制 | 关闭时默认走定向播放控制，优先控制当前音乐 App；开启后改用系统全局媒体键，由 Android / 车机系统决定接收者。全局媒体键播放无响应时仍会按“拉起等待”尝试恢复，但只要 3 秒内检测到任一 Android MediaSession 播放过，就不会再拉起上次音乐 App。新版本升级后默认关闭，不沿用旧开关状态 |
| 播放时不拉起音乐 App 前台 | 开启后，点击仪表盘或音乐控制组件的播放按钮时只向上次音乐 App 发送后台播放信号，不再自动把 App 拉到前台；关闭时仍按默认策略前台兜底拉起 |
| 拉起等待 | 默认 3 秒。关闭“播放时不拉起音乐 App 前台”时，后台播放信号发出后若仍未检测到播放，会按该秒数等待后再拉起音乐 App 前台 |
| 模拟蓝牙歌词 | 开启后播放中会将当前歌词行临时伪装成歌名推送给车机，暂停时恢复原歌名，适合只读取歌名字段显示歌词的仪表盘 / 悬浮窗。关闭则始终显示原歌名 |
| 歌词时间偏移 | 仅在模拟蓝牙歌词开启后显示并生效，范围 -10~+10 秒，0.5 秒步进；提前会更早切换歌词，延后会更晚切换 |
| L7 HUD 歌词（实验） | 仅在匹配的 L7 车型上显示，此功能为实验测试功能。开启后会把当前歌词行写入 DIM 导航信息接口的“下一引导点名称”，并固定随歌词发送导航有效状态和 ETA 刷新信号，这是当前实测确认的 HUD 刷新条件。EVCC 会尽量通过根服务读取原车导航 ETA，读取可用时复用原车 ETA 触发刷新，不再显示原车导航状态调试信息，也不再提供候选字段、触发信号或转向箭头动画测试选项。模拟下一引导点距离可单独开关，开启后会随歌曲播放进度从 100 递减到 0，对应播放百分比 0%~100%。关闭、暂停或无歌词时默认会清空歌词并发送 END / 未导航状态，等待原车地图后续持续推送恢复；“歌曲暂停时清空导航状态”可关闭。支持独立的 HUD 歌词偏移，范围 -10~+10 秒，0.5 秒步进；“长歌词分段显示”会把较长歌词拆成短片段，并按当前歌词行时长动态安排刷新，尾部单字短片段会自动并入前一段，英文单词尽量按词切分，减少 HUD 慢速滚动导致的未读完或漏片段问题 |

音乐转发卡片会在歌曲信息下方显示当前歌词行；服务页音乐桥接状态会在识别到新歌后立即查询云端 BPM 库，命中后把 BPM 显示在当前歌曲信息后面。云端提供高精分段结果时，这里会随播放位置显示当前分段 BPM，分段未覆盖的位置自动显示整曲 BPM；高精分析结果没有分段时，表示歌曲速度基本恒定，整首显示同一个 BPM。云端明确无结果时显示“BPM：无”，并在本机缓存最多 3000 首结果。开启米德宝 BLE 直发音乐律动时，歌词上方会额外显示米德宝是否正在律动、当前动作指令、速度指令档位和上次发送指令，方便确认机器人指令状态。支持 seek 的音乐 App 可通过 EVCC mini 音乐页或 MUSIC 组件拖动进度条调整播放位置。ICCOA / HUAWEI 手机互联音乐如果由系统提供当前歌词，也会进入同一条歌词显示链路。开启模拟蓝牙歌词后，卡片歌词行和车机标题都会按歌词时间偏移同步提前或延后；L7 HUD 歌词使用同一条当前歌词行，播放中写入，暂停、无歌词或关闭开关后清空。如果当前音乐 App 没有广播歌词，会先提示 EVCC 正在联网搜索歌词；确认未搜索到后，再以橙色提示。

音乐桥接范围中的应用列表会自动学习：只要某个 App 出现在 Android MediaSession 扫描或真实 MediaCenter 回读中，就会记录到“已发现的媒体会话 App”里，显示应用名、包名、来源和最近状态，方便勾选；也可以点“选择 App”从已安装应用中手动加入包名。EVCC 的伪装注册源和托管占位包不会加入这个列表。该功能不改变注册源白名单；“忽略 MediaCenter 视频类源”默认开启，未保存过该选项时视频类回读来源不会被当作音乐来源接管。

桌面歌词按行定位，不做逐字卡拉 OK。若歌词和实际声音略有不同步，可在“样式设置”中用“桌面歌词偏移”微调；未锁定时可直接拖动歌词，也可在“样式设置”中用水平 / 垂直位置滑条精确调整，位置滑条支持 -20% 到 120%：0% 到 100% 对应屏幕内位置，-20% 可向左 / 向上局部越界，120% 可向右 / 向下局部越界；桌面歌词开关也可通过自动化、控制台组件和悬浮窗组件里的“EVCC 卡片动作 → 媒体桥接 → 桌面歌词”控制。位置锁定只在设置弹窗中控制，锁定后会触控穿透，不影响地图、音乐 App 和系统手势。桌面歌词按目标显示屏真实密度绘制，和状态栏信息卡一样不受 EVCC 软件 DPI 设置影响。最大宽度控制长歌词的换行和省略范围，底色框会按当前歌词内容收紧为居中的胶囊，不再铺满整个宽度；描边强度和轻微阴影可按背景明暗调节，阴影也可以关闭。固定颜色提供白、黑、暖白、暖黄、冷白、银灰、薄荷、天青等低饱和选项；自定义日夜配色可分别设置白天和夜间的文字、描边、底色，既可以点预设色块，也可以用 RGB 滑条输入任意颜色，跟随状态栏和跟随白天/夜间模式都会使用这两套配色。若车机有副屏或虚拟屏，可在“样式设置”的显示屏选择中指定目标 display；右上角“恢复全部默认设置”会保留桌面歌词开关，只重置样式和位置配置。

封面会优先使用可获得的高清源；汽水音乐播放过的歌曲会尝试读取其本地队列缓存里的原始封面地址，成功时可让 mini 音乐页和 MUSIC 组件显示更清晰的大封面。

默认关闭“使用全局媒体键控制”时，仪表盘播放键、EVCC mini 小窗或 MUSIC 组件会优先走定向播放控制，尽量直接控制当前音乐 App；开启后才改用系统全局媒体键，由 Android / 车机系统决定当前接收者。如果这次播放键已经进入 EVCC，但上次音乐 App 没有恢复播放，EVCC 仍会按“拉起等待”做前台兜底，并在拉起后继续发起播放操作；只要 3 秒内检测到任一 Android MediaSession 播放过，或 EVCC / MC / MediaSession 已确认其他播放器正在播放，就不会再抢回上次音乐 App。开启“播放时不拉起音乐 App 前台”后，则只发后台播放信号，不做前台拉起。新版本升级后该选项默认关闭，不沿用旧开关状态。

如需对比排查封面短暂显示后消失、旧封面不刷新等问题，可在服务页音乐桥接的注册源下方开启"不获取高清封面"。该选项对所有车型生效。默认情况下 EVCC 不再创建、清理或写入 MC 私有封面缓存目录；如需临时验证这条旧链路，可长按任一车型按钮打开"音乐桥接调试选项"，再开启"写入 MC 封面缓存"。同一调试框中也保留 SDK 注册、强制 EAS 鉴权绕过，以及领克专用的本地文件拷贝模式和 MC 数据目录覆盖选项；其中 MC 数据目录覆盖只用于领克封面本地文件调试，不会改变注册源白名单文件路径，白名单路径始终按车型固定。

**自选注册源**：旧版“媒体源白名单”不再作为独立配置项使用。需要额外注册源时，点击“添加自选”，填写包名和显示名称，添加后再从“注册源”列表里选中它。只有当前选中的注册源会被自动写入 MediaCenter 白名单；切换注册源时，EVCC 会立即上送白名单并尝试运行时应用，不再主动重载媒体中心。手动“强制上送”会等待系统媒体组件自启后自动重启音乐桥接，确保 EVCC 白名单重新推送，并刷新注册源列表。

**占位包伪装源（实验）**：当内置白名单音乐源完全未安装、未禁用且 EVCC 内置了对应占位包时，列表会标记“推荐 · 占位包伪装”。选择后 EVCC 会先弹窗说明用途，确认后通过 RootService 安装一个极简占位包，仅用于让媒体中心识别该白名单源；真实播放、控制和放大按钮仍会指向当前桥接的音乐 App。切换到其他注册源后，EVCC 会在后台卸载自己安装的占位包，并定期清理残留。从配置商店套用包含占位源的音乐桥接配置时，EVCC 也会自动补装缺失的占位包。该能力依赖 RootService，安装失败时不会切换注册源。

**注册源提示**：注册源列表会在名称前用图标和文字提示推荐程度。EVCC 音乐显示“默认 · 推荐使用”；手动添加的来源显示“自选 · 手动添加”；EVCC 可安装占位包的来源显示“推荐 · 占位包伪装”；已安装的原车内置来源显示“不推荐 · 自带包伪装”；类型不符、未安装或已禁用的来源显示“无法使用 · 类型不符 / 未安装 / 已禁用”。一般保持 EVCC 音乐即可。银河 L6/L7 旧版本中若沿用了酷我作为默认注册源，升级后会自动恢复为 EVCC 音乐；确需占位包或自带包伪装时仍可手动切换。切换到某个真实包作为注册源后，该包自身的回读状态也会被视为注册反射，避免和当前真实播放 App 抢占音乐控制。

#### 隐藏 AI 音乐律动悬浮窗

部分车机在前台使用音乐类 App 时，会自动显示"AI 音乐律动"悬浮窗，误触后可能修改氛围灯颜色。服务页的"隐藏 AI 音乐律动悬浮窗"开关用于隐藏这个系统悬浮窗。

**操作**：
1. 服务页找到"**隐藏 AI 音乐律动悬浮窗**"
2. 打开开关
3. 按提示重启车机系统后生效

> 重启期间车机屏幕会短暂不可操作，请停车后再执行。

### 4.2 HUD 投屏 (Overlay Cast)

将指定 Activity 投射到悬浮窗口，常用于投射导航地图到 HUD 或小窗。

**基本操作**：
1. 打开"**小窗投屏**"开关
2. 配置参数：
   - **目标 Activity**：手动输入组件名，或勾选"自动探测地图"自动查找导航应用。也可选择"纯黑色块"作为遮挡用途
   - **显示器**：目标显示器 ID（可选择投放到仪表投屏；选 EVCC DashCast 后会自动跟随对应虚拟屏生命周期 —— 目标投屏关闭时 HUD 会软暂停，重开后 HUD 自动重挂，不用再手动启动一次）
   - **投屏模式**：EVCC DashCast 直投会跳过中转画面层；如果使用缩放、裁切、旋转或位置偏移，EVCC 会自动切回虚拟屏投屏，让这些画面参数生效
   - **虚拟屏分辨率**：投屏的虚拟屏幕宽高
   - **缩放比例**：百分比缩放
   - **裁切**：上下左右裁切像素
   - **旋转**：0/90/180/270 度
   - **位置偏移** (X/Y)：微调投屏位置
   - **透明遮罩**：启动或恢复地图投屏时先投放透明画面，等待导航 HUD 起稳后淡入，避免看到重启空窗；投到 EVCC DashCast 且使用 BGRA+LZ4 时支持真透明，H.264 模式无 alpha 会退回黑色遮挡
3. 点击"**启动**"开始投屏
4. 运行中点击"**更新**"实时调整参数
5. 点击"**停止**"结束投屏

**色彩处理管线**：

支持白天/夜间两套独立配置，可调节：

| 参数 | 说明 |
|------|------|
| 亮度 | 整体亮度 |
| 对比度 | 明暗对比 |
| 饱和度 | 颜色鲜艳程度 |
| 黑电平/白电平 | 色阶控制 |
| RGB 通道增益 | 红/绿/蓝单独增减 |
| 色相偏移 | 整体色相旋转 |
| 色温/色调 | 暖色/冷色偏移 |
| RGB 通道偏移 | 通道偏移 |
| 羽化 | 边缘渐暗效果 |
| 透明度 | 整体透明度 |
| 反色 | 颜色反转 |

**预设配置**：原始、HUD 暗、HUD 反、极简、暖色。

**自动模式**：跟随系统暗色模式自动切换白天/夜间配置。

**HUD 控制**（通过 Frida 注入导航应用实现）：
- 夜间模式：强制导航使用夜间配色
- 焦点修复：修复投屏时导航失去焦点
- 简化显示：可选择隐藏或调整多项地图元素（部分调整可能效果不好或不起作用，通常开启默认调整即可）；顶部"视觉优化"里的"完整夜间底色"会让地面和道路一起使用夜间底图，仅作用于投屏到 HUD 的地图画面，不影响主屏地图
- 内置"HUD 模式"预设：一键只保留道路和路况

**主屏地图美化**（服务页的主屏地图增强配置）：
- 车道级增强里有两个俯仰相关开关："车道级定时回拉俯仰=70"是旧的 3 秒补偿式回拉，可能和车道级导航自身视角产生拉锯；"车道级强锁俯仰=70"会在车道级激活时从源头阻止俯仰角偏离 70 度，更适合需要稳定固定俯仰角的车道级导航场景。
- 推荐预设默认启用"车道级强锁俯仰=70"，一般不需要同时开启旧的定时回拉。
- 如果发现车道级视角跟随或车头朝前行为异常，优先只保留强锁开关，关闭普通 3D 的"锁定视角参数"和旧的"定时回拉俯仰"做对比。

**参数导入/导出**：
- 导出二维码：生成投屏参数二维码 + JSON，可复制分享
- 导入参数：粘贴 JSON 导入配置
- 恢复默认：一键重置

### 4.3 仪表投屏（Dashcast）

将任意内容投放到仪表物理屏幕。适用于龙鹰一号、双龙鹰一号等支持的车型。

**功能特点**：
- 支持两种编码模式：BGRA+LZ4（真 alpha 透明，像素完美）和 H.264 RTP（带宽更省）
- 可叠加信息卡片到仪表屏（如车速、时间、温度、电量等）
- 支持形状遮罩、羽化效果、圆角、梯形变换（用来贴合仪表屏非矩形显示区域）
- 可视化编辑器直接拖动调整信息卡位置
- 信息卡刷新会自动合并重复值并降低高频刷新压力，只开启信息卡、不投屏时也会尽量减少仪表端卡顿
- 横屏（sw≥600dp）自动切换双栏布局

#### 首次启用流程

1. 服务页找到"仪表投屏"卡片，打开主开关
2. 软件自动扫描 `198.18.44.0/24` 网段探测 CP 节点（龙鹰车型默认地址为 `198.18.44.2`）
3. 连接成功后状态指示变绿，并显示 CP 侧 `dashcastd` 守护进程版本号
4. 选择要投屏的"源 Activity"（如悬浮窗桥接、HUD 组件、纯黑遮挡、Dashcast 专用活动）
5. 勾选"开机自启动"后，车机重启后会自动重连 CP 并恢复投屏

> 若连不上 CP：用 ADB 面板的 `ping 198.18.44.2` 先确认网络通，不通时需检查车机 USB-C 调试线（或者车机侧以太网桥接）是否接好。

#### 信息卡片编辑

打开"卡片编辑器"后可直接在仪表屏预览图上拖拽：

| 操作 | 说明 |
|------|------|
| 添加卡片 | 右侧工具栏点击"+"选择数据源（VHAL / APVP / AIDL / CAPI / AdaptAPI / 系统 / 变量 / 当前时间） |
| 拖拽定位 | 按住卡片移动到目标位置，支持吸附到屏幕边缘与对齐线 |
| 调整大小 | 四角手柄拖拽缩放 |
| 调整字号 | 侧栏滑块，可一键"全部同步"统一字号 |
| 不透明度 | 单独调节每个卡片透明度（默认 100%） |
| 显示表达式 | 对原始值做公式转换（如 `x * 0.1` 缩放） |
| 形状遮罩 | 可选矩形/圆角矩形/圆形，配合羽化参数实现边缘过渡 |
| 梯形变换 | 用于适配车型仪表"弯曲"视角（上/下/左/右边收缩百分比） |

**数据断连处理**：某路数据源断开时，卡片保留最后一次值 10 秒，超时后整体变灰，方便驾驶员识别数据不再刷新。

#### 编码模式选择

| 模式 | 带宽 | 画质 | 适用 |
|------|------|------|------|
| BGRA+LZ4 | 较高 | 像素完美 + 真 alpha 透明 | 静态/半透明卡片叠加（推荐） |
| H.264 RTP | 较低 | 存在压缩伪影，无透明 | 需要全屏动态画面（如视频播放） |

> 默认用 BGRA+LZ4。只在明显卡顿或带宽不足时才切到 H.264。

#### 排错速查

| 现象 | 检查点 |
|------|--------|
| 开关一开就跳回 | CP 节点没连上，检查 `ping 198.18.44.2` |
| 连上但仪表屏空白 | 源 Activity 没有启动，或投屏分辨率和仪表屏真实分辨率差异过大 |
| 画面撕裂 / 闪烁 | 切换编码模式、降低刷新率或缩小虚拟屏分辨率 |
| 重启车机后不自动恢复 | 确认已勾选"开机自启动"，同时自动化引擎也需开机自启 |

### 4.4 悬浮窗

在车机界面上显示可自定义的悬浮工具栏，跨应用常驻。

**启用步骤**：
1. 打开"**悬浮窗**"开关 → 系统会弹授权对话框，允许"显示在其他应用上方"
2. 授权后悬浮窗自动显示在屏幕上，可长按拖动到任意位置
3. 点击悬浮窗上的"齿轮"按钮（或服务页"管理按钮"）即可调整按钮清单

**基本设置**：

| 选项 | 说明 |
|------|------|
| 透明度 | 20%~100%，低透明度适合常驻但怕遮挡的场景 |
| 大小 | 50%~150%，按屏幕 DPI 等比缩放 |
| 方向 | 水平排列 / 垂直排列，会自动调整拖拽吸附行为 |
| 主题 | 白天 / 夜间 / 自动（自动模式跟随系统暗色） |
| 管理按钮 | 打开按钮编辑器，新增 / 删除 / 排序按钮；默认的 EVCC 启动按钮也可改图标、改功能或删除，但列表至少保留一个按钮 |
| 展开后点击自动收起 | 在"悬浮窗设置"中开启后，展开的多行悬浮窗点击任意动作图标会自动恢复折叠；默认关闭 |
| 导入配置 | 粘贴他人分享的 JSON 配置，一键套用按钮布局 |
| 导出配置 | 导出当前布局为 JSON / 二维码，方便跨车分享 |

**按钮类型**（在"管理按钮"中新增）：

| 类型 | 说明 |
|------|------|
| 控制台按钮桥接 | 直接复用控制台某个按钮的动作 |
| 设置属性 | 按已连接的数据源顺序写入指定车辆属性值 |
| 执行命令 | 以 Root 权限执行 Shell |
| 启动应用 | 打开指定包名（可直接选已装应用） |
| APP投屏 | 将指定应用或当前前台应用投放到目标屏幕 |
| 杀死应用 | 强制停止指定包名，或勾选"杀死当前前台应用"一键停掉当前可见应用 |
| 退出应用 | 把指定应用退到后台 / 回主屏，或勾选"退出当前前台应用"作用于当前可见应用 |
| 小窗应用 | 打开 / 切换 / 关闭小窗 |
| 触发自动化 | 触发指定规则，选择和已选状态会同时显示规则名称与 ID |
| EVA 联动 | 发送 EVA 动作编组 |
| 米德宝联动 | 发送米德宝动作编组，可设置优先级、连续动作和自定义 HEX |
| 回到桌面 | 模拟 Home 键 |
| 音乐控制 | 播放 / 暂停 / 切换 / 上一首 / 下一首；选择"播放/暂停"动作后可在播放模式里指定"切换 / 播放 / 暂停"，媒体动作也可勾选"全局媒体键模式"来兼容只响应系统媒体键的 CarPlay 盒子或蓝牙盒子 |
| 热点控制 | 打开 / 关闭 / 切换 / 仅配置系统热点，可同步设置热点名称、密码、安全类型、频段、信道和隐藏名称 |
| 自定义图标 | 从图标库选 Material 图标 + 自定义颜色；APP 操作里有固定包名时，可在按钮图标行直接勾选"使用App图标" |

> 悬浮窗和控制台是互补关系：控制台是"停车时打开的大屏"，悬浮窗是"开车时也能快速点"。建议把最常用的 3~6 个按钮放进悬浮窗。

### 4.5 状态栏信息

在状态栏显示自定义信息卡片，实时展示车辆属性。副屏可独立配置。

**配置步骤**：
1. 服务页打开"**状态栏信息**"开关
2. 点击"**管理项目**"进入编辑器
3. 点击"**+ 添加项**"，填写：
   - **图标**：从图标库选
   - **数据源**：VHAL / APVP / AIDL / CAPI / AdaptAPI / 变量 / 时间
   - **属性 ID** 或变量名
   - **运算公式**（可选）：对原始值做转换，如 `x * 0.1`
   - **值映射**（可选）：如 `0=P,1=R,2=N,3=D`
   - **单位后缀**：如 `°C`、`km/h`
4. 保存后状态栏立即刷新

**副屏独立配置**：
- 在同一编辑器中切换"主屏 / 副屏"标签页，两屏可独立配置不同卡片
- 副屏配置仅在检测到副屏（乘客屏、Dashcast 虚拟屏）时生效

> 状态栏空间有限，建议最多放 4~5 项。超出后会自动挤压字号。

#### 原生状态栏注册

服务页"悬浮窗"板块的状态栏信息下方还提供"**原生状态栏注册**"，它不是普通悬浮窗，而是把控制台组件或手动添加的开关、按钮、信息卡注册到 Flyme 车机原生状态栏插件框架里。

点击状态栏 EVCC 图标后，弹层会以接近 Flyme 通知管理的 APP 图标列表展示：每一项都是左侧图标、标题和类型提示，右侧按控件类型显示开关、"执行"按钮或当前值；顶部小屋图标可直接打开 EVCC。

**使用方式**：
1. 打开"原生状态栏注册"
2. 进入"管理状态栏控件"，可手动添加项目，也可从控制台导入已有组件，并用上下按钮调整显示顺序
3. 首次启用或修改控件后，可点击卡片内的"重启 SystemUI"让状态栏重新扫描插件并显示；也可以重启车机

> 这是实验功能；如果状态栏没有出现，先确认卡片状态是否提示"已注册，请重启车机或 SystemUI 后生效"。

### 4.6 小窗应用（Mini Window）

将任意 Android 应用以小窗形式显示在主屏或副屏上。应用运行在虚拟显示区中，通过 TextureView 投射到可拖拽的浮窗内，可实现多应用同屏显示。需要 Root 权限。

**打开方式**（三种）：
- 悬浮窗按钮：添加"应用小窗"按钮
- 仪表盘组件：添加小窗类型组件
- 自动化规则：添加小窗动作

**配置参数**：

| 参数 | 说明 |
|------|------|
| 目标应用 | 指定固定包名，或勾选"前台应用小窗"自动使用当前前台应用 |
| 目标屏幕 | 主屏 (Display 0) 或副屏 (Display 1/2 等，如副驾屏) |
| 窗口宽高比 | 竖屏 9:16、3:4、9:19.5；横屏 16:9、4:3；正方形 1:1；或自定义 |
| 分辨率 (短边) | 320~800px，影响清晰度与性能 |
| DPI | 160~420，影响字体与控件缩放 |
| 旋转角度 | 不旋转 / 90° / 180° / 270° |
| 标题栏 | 显示或隐藏 |

**手势操作**：

| 手势 | 效果 |
|------|------|
| 标题栏左侧 1/3 点击 | 全屏展开 |
| 标题栏右侧 1/3 点击 | 关闭小窗并结束应用 |
| 标题栏中间单击 | 返回键；快速三击：重置位置 |
| 上滑超过顶部 30% | 隐藏到后台（应用保持运行） |
| 下滑超过底部 40% | 全屏展开 |
| 双指拖拽 | 移动小窗 |
| 双指 pinch | 缩放大小 |
| 左下角/右下角拖拽 | 调整宽度（保持比例） |

**吸附行为**：小窗拖拽结束时，靠近其他小窗或屏幕边缘（约 60dp 内）会自动吸附对齐，多窗口会智能避开重叠。

**小窗动作类型**：

| 动作 | 说明 |
|------|------|
| toggle | 已有则隐藏/显示，否则打开新窗口 |
| open | 始终打开新窗口 |
| close_all | 关闭所有小窗 |
| hide_all | 隐藏所有小窗到后台，不退出应用 |

> 如果不需要悬浮小窗，而是要把应用 task 直接切到另一块屏幕，使用动作类型"APP投屏"；它和"启动应用"类似，额外支持勾选"投放当前前台应用"。

  ### 4.7 STR 休眠防护

防止车机进入 STR (Suspend to RAM) 深度休眠。

**原理**：通过 VHAL 定时写入特定属性值告知 MCU 有活跃任务。

**操作**：
1. 打开"**STR 防护**"开关
2. 配置参数：
   - **属性 ID**：按当前车型适配填写
   - **写入值**：按当前车型适配填写
   - **刷新间隔**：10~600 秒，默认 120 秒
   - **电量属性 ID**：用于检测电池电量
   - **电量阈值**：低于此电量自动暂停防护
3. 修改后点击"**保存**"

### 4.8 电量保护

设置电量阈值，低电量时自动停止耗电服务（如 STR 防护），避免耗尽电池。

### 4.9 DPI 调节

服务页 DPI 卡片包含两部分：EVCC 自身 DPI 用于调整 EVCC 主界面缩放；Frida DPI 调节用于动态修改指定应用的显示 DPI。设置页"配色方案"下方也提供 EVCC 自身 DPI 快捷入口。

> **注意**：该功能目前并不稳定，不建议长期使用。
> 使用前需先部署 Frida，并在"连接"页打开 Frida 开关；否则打开开关或注入时会提示先处理 Frida。

**操作**：
1. 打开"**DPI 调节**"开关
2. 点击"**添加应用**"→ 选择目标应用 → 输入目标 DPI 值
   - 常用值：120(ldpi) / 160(mdpi) / 240(hdpi) / 320(xhdpi) / 480(xxhdpi) / 640(xxxhdpi)
3. 点击"**注入全部**"→ 启动守护模式，自动注入所有已配置应用（守护模式下目标应用重启时自动重新注入）
4. 点击"**停止全部**"→ 停止注入，重启应用后恢复默认

### 4.9.1 音量组调整

服务页"**音量组调整**"用于临时查看和手动调整车机音量组。点击"**打开音量组调整**"后，EVCC 会自动查询全部音量组，并按每个组的最小值、最大值和当前值生成滑条。

拖动某个音量组的滑条并松开后会立即写入该组音量；也可以点击该组的"**测试**"按钮播放短测试音，辅助判断它对应车机里的哪一路声音或哪个位置。若车机未提供该音量组的音频用途映射，测试按钮会显示失败原因。

### 4.9.2 L7 三指飞屏解除

银河 L7 可通过原厂三指滑屏把当前应用飞屏到副驾屏。该卡片用于解除原厂应用白名单限制，让已安装且可启动的应用也能参与三指飞屏。

**使用前提**：
- 仅面向银河 L7 / CSD 车型开放，EVCC 会按车型标识自动显示/隐藏该卡片
- 需 RootService 正常连接，并已部署 Frida、打开 Frida 开关
- 不绕过原厂 P 挡限制；非 P 挡下仍按原厂逻辑拦截

**操作**：
1. 服务页找到"**L7 三指飞屏解除**"
2. 打开开关，等待状态显示"守护中 · 已注入"
3. 在主屏打开目标 App，使用原厂三指滑屏手势飞屏到副驾屏
4. 如需恢复原厂白名单行为，关闭开关即可

> 关闭开关会停止后续守护；相关系统界面刷新后会完全恢复原厂行为。如果状态显示"已保护性暂停"，说明相关系统界面短时间内异常重启过快，EVCC 已停止继续重试；关闭开关后再重新开启可清除保护状态。

### 4.10 远程控制

通过即时通讯平台机器人远程控制车机。

**支持平台**：钉钉 / Telegram / 飞书

**配置步骤**：
1. 选择平台 → 填入凭据（如机器人 Token、App Key/Secret）
2. 可开启"自启动"，应用启动时自动连接
3. 点击"保存"保存配置，"连接"手动连接

**远程命令**：

| 命令 | 说明 |
|------|------|
| `状态` / `status` | 查看设备状态 |
| `帮助` / `help` | 显示帮助信息 |
| `exec <命令>` | 执行 Shell 命令 |
| `重启` / `reboot` | 重启设备（需二次确认） |
| `日志` / `log` | 获取最近日志 |
| `服务` / `services` | 查看运行中的服务 |
| `ping` | 测试连通性 |

#### 小程序 MQTT 上报

服务页"**远程控制**"卡片下方可能按云端适配显示"**小程序**"卡片，用于把指定车辆属性和变量值上报到小程序服务端。当前只做状态上报，不开放远程控车。

**配置步骤**：
1. 在小程序服务端完成手机号快捷登录，获取 MQTT 用户名和密码
2. 打开小程序卡片右侧开关，展开配置区；未填写配置时也可以先打开
3. 默认模式由当前车型适配决定，未配置时使用"预设配置"；预设配置下填写 MQTT 用户名和密码即可，Broker 地址、端口、全量兜底间隔和上报项列表按当前车型预设处理；如果页面显示引导文案，按文案完成小程序侧绑定
4. 如需上传车辆定位，单独打开"上传定位信息"；默认不上传定位
5. 如需自己填写 Broker、端口、全量兜底间隔或上报项列表，点击"自定义"后再编辑；自定义模式不会自动预填上报项，属性写十进制或 `0x` 十六进制 ID，变量写 `$time`、`${trip_fuel_last}` 或 `var:trip_fuel_last`，定位信息仍通过独立开关控制；上报项列表右下角的"放大"图标可打开大输入框，适合编辑较长列表
6. 点击"保存配置"保存；需要立即上报时点击"启动"，停止上报时点击"关闭"；自定义模式下如需重新使用默认列表，可点击"恢复默认"
7. 如需车机启动后自动连接，可勾选"开机自动启动小程序上报"

小程序默认模式可由云端车型适配决定，未配置时为预设配置；旧版本升级后，如果本机还没有保存过模式选择，会先进入当前车型的默认模式。定位信息默认不上传。预设配置下，上报项列表会按当前车型使用云端适配值；即使云端把该值作为默认项下发，EVCC 在预设模式也会直接使用它。切到自定义后，Broker 地址、端口、全量兜底间隔和上报项列表均以本机填写内容为准，不再跟随云端预设；本机没有保存过自定义上报项时，列表会保持空白，启动前需要填写至少一个上报项或手动点击"恢复默认"。列表支持换行、空格或逗号分隔，重复项会自动去重；属性只需要填写 ID，不需要填写属性名称。

EVCC 会在连接成功后立即上报一次完整快照，之后属性或变量发生变化会实时增量上报，并按设置间隔周期全量兜底。属性值发布到 `evcc/<MQTT用户名>/<属性ID>/state`，变量值发布到 `evcc/<MQTT用户名>/var/<变量名>/state`；`meta` 里会同时列出 `properties`、`variables` 和完整 `items`。状态和设备元信息会保留在 MQTT 服务器，具体上报值和心跳不保留；找不到或当前数据源未返回的属性、无法读取的变量会跳过，并计入心跳里的缺失数量。

> 建议 Broker 地址使用 `ssl://`。如果使用 `tcp://`，EVCC 设备 ID 和 VIN 可能以明文传输，请只在可信网络中使用。
>
> 该入口默认隐藏，仅由云端车型适配 `service.show_mini_program` 显式开放。云端关闭后，卡片会隐藏，并自动关闭启用和自启开关。

#### 米德宝联动（实验）

服务页实验区可能按车型适配显示"**米德宝联动**"卡片。默认模式用于把 EVCC 读取到的车辆属性或变量同步到银河悬浮歌词的数据面板；也可以打开卡片内的"BLE 直发模式"，通过 ESP32 A 板向米德宝直发控制指令。

**配置步骤**：
1. 普通联动模式需先确认车机已安装"银河悬浮窗歌词"应用；打开米德宝联动卡片右侧开关时，EVCC 会自动检测，未安装会弹出说明、咨询购买二维码和网址（http://z.tmyml.cn:3012/）
2. 点击"管理属性"会先查看当前已添加的属性列表；在列表弹窗中点击某个属性可修改或删除，点击"添加"可新增属性
3. 新增或修改属性时，填写显示名称、取值来源、Area ID、可选值映射和实时推送开关；保存后 EVCC 会自动写入配置并应用
4. 高级用户可点击"修改配置JSON"，在大输入框里直接编辑完整 JSON 配置；保存前 EVCC 会校验格式和项目有效性，保存后属性列表也会同步更新
5. 如需回到当前车型预置项，可点击"恢复默认"，确认后会替换当前自定义项目
6. 如使用 ESP32 A 板直发，先勾选"BLE 直发模式"，原来的属性管理按钮会切换为"音乐律动联动"和"联动配置"两个入口；总开关仍负责启停，开启后会随 EVCC 开机或休眠恢复自动运行
7. "音乐律动联动"里可以启用音乐律动，并在"BPM 对照表"中为 F3/F5 的各速度档以及 F4/F6/F7 固定动作设置参考 BPM。普通 BPM 或高精分析没有真实分段时，EVCC 会在全部已启用项中选择差值最小的动作；高精分析有真实分段时，只会在 F3、F5 中按整首分段的持续时间和 BPM 综合选择更合适的一组动作，并在整首歌曲中保持该动作不变，再根据当前播放位置把速度实时调到最接近当前分段 BPM 的档位。歌曲开头尚未进入任何 BPM 分段时先使用 1 档，分段之间未覆盖的位置使用整曲 BPM。差值相同时选择参考 BPM 较低的一项，参考值也相同时选择表中靠前的一项。每项可以单独启停或恢复默认，也可以全部恢复；至少需要启用一个动作。BPM 未命中时的兜底动作仍可单独设置，默认是随机动作速度 3；云端明确无结果时直接使用兜底，5 秒仍未返回时先执行兜底动作，30 秒内如果延迟命中 BPM，会自动补切一次对应动作
8. 音乐律动启用后，音乐桥接卡片歌词上方会显示米德宝是否正在律动、动作指令状态、当前速度档位和上次发送指令；高精分段歌曲播放、跳转或恢复后，会按当前位置更新卡片 BPM 和米德宝速度，相邻分段仍命中同一档时不会重复发送指令。切歌后的 3 秒稳定等待只用于避免米德宝重复发送指令，不会延迟 BPM 查询；正常切歌会优先按速度差量轻量调整并重启律动，固定速度动作期间会每隔几首歌低频无感归零，只有 EVCC 重启/米德宝直发重新打开、暂停超过 3 分钟、或长时间未归零时才会重新归零校准
9. "联动配置"里可以发送 A 板 MAC 配置、灯光配置，调整 BLE 发送时长和间隔；下方按动作分类紧凑列出全部正式指令的测试按钮，并保留组合测试和动作速度档测试，方便逐条验证 A 板接收和米德宝反应
10. 需要把米德宝加入场景时，先开启 BLE 直发模式，再在自动化、控制台组件或悬浮窗按钮中选择"米德宝联动"动作，编排基础控制、表情、音乐律动、直接动画、语音动作、动作音效、场景屏效、音乐表情、延迟、连续动作和自定义 HEX

默认参考 BPM 为：F3 速度 1–6 依次是 `17 / 50 / 66 / 82 / 99 / 125`，F4 是 `151`，F5 速度 1–7 依次是 `30 / 64 / 88 / 115 / 144 / 172 / 210`，F6 是 `133`，F7 是 `21`。

该入口默认隐藏，仅由云端车型适配显式开放。配置内容请按管理员或车型配置说明填写，日常使用中一般不需要手动修改。

#### frpc 内网穿透（实验）

服务页的"**frpc 内网穿透**"用于通过自建 frps 服务器把车机上的本地端口映射到公网，适合临时远程访问调试服务。

**基本流程**：
1. 点"配置" → "二进制管理"，在线下载或本地导入 `linux_arm64` 的 frpc
2. 在"简表单"里填写 frps 服务器地址、端口、Token，并添加要映射的本地端口/远程端口
3. 高级用户也可以切到"高级"直接编辑完整 frpc 配置
4. 保存后打开总开关；异常时点"日志"查看启动输出

> 暴露车机服务到公网有明显安全风险。只映射必要端口，并确保 frps Token、远程端口和防火墙规则都可控。

#### 动态壁纸导入

服务页非实验区可能按云端适配显示"**动态壁纸导入**"卡片，位置在"热点增强"上方，用于把 MP4 视频或已经制作好的动态壁纸压缩包加入系统"我的壁纸"列表。卡片里的"制作壁纸包"会显示二维码，方便用手机打开在线制作工具生成更复杂的压缩包。

只有一个 MP4 视频时，直接点击"**导入视频**"，EVCC 会自动生成普通动态壁纸包并导入。如果要制作日夜自动切换或点击互动壁纸，可以点击"**制作壁纸包**"扫码打开 E245 动态壁纸包制作工具，也可以在浏览器里访问：`https://evcc.coauto.cc/static/dynamic-wallpaper-editor/index.html`。该工具在本地浏览器打包素材，不上传视频文件；当前仅按 E245 动态壁纸结构制作单个循环视频包、日夜自动切换包和点击互动包，并可从视频自动截取封面图。

**支持的压缩包**：
- 普通视频壁纸：压缩包内包含数字 ID 文件夹，例如 `900001/900001.mp4` 和 `900001/900001.png`
- 交互视频壁纸：压缩包内包含数字 ID 文件夹，例如 `900002/config.xml`、`900002/0.mp4`、`900002/900002.mp4`、`900002/900002.png`，以及可选的 `900002/900002.zip`

**操作**：
1. 服务页找到"**动态壁纸导入**"
2. 只有 MP4 视频时，点击"**导入视频**"，选择 `.mp4` 文件，EVCC 会自动生成封面和普通视频壁纸结构
3. 已有 zip 壁纸包时，点击"**导入壁纸包**"，默认会打开 EVCC 自带的本机文件选择器，可在 Download 等目录选择已制作好的 zip 压缩包，也可以直接填写完整路径，例如 `/sdcard/Download/900002.zip`
4. 需要制作复杂壁纸包时，点击"**制作壁纸包**"并用手机扫码生成 zip
5. 导入完成后点击"**打开系统壁纸**"，在系统壁纸列表中预览和设置
6. 如需移除 EVCC 导入的动态壁纸，回到该卡片点击"**清理**"，会删除 EVCC 导入的记录和文件，不影响系统自带壁纸

> 该入口默认隐藏，仅由云端车型适配 `service.show_dynamic_wallpaper_import` 显式开放。内置文件选择器不依赖车机系统文件管理器；如需使用系统文件管理器，可在选择器中切换，拉起失败时会回到 EVCC 本机选择。导入视频仅支持 MP4；导入同一数字 ID 会覆盖旧文件；请只导入来源可信、结构完整的壁纸包。若提示压缩包无法解析或 `MALFORMED[1]`，通常是 zip 文件名编码或包结构异常，建议用"制作壁纸包"重新生成，并确认压缩包内包含数字 ID 文件夹以及同名 mp4/png 文件。

#### 系统底栏视觉调试（实验）

服务页实验区的"**系统底栏视觉调试**"用于临时测试车机底部系统栏的透明和毛玻璃效果。该入口是调试承载位，不属于"原生状态栏注册"功能，也不会管理状态栏插件按钮或信息卡。

该功能有独立总开关，升级后默认关闭。关闭时会收起下方所有测试按钮，并彻底关闭透明/毛玻璃底栏注册、开机自动应用和调试通道。

透明和毛玻璃会按下方"调试细项"组合执行；默认不释放系统底栏占位，避免普通 App 底部出现黑块。

**调试按钮**：
1. 先打开该卡片右上角总开关
2. 点击"**启用调试通道**"请求建立 EVCC 到 SystemUI 的调试通道
3. 点击"**毛玻璃一次**"或"**透明一次**"执行单次测试
4. 点击"**毛玻璃 30s**"或"**透明 30s**"以 500ms 间隔保持效果 30 秒
5. 点击"**停止/关闭通道**"停止持续刷新并关闭调试通道；需要重新加载 SystemUI 时可点击"**重启 SystemUI**"

**调试细项**：
- "**清除底栏背景**"：清掉底栏窗口和子 View 背景
- "**关闭底栏自绘遮罩**"：压住底栏自身绘制的覆盖色和禁用态遮罩
- "**窗口设为透明格式**"：把底栏窗口格式改为透明，减少系统合成层阻挡
- "**释放底部占位**"：临时取消系统底栏提供的导航栏占位，让普通页面有机会铺到底部；若 App 界面底部变黑，先关闭此项
- "**持续守卫防恢复**"：在 SystemUI 当前进程内持续压住自动恢复的背景，直到停止调试或重启 SystemUI

**开机自动应用**：
- 勾选"**开机自动应用**"后，可选择"**透明**"或"**毛玻璃**"
- 车辆开机、EVCC 进程启动或 SystemUI 重新加载后，调试通道连上会自动应用一次所选效果；切换透明/毛玻璃选项时，如果通道在线会立即覆盖当前效果
- 单次应用后通常会保持到 SystemUI 重启；如果手动重启 SystemUI，保持勾选即可再次自动应用

> 该入口仅用于开发调试。若提示调试通道未连接，先启用通道并重启 SystemUI，再重试透明或毛玻璃按钮。

#### 领克08 恢复 1.4 音效（实验）

服务页实验区可能按车型适配显示"**领克08 恢复 1.4 音效**"卡片。卡片内提供"**恢复 1.4 音效**"和"**还原**"两个按钮，用于通过 RootService 调用车机功放音频 HIDL 的 `setKTVOnOff(1/0)`。

> 该入口默认隐藏，仅由云端车型适配 `service.show_audio_ktv_mode` 显式开放。修改后可能改变整车音效，必要时需要重置车机才能恢复车辆原始效果。实验区功能不提供技术支持及解答。

### 4.11 仪表车模颜色（实验）

服务页实验区可能按车型适配显示"**仪表车模颜色**"卡片，用于部分领克车型仪表侧车模颜色不跟随官方设置的问题。开启后，EVCC 会在开机或深度休眠恢复后自动注入 VHAL 车模颜色热修复，并写入所选颜色。

**操作**：
1. 服务页实验区找到"**仪表车模颜色**"
2. 选择需要的车模颜色
3. 确认属性 ID；默认是 `557872603`（也可填写 `0x214075DB`），修改后会保存到本机
4. 打开开关并阅读风险提示，确认后会自动执行一次；也可点击"**立即应用颜色**"手动执行一次

> 开启或手动应用前会提示：该功能可能会引发车机出现奇怪 BUG，例如自动放歌，空调、语音功能失灵等。如遇问题，请关闭该功能。
>
> 该功能需要 RootService 正常连接，并已部署 Frida、打开 Frida 开关。车型不匹配时可通过云端车型适配隐藏该卡片。实验区功能不提供技术支持及解答。

### 4.12 热点增强

车机原生热点存在一些限制（如客户端数量、带宽、自动关停），该模块通过系统调用突破限制。

**操作**：
1. 打开"**热点增强**"开关
2. 系统会自动调整热点相关系统参数（保持已配置的 SSID / 密码不变）
3. 可配合车机设置里的"便携式热点"一起使用

> 开启后如果热点仍异常，请检查车机本身是否启用了流量卡、APN 设置是否正确。

### 4.13 引擎声浪模拟

根据油门开度、车速、转速、档位、刹车等参数模拟引擎声音，给电车一点"机械感"。

**操作**：
1. 服务页打开"**引擎声音**"开关
2. 点击"**载入声音包**"选择 ZIP 格式声音包（内含分段采样 + 配置 JSON）
3. 点击"**属性绑定**"映射车辆属性：
   - 油门开度属性
   - 车速属性
   - 转速属性（部分车型无真实转速，用油门 + 车速换算）
   - 档位属性
   - 刹车状态属性
4. 调整音频参数：
   - **主音量**：整体响度
   - **低频增益 / 高频增益**：音色偏重低沉或高亢
   - **怠速音量系数**：静止时的背景音大小
   - **动态范围**：油门变化时的音量波动幅度
5. 测试："挂 D 档 + 踩油门"听响应是否跟手

**声音包来源**：社区共享或官方声音包商店下载（飞牛分享链接见第十四章）。

### 4.14 BLE 广播台

自定义蓝牙 BLE 广播发送与调试，适合做"车辆状态向外广播"或联动 IoT 设备。

**功能**：
- 创建和发送自定义 BLE 广播包（自定义厂商 ID、UUID、数据载荷、广播时长）
- 支持 BLE、UDP、HTTP 三种传输方式（同一份数据可同时走多通道）
- 动态载荷可引用自动化变量，车辆状态变化时广播自动更新
- 调试控制台查看实时收发日志

**发送一条广播的步骤**：
1. 服务页打开"**BLE 广播台**"
2. 点击"**+ 新建广播任务**"
3. 填写：
   - **名称**
   - **厂商 ID**（2 字节 hex，如 `05 A7`）
   - **载荷数据**（hex 字符串，或用公式 `{$var}` 引用变量动态生成）
   - **广播时长**（秒，`0` 为持续广播）
   - **传输通道**：勾选 BLE / UDP / HTTP，对应通道再填目标地址
4. 点击"**发送**"立即发射，或在自动化中用"BLE 广播"动作定时触发

> 广播内容在空中传播，请不要放置隐私信息（位置、账号、密钥）。

### 4.15 AVM 全景摄像头

显示车辆 360 度全景摄像头画面。

**功能**：
- 全景拼接视图（鸟瞰全车）
- 前/后/左/右单独视图切换
- 悬浮窗模式（全景可作为小窗常驻在主屏）

**操作**：
1. 服务页打开"**AVM 全景**"开关
2. 默认进入全景拼接视图
3. 点击视图下方的切换按钮选择单独方向
4. 点击"**悬浮模式**"将画面浮动到任意位置（可拖动、可缩放）
5. 再次点击关闭悬浮

> 前进 / 后退 / 左右转向时，部分车型摄像头会被系统强制征用，此时 AVM 画面可能闪断。

### 4.16 HUD 直投

直接将 Activity 投射到车辆 HUD 硬件显示器。

**硬件要求**：
- 车辆配备 HUD 抬头显示器
- 车机系统包含 Flyme CastService

**操作**：
1. 服务页打开"**HUD 直投**"开关
2. 选择目标 Activity（和 HUD 小窗投屏类似）
3. 软件调用 Flyme CastService 将 Activity 直接投射到 HUD 硬件
4. 点击"**停止**"结束投射

> 与 4.2 HUD 小窗投屏的区别：HUD 直投走硬件通道，画质更好但可选 Activity 受限；小窗投屏是"任意 Activity 投到悬浮窗"，再由用户自行对齐到 HUD。

### 4.17 异屏同显

将副屏（如乘客屏）的内容镜像到主屏悬浮窗，方便主驾观察副屏状态。

**操作**：
1. 服务页打开"**异屏同显**"开关
2. 软件自动检测已连接的副屏列表
3. 选择要镜像的显示器 ID
4. 主屏出现浮动窗口显示副屏内容，可拖拽、缩放、隐藏

**典型用途**：
- 乘客在副屏看视频，主驾通过小窗余光确认没出问题
- 副屏正在导航时，主屏也能同步看

### 4.18 系统服务探索（API 调用）

高级诊断工具，用于调用 Android 系统服务的 Binder 接口。

**启用**：设置页 → "**调试模式**" → 勾选"**API 调用**"

**使用**：
- **查询服务**：输入服务名（如 `activity`、`window`、`car_service`），列出其全部 Binder 方法
- **列出所有服务**：看系统里注册了哪些 Binder 服务
- **方法调用**：选中某个方法后，按参数提示填写值 → 点击"调用"

> ⚠️ 误调用可能导致系统或应用崩溃，请仅在清楚方法含义时使用。

### 4.19 日志面板

服务页右侧面板实时显示运行日志：

| 颜色 | 级别 | 含义 |
|------|------|------|
| 白 | INFO | 正常状态/事件 |
| 橙 | WARN | 可恢复问题 / 降级路径 |
| 红 | ERROR | 不可恢复错误 |
| 灰 | DEBUG | 调试细节（需开启调试模式） |

**操作**：
- **自动滚动**：默认开启，新日志到来时自动滚到底部
- **手动滚动**：向上翻页时暂停自动滚动，回到底部重新启用
- **清空**：点击右上角扫帚图标
- **复制**：长按某条日志可复制单条到剪贴板
- **级别过滤**：点击级别图标只显示对应级别

### 4.20 网络副屏（实验）

把车速、挡位、电量、胎压、音乐等车辆数据渲染成画面，通过车机 WiFi 推送到外接小屏（例如装了配套固件的 ESP32 小屏）实时显示。

> 该入口默认隐藏，仅由云端车型适配 `service.show_network_screen` 显式开放。云端关闭后，卡片会隐藏，网络副屏总开关会自动关闭，并停止正在发送的画面。

**硬件要求**：
- 一块运行配套接收固件的网络小屏（默认按 320x820 竖屏设计）
- 小屏与车机在同一网络（常见做法：小屏连接车机热点）

**开启步骤**：
1. 服务页实验区打开"**网络副屏**"总开关（总开关只是允许运行，关闭会立即停止发送）
2. 点击"**打开配置**"进入配置页
3. 连接区点击"**扫描设备**"自动发现小屏并回填 IP、端口和屏幕尺寸；也可手动填写
4. 选择主题：**简约行车**（大车速 + 挡位 + 电量环 + 续航/功率）或**霓虹信息塔**（时间 + 车速 + 电量/功率条 + 胎压 + 音乐）
5. 点击"**开始发送**"，小屏几秒内出现画面

**调试 / 背景**：
- **模拟数据**：打开后不读取真实车辆属性，直接生成动态车速、挡位、电量、胎压和音乐数据，方便无车或离线调试主题、背景和小屏接收效果
- **图片背景**：选择本地图片作为画面底图，EVCC 会复制到私有目录保存
- **视频背景**：选择本地视频作为动态底图，发送时按时间循环抽帧
- **测试视频**：使用 EVCC 内置的测试背景视频，可快速确认视频背景和文字叠加效果
- **清除背景**：恢复主题默认纯色背景

**横竖屏**：宽高始终填屏幕的物理分辨率（如 320x820）。小屏横着安装时把"**画面旋转**"选为 90° 或 270°（两个方向对应左横装/右横装，选错就换另一个），两款主题都会自动切换为横版布局；屏幕倒装选 180°。

**延迟观察**：主题顶部时间默认带毫秒显示，可对照车机时间直观看出画面延迟；不需要毫秒时，在数据项里把 `system.time` 的表达式改为 `HH:mm` 即可。

**数据项**：配置页会列出当前主题需要的数据项和取值表达式（如 `$prop(属性ID)`），默认按常见车型预置；数值不对时可参考第九章公式与变量系统按自己车型修改，清空输入框恢复默认。音乐类数据来自音乐桥接，无需配置。

**发送策略**：
- **帧率上限**：默认 10，数据不变化时不会重复满帧发送
- **画质**：JPEG 压缩质量，默认 80；小屏解码慢或花屏时可调低
- **分片间隔**：每个网络分片之间的间隔毫秒数，默认 0.15；小屏丢包花屏时可略调大

**状态说明**：卡片和配置页显示"未配置 / 已停止 / 发送中"；配置页运行区还会显示最近帧大小、实际帧率、累计帧数、错误计数和最后错误，用于排查网络问题。

> 画面静止时软件会每隔几秒重发一帧，小屏断电重启或短暂丢包后会自动恢复显示，无需手动重启发送。

> 修改配置后需重新点击"开始发送"才会生效。

### 4.21 MIBO 联动与车机仪表（实验）

MIBO 联动用于连接运行配套固件的外接板，可转发 BLE 广播与 HID 输入，并承载车机仪表、宠物和 TF 媒体。入口位于“**服务 → 实验功能 → MIBO 联动**”；没有兼容硬件或配套固件时无需开启。

服务页的 MIBO 卡片不会直接显示 MAC，只保留一个无文字开关和两个常用按钮：

- **开关**：启用或停用整个 MIBO 联动；关闭后会断开连接并停止自动重连，重新开启后按保存状态恢复搜索或连接
- **连接**：按已保存的 MIBO MAC 立即启用并重连；没有保存地址时会打开详细设置并定位到连接区域
- **详细设置**：打开控制台、数据、页面、Recovery 和资源管理五个一级页面

新版 EVCC 只支持配套的新版 MIBO 固件，不会自动降级连接旧协议。出现版本不匹配时，请同时升级 EVCC 和 MIBO Main/Recovery。

#### 4.21.1 控制台

“**控制台**”把原来的基础设置和诊断合并到一个页面。横屏左右严格各占一半：左侧集中放置连接、板载菜单遥控和硬件控制，可独立滚动；右侧固定显示设备状态与实时诊断，不跟随左侧滚动。竖屏则把内容放入同一个可滚动页面。

1. 在“**MIBO 蓝牙 MAC**”中填写地址，或留空让 EVCC 搜索；点击“**保存并连接**”
2. 设备状态会显示 Main GATT、固件/协议、MTU、TF、机器人、当前页面、屏幕亮度和 Recovery 网络
3. “**机器人 MAC**”可指定目标；板端已经保存或配对成功的地址会自动回填。可以配对、重连或清除目标
4. 板载遥控可打开/关闭菜单，并发送上、下、左、右、确认和返回
5. 可设置屏幕开关、临时亮度、保存亮度、G 值安装方向/灵敏度/静止校准、工作模式和灯光测试
6. 米德宝直发配置中的目标 MAC、广播时长和广播间隔也集中在控制台
7. “设备状态与实时诊断”卡同时显示板端快照、自动重连、过滤规则、HID 与广播转发、通知失败和最近错误，“复制诊断”会复制卡片中的完整信息

Main GATT 连接后只同步轻量页面信息和配置，不会抓取屏幕画面或遍历传输整套 TF 资源。资源文件本身仍通过 Recovery Wi-Fi 管理；页面与资源列表会保留最后一次有效缓存供离线查看。

**控制选路**：
- GATT 已就绪时，EVCC 只发送 GATT 指令；即使随后写入失败，也不会再补发广播，避免 MIBO 重复执行同一操作
- GATT 未连接时，屏幕开关/亮度、机器人重连、上一页/下一页、系统/默认/宠物场景、TF 媒体、宠物互动和宠物背景可通过绑定到当前 MIBO MAC 的定向 BLE 广播发送
- 广播只调用 MIBO 上已经存在的页面和 TF 资源，不会同步目录或文件；新 TF 媒体、宠物页或背景首次使用前仍需先连接一次完成同步，或先部署到 TF 卡
- 运行模式、机器人/HID 配对、HID 设置、板载菜单、仪表配置/同步、诊断、恢复模式等仍只支持 GATT；离线点击时会提示先完成连接
- 自动化中的“切换宠物背景”填写 TF 宠物资源里的背景序号；“宠物背景自动轮换”可恢复板端自动选择

#### 4.21.2 数据

“**数据**”页统一管理所有内置和自定义页面需要的车辆数据。顶部“MIBO 数据中心”是独立的全宽添加、导入和导出工具区，下面的数据卡使用统一尺寸和响应式网格。每张卡会显示内部标识、中文名称、取值公式、单位、小数位、映射、页面/组件绑定、当前原值和显示值。点击卡片后，编辑窗口会直接在可用画面中央出现；窗口会避开系统栏，长表单和键盘弹出时可在内部滚动，不会移出屏幕。

- 自定义页面声明的新数据会自动加入；未修改且已经没有任何页面使用的自动项会自动消失
- 手动添加、导入或修改过任一字段的数据会永久保留；没有页面使用时标为“未绑定”
- 绑定由 MIBO 页面目录计算，不能手动修改
- 公式语法与第九章一致；打开数据页时只对当前可见数据增加 1 Hz 预览，离开后停止额外计算

映射每行填写一条，使用第一个 `=` 分隔，例如：

```text
0=P
1=R
2=N
3=D
*=未知
```

- 没有 `*` 时，未命中的原值保持原样
- `*=` 表示未命中的值显示为空
- 重复键、多个 `*` 或缺少 `=` 时不能保存，提示中会指出错误行

点击“**导出**”可复制 `evcc.mibo.data/1` JSON、压缩字段或显示二维码；导入时粘贴 JSON/压缩字段。相同标识会先展示字段差异，确认后整批提交；任一项无效时不会写入一半配置。

“**MIBO 自动亮度**”是固定特殊卡，不能删除。它单独设置车辆属性 ID、Area ID、输入范围和屏幕输出范围，不使用普通映射。板载菜单打开时暂停联动，菜单关闭或 MIBO 重连后会补发最新亮度。

#### 4.21.3 页面

“**页面**”页以 MIBO TF 中实际安装的页面为准。连接时动态读取页面，离线时显示最后一次同步缓存并标为“离线”。

- 页面采用左右两栏：左侧选择页面，并可立即显示、启用/停用、设为默认或调整顺序；右侧直接显示所选页面的全部设置，不再逐张打开配置窗口
- “系统状态”右侧管理全局字体回退顺序和开机动画编排；每个页面都可单独选择字体
- “电子宠物”右侧显示喂养、清洁、玩耍、招呼和背景操作，并可勾选最多 8 个宠物包，设置顺序/随机轮播及轮换分钟数；轮换只在宠物页实际显示且菜单关闭时计时，0 表示关闭
- “TF 媒体”右侧显示日常、随机、场景各分类的具体文件名；可设置日常顺序/随机播放以及随机表情插入概率
- 页面在 TF 中被删除后卡片会隐藏，但 EVCC 会保留以页面 ID 记录的启停、顺序和设置；以后重新安装同一页面会恢复
- 页面卡不显示由 MIBO 抓取的静帧预览，连接和切页期间也不会通过 GATT 传输屏幕帧
- 当前版本暂时不加载 TF 中的自定义动态壁纸页面；文件和配置不会被删除，待动态壁纸方案重构后可重新启用
- 页面卡不提供普通“删除”。需要真实删除页面文件时，请到 Recovery 的 `/mibo/resources/interfaces` 操作

#### 4.21.4 Recovery

“**Recovery**”是一级页面，用于进入恢复模式、网络配置、Wi-Fi/AP 模式、TF 文件入口、签名固件恢复、恢复出厂设置和返回 Main。主题制作器不再属于 Recovery。

- 可通知 Main 进入 Recovery；如果 MIBO 已在恢复模式，也可以直接连接。主固件连续启动失败时会自动进入 Recovery
- Main 与 Recovery 使用同一蓝牙地址但不同服务。EVCC 会明确识别当前模式并把连接交给对应客户端；处于 Recovery 时 Main 不会继续反复重连，Recovery BLE 断开后会自动重试
- Wi-Fi 名称、Wi-Fi 密码、AP 热点密码和 Recovery 默认网络模式按当前 MIBO 保存；Main GATT、Recovery BLE 或 Recovery Web 任一连接可用时都可修改。旧版 Main 不支持直接保存时，EVCC 会先本地保留，升级后再次点“保存并应用”
- 默认可选择“**Wi-Fi 模式**”或“**AP 热点模式**”。Wi-Fi 模式连接失败会自动回退 AP；页面会显示是否连上 Wi-Fi、RSSI、重试次数，或 AP 已连接设备数和是否由故障回退
- 蓝牙负责加密控制和取得临时网页凭据，不传输固件、媒体、字体包等大文件；大文件仍通过 Wi-Fi
- 系统若提示 MIBO 热点“无法访问互联网”，点击“**登录网络/打开登录页**”即可进入 Recovery Web；也可手动打开 `http://192.168.4.1/`
- MIBO 屏幕短按可打开中文 Recovery 菜单，选择 Wi-Fi、AP、检测并刷写固件、恢复出厂设置、启动主系统或“返回”；中英文混排按同一基线显示，网页和 EVCC 页面会持续显示当前网络、存储和操作状态
- Wi-Fi 会话有效时，“文件”页会出现“**MIBO TF**”快捷目录，固定进入 `/mibo`；Recovery 页也能一键跳转
- 文件管理支持浏览、预览、新建目录、上传、下载、复制、移动、重命名和删除；不能删除 `/mibo` 根目录，也不能把目录移动到自身子目录
- “**恢复设置与配对**”会清除 Main/Recovery 的设置和 BLE 配对；“**彻底恢复（含 TF /mibo）**”还会删除并重建受管的 `/mibo` 目录，但不会格式化整张 TF 卡，也不会擦除 Bootloader、分区表、Main 或 Recovery 固件

#### 4.21.5 资源管理

“**资源管理**”只负责查看和维护 TF 上的宠物、媒体、字体、开机动画和页面文件，不再承担喂养、轮播、字体顺序等业务配置。横屏左侧选择分类，竖屏使用顶部分类栏；资源卡显示具体文件名、稳定 ID、类型、大小、可用性和引用状态，并可进入 Recovery 文件管理。Main GATT 不会为资源抓取静帧。

- **宠物**：`/mibo/resources/pets` 可放多个 `.mibo-pet`，文件名可使用中文；选择、互动和轮播统一在“页面 → 电子宠物”右栏完成
- **TF 媒体**：分类直接由文件夹决定：`daily/日常` 参与普通轮播，`random/随机` 按概率插入，`scene/场景` 只供手动或自动化触发；根目录文件按兼容日常处理，未识别的一级目录不参与播放
- **字体**：资源页只显示字体文件；全局回退顺序在“页面 → 系统状态”设置，页面单独字体在对应页面右栏设置
- **开机动画**：资源页只显示动画文件；“页面 → 系统状态”可编排最多 8 个片段并为每段设置 1–100 次循环
- **页面通用资源**：查看页面引用的共享素材；页面设置和资源管理使用同一稳定资源 ID

日常和随机文件不会出现在场景自动化选择中；“场景”文件可通过自动化、控制台或悬浮窗临时触发，并选择不恢复、指定秒数/循环数后恢复，或“播完后继续日常下一项”。旧版未分类动作会保留回显，避免升级后无法编辑已有规则。

资源目录连接后会先显示上次成功缓存，再在后台校验目录版本；内容未变化时不重复逐项传输。校验失败只自动完整重试一次，仍失败时保留上次可用清单并显示错误，页面目录读取会等待本轮资源校验结束，避免两次 TF 扫描互相争用。

TF 媒体和宠物的具体文件名都按 UTF-8 处理，可直接使用中文名。运行配置引用内容 ID，因此只改文件名、或把同一个媒体在日常/随机/场景之间移动，不会破坏已有自动化。

页面、媒体和宠物切换都会等新内容的第一张完整画面准备好后再切换。TF 卡顿、资源缺失或解码失败时保留上一完整画面，不显示黑帧、加载提示或半帧。

**TF 卡目录**：

| 路径 | 用途 |
|------|------|
| `/mibo/resources/fonts/default` | 当前默认字体 |
| `/mibo/resources/fonts/packages` | 可选字体包 |
| `/mibo/resources/media/daily`（或 `日常`） | 日常 JPEG、MJPEG/AVI，按顺序或随机轮播 |
| `/mibo/resources/media/random`（或 `随机`） | 按设置概率插入的随机表情 |
| `/mibo/resources/media/scene`（或 `场景`） | 仅供手动、自动化和临时场景触发 |
| `/mibo/resources/media` 根目录 | 旧卡兼容，按日常表情处理 |
| `/mibo/resources/emotes/official`、`emotes/custom` | 旧卡兼容目录；只按通用媒体文件扫描 |
| `/mibo/resources/interfaces` | `.mibo-page` 界面包 |
| `/mibo/resources/themes` | 主题包 |
| `/mibo/resources/images`、`videos`、`pets` | 图片、压缩视频，以及可放多个 `.mibo-pet` 的宠物目录 |
| `/mibo/update/inbox` | 待 Recovery 校验的 `.mibo-fw` |
| `/mibo/update/applied`、`last-good` | 已成功安装的固件包和最近健康标记 |
| `/mibo/update/failed` | 预留的失败包归档目录 |
| `/mibo/transfer/.partial` | Wi-Fi 断点上传的临时文件 |
| `/mibo/user` | 用户自由文件区 |

**固件升级**：
1. 可在 Recovery 页面手动选择布局 v2 的签名 `.mibo-fw`，也可让页面自动检测 `/mibo/update/inbox`；还可关机取卡后把固件复制到该目录
2. 直接拷卡时，主系统下次启动会提示发现固件；确认进入 Recovery 后再执行安装，刷写期间绝对不能断电
3. EVCC 会先检查包结构，Recovery 还会校验目标板、分区布局、镜像哈希和签名，然后只写入 Main。刷写期间保持稳定供电
4. 新 Main 完成健康启动后，原包自动移到 `applied` 并更新 `last-good`，以后不会重复提示；校验未通过的包不会写入 Flash

> 安全边界：运行中的 Recovery 只允许刷写签名 Main，不能自写 Recovery、Bootloader、分区表或执行全量 Flash。首次切换分区布局、Recovery 本身损坏或确需全量恢复时，必须连接 USB 使用完整工厂镜像；开始前确认供电稳定。

> 媒体上传有稳定播放门槛：GIF/JPEG 最大 2 MB；MJPEG/AVI 最大 512 MB，且每个画面不得超过
> 512 KB；JPEG 必须为 baseline。Recovery 会在替换正式文件前校验，不合格文件不会进入播放列表。

> TF 卡是资源介质，不是启动必需品；未插卡或卡损坏时 MIBO 仍应能进入 Main/Recovery，但外部字体、媒体、主题、图片、视频和界面不可用。首次切换新分区布局仍需使用 USB 完整工厂镜像。

**音乐同步**：音乐标题、歌手、歌词、播放进度和页面配色来自音乐桥接。切歌或歌词更新较密集时，EVCC 会合并到最新状态再发送；连接中断后恢复时会重新同步当前内容。

> 第一次配置建议停车后观察数据、页面切换、媒体播放和 Recovery 文件管理，确认链路稳定后再绑定真实车辆属性。自动亮度在重连后会进行有界重试，并补发首次成功读取到的车辆属性值。

---

## 第五章 终端命令面板

提供便捷的 ADB/Shell 命令执行界面。

### 5.1 命令类型

- **`adb` 开头的命令**：通过 ADB 协议执行（如 `adb root`、`adb remount`）
- **其他命令**：通过 RootService 以 root 权限直接执行

### 5.2 内置命令

预置多个常用命令，按分类折叠展示，点击即可执行：

| 分类 | 命令示例 |
|------|----------|
| 系统信息 | 系统属性、进程列表、内存、CPU |
| 硬件信息 | 磁盘、网络、WiFi、屏幕信息 |
| 应用信息 | 当前 Activity、已安装应用数 |
| 车辆服务 | VHAL 服务状态、背光亮度 |
| 系统控制 | ADB Root、Remount、重启守护进程 |

内置命令列表可通过云端更新。

### 5.3 自定义命令

点击"**+ 添加命令**"→ 输入命令名称和内容 → 保存。自定义命令保存在本地，可删除。

### 5.4 直接输入

在底部输入框直接输入任意命令并执行。支持命令历史记录（最多 50 条）。

### 5.5 Logcat 功能

终端支持实时 logcat 日志捕获：
- 开始/停止 logcat 流
- 按日志级别过滤（V/D/I/W/E/F）
- 按包名过滤
- 输出语法高亮
- 复制输出到剪贴板

### 5.6 连接状态

顶部显示 RootService 连接状态。如未连接，会自动重试（最多 60 秒）。可手动点击"重连"。

---

## 第六章 自动化

自动化引擎是 EVCC 最强大的功能之一，支持基于触发器-条件-动作的规则系统。

### 6.1 引擎控制

- 点击"**启动引擎**"/"**停止引擎**"控制运行状态
- 在"连接"页可设置自动化引擎开机自启
- 引擎运行时实时监听所有启用规则的触发条件

### 6.2 规则结构

每条规则由三部分组成：**触发器**（必需）→ **条件**（可选）→ **动作**（必需），也可以额外配置运行期**中断器**。
多个触发器之间是 **OR** 关系，任意一个触发器命中都会进入条件判断；触发器列表右侧的 `▲` / `▼` 可调整显示和保存顺序。

#### 触发器 (Trigger) — 定义何时触发

**属性相关**：

| 类型 | 说明 |
|------|------|
| 属性变化 | 指定属性值或可用状态真实变化时触发；底层重复上报和手动刷新当前值不会触发 |
| 属性等于目标值 | 属性值等于指定值时触发 |
| 属性大于/小于 | 数值比较触发 |
| 属性在范围内 | 值在 [min, max] 范围时触发 |
| 属性包含字符串 | 字符串包含子串时触发 |
| 属性双击变化 | 短时间内多次变化触发 |

**定时相关**：

| 类型 | 说明 |
|------|------|
| 定时器 (间隔) | 按固定毫秒间隔周期触发 |
| 定时器 (定时) | 在指定时间点触发 (HH:mm 格式) |
| 日出触发 | 每日日出时触发，支持 ±N 分钟偏移 |
| 日落触发 | 每日日落时触发，支持 ±N 分钟偏移 |

> 日出/日落优先联网查询 sunrise-sunset.org，无网络时使用本地 NOAA 算法计算。

**系统事件**：

| 类型 | 说明 |
|------|------|
| 开机启动 | 系统或引擎启动时触发 |
| 屏幕开启/关闭 | 显示器开关时触发 |
| 蓝牙开关 | 蓝牙状态变化触发 |
| 应用进入前台 | 指定应用进入前台触发 |
| 广播接收 | 接收到定向发送给 EVCC 的指定 Android 广播触发 |
| Logcat 关键词 | 匹配 logcat 日志行触发（支持正则捕获组提取变量） |
| 音乐事件 | 当前音乐状态开始播放、暂停/停止、切歌、音乐 App 变化、检测到/失去音乐状态时触发 |

> “音乐事件”依赖"服务 → 音乐桥接"的当前音乐状态。主规则和中断器都可以使用；启动自动化引擎或进入某次规则执行时只记录一次基线，不会因为已有歌曲正在播放而立即触发；进度刷新不会重复触发。可选填写音乐 App 包名，只让指定来源命中。

**硬件输入**：

| 类型 | 说明 |
|------|------|
| BLE 设备信号 | 收到指定 BLE 设备广播时触发，支持米家蓝牙 Mesh（旋钮、多键开关等），支持配对密钥和自定义多击 |
| 经典蓝牙设备连接 | 蓝牙设备连接时触发 |
| 方控按键 | 方向盘按键触发（支持单击/双击/三击/长按） |

**位置与变量**：

| 类型 | 说明 |
|------|------|
| 进入区域 (Geofence) | GPS 进入指定圆形区域触发 |
| 离开区域 (Geofence) | GPS 离开指定圆形区域触发 |
| 变量比较 | 自定义变量值变化/等于/大于/小于时触发 |
| 手动触发 | 仅手动执行 |

> 地理围栏支持地图选点弹窗，可搜索地名、选择地图源（天地图/OSM/ESRI卫星图）、预览半径。有 10% 滞回和 30 秒冷却防边界抖动。

#### 条件 (Condition) — 额外判断

| 类型 | 说明 |
|------|------|
| 属性等于/不等于 | 属性值比较 |
| 属性大于/小于 | 数值比较 |
| 属性包含 | 字符串包含 |
| 属性在范围内 | 值在指定范围 |
| 属性与前值比较 | 对比上次变化前的值 |
| 时间范围 | 当前时间在 HH:mm 到 HH:mm 范围内 |
| 应用在前台 | 指定应用当前在前台 |
| 变量比较 | 自定义变量等于/不等于/大于/小于 |
| 音乐状态 | 当前音乐是否播放中、暂停/停止、有音乐状态或无音乐状态 |

- 多个条件支持 **AND**（全部满足）或 **OR**（满足其一）逻辑
- 每个条件支持取反（否定）
- 规则编辑器里的"**条件判定延迟(ms)**"用于推迟条件和分支条件的最终判断，默认 `0`，可填 `0-60000`。当触发属性 A 和条件属性 B 几乎同时变化、但规则偶尔读到 B 的旧值时，可给该规则设置 `100-300ms`。它只延后条件判断，不要求触发器状态继续保持；需要持续保持仍使用触发器的"保持时间"。
- 触发器里的"保持时间"只作用于当前触发器本身，不会要求同一规则里的其他触发器一起等待。
- "条件判定延迟"不同于动作里的"延时 (Delay)"：前者发生在条件通过之前，后者发生在条件通过并开始执行动作之后。

#### 动作 (Action) — 触发后执行

动作支持所有控制台组件的动作类型（见 2.2 节），另外还支持：

| 额外动作类型 | 说明 |
|-------------|------|
| 延时 (Delay) | 等待 N 毫秒后继续 |
| 条件停止 | 条件不满足时终止后续动作 |
| 停止规则 | 无条件终止当前规则 |
| 触发其他自动化 | 触发另一条规则 |
| 回到主屏 | 模拟 Home 键 |
| BLE 广播 | 发送自定义 BLE 广播 |
| 小窗启动 | 以悬浮窗启动应用 |
| 系统小窗 | 使用系统原生小窗 |
| APP投屏 | 将指定应用或当前前台应用投放到目标屏幕 |
| 杀死应用 | 强制停止指定包名，或勾选"杀死当前前台应用"一键停掉当前可见应用 |
| 退出应用 | 把指定应用退到后台 / 回主屏，或勾选"退出当前前台应用"作用于当前可见应用 |
| 显示器镜像 | 镜像副屏内容 |
| 关闭语音助手 | 抢占音频焦点静音 TTS |
| Webhook | 发送 HTTP POST |
| 远程消息 | 发送到钉钉/Telegram/飞书 |

- 多个动作按顺序执行
- 可拖拽调整执行顺序
- 选择"触发其他自动化"时，配置界面会同时显示目标规则名称和 ID，便于区分同名或相似名称规则
- TTS 语音使用系统默认引擎时，如果车机引擎由系统语音设置统一管理，发音人会显示为"跟随车机语音设置"；需要单条规则独立音色时可选择 Edge TTS 或阿里云 TTS
- 启用条件分支后，规则的主条件仍是全局前置条件；主动作可在"兜底模式"和"最终模式"之间切换
- 条件分支默认使用 **IF ELSE IF** 模式：从上到下判断，命中第一个分支后只执行这个分支；可切换为 **IF IF** 模式：从上到下判断并依次执行所有命中的分支
- "兜底模式"下，主动作只在没有任何分支命中时执行；"最终模式"下，主动作会在分支动作执行后继续执行，没有分支命中时也会直接执行
- 分支动作中的"条件中断"判断当前命中的分支条件；不满足时只停止当前分支剩余动作，"最终模式"下仍会继续执行最终动作
- 主动作/最终动作中的"条件中断"判断主条件；不满足时停止其后的主动作/最终动作
- 米德宝联动动作适合多个规则共用同一台机器人时设置优先级；例如安全提醒可用"高"或"实时"，普通氛围动作可用"中"或"低"

#### 中断器 (Interruptor) — 运行期间停止本次执行

中断器用于处理"规则已经开始执行，但中途出现了更高优先级事件，需要立刻停掉这次执行"的场景。它只在某次规则触发后、动作执行期间监听；规则结束后自动停止监听。

- 一条规则可以添加多个中断器，命中任意一个且条件满足后，会立即中断本次规则执行，后续动作不再继续。
- 中断器可配置触发器、条件、AND/OR 条件逻辑和"条件判定延迟(ms)"；不需要规则名称、动作、条件分支、冷却时间或执行超时。
- 中断器的触发器/条件类型沿用主规则的编辑方式，但不提供"手动触发"这类没有运行中外部事件源的触发器。
- 配置属性型中断器时，可在中断器编辑页使用"监听属性变化"从实时属性列表快速生成触发器或条件。
- 如果中断器没有配置条件，只要触发器命中就会中断；如果配置了条件，会先等待中断器自己的条件判定延迟，再判断条件。
- 同一条规则如果发生并发执行，每次执行的中断器彼此独立；一个中断器只会停止它所属的那次执行。
- 第一版中断器只支持普通 APP 侧自动化；勾选"由 RootService 托管执行"时不能保存带中断器的规则。

#### RootService 托管执行（实验）

规则编辑器里可以勾选"**由 RootService 托管执行**"。适合锁车音这类场景：通过车辆属性变化触发，延迟后播放音频到指定 usage 或 bus。启用后，符合条件的规则会同步给 RootService；EVCC 主进程被系统杀掉时，只要 RootService 仍在运行，规则仍可按支持的触发、条件和动作继续执行。

该实验选项由云端车型适配控制，默认隐藏；如果规则编辑器里没有看到这个勾选项，说明当前车型或当前版本暂未开放 RootService 托管执行入口，普通自动化规则仍可正常使用。

支持范围：
- 触发器：属性变化、属性等于、大于、小于、区间、包含、属性双击变化
- 条件：属性条件、属性前值、时间范围
- 动作：播放声音、延迟、无动作、停止规则、写属性
- 属性变化和属性双击只统计真实变化；底层重复上报或手动刷新当前值不会触发托管规则。

不支持范围：中断器、TTS、HTTP、通知、Toast、启动/杀死 App、BLE、脚本、变量触发、地理围栏、前台 App 判断、音乐事件、音乐状态等。勾选后如果当前规则不符合条件，编辑器会显示不支持原因。RootService 托管规则会在规则名左侧显示"RootService 托管"标签。

播放声音动作支持音量/增益拖动条：以 5% 步进调节，100 表示原始音量，低于 100 会衰减，超过 100 会优先使用软件解码放大，过高可能产生削波失真。通过文件选择器选择的本地音频会先转存到 EVCC 私有目录；音频文件如果来自 `content://`，保存规则时也会先转存，避免锁车瞬间依赖文件管理器授权或 EVCC 主进程。RootService 托管能力依赖 RootService 能监听到对应属性；如果某个锁车信号只存在于 VHAL gRPC/APVP 等 RootService 暂未接入的数据源，仍需继续使用普通自动化或等待后续适配。

RootService 托管规则同样支持"条件判定延迟(ms)"。设置后，RootService 会在触发器命中、保持时间/双击避让结束后，再等待指定毫秒读取最新属性并判断条件；条件属性变化只刷新内部缓存，不会单独触发规则。

RootService 托管的"写属性"动作仅支持 boolean / int / long / float / string 这类基础 CarProperty 类型；数组、bytes、mixed 等类型会显示为不支持。连续快速触发同一条托管规则时，RootService 会保留最新一次动作链，避免长延迟或重复播放堆积。

执行日志里，RootService 托管规则会尽量按普通自动化规则的粒度展示：例如"规则触发 (第3次)"、"延迟 500ms"、"设置属性 空调温度 = 22 (RootService)"、"播放声音 (2/3): lock.wav"。普通用户不需要理解底层配置同步、属性监听和队列细节；如果需要排查，使用"连接"页的日志上传，上传内容会包含完整 RootService 日志，管理员可在 RootService 日志中搜索 `RS_AUTO` 查看托管规则的原始事件链路。

#### 常用触发器的配置要点

每种触发器选中后，编辑器下方会出现对应的参数字段，下表列出最常用几种需要填什么：

| 触发器 | 必填字段 | 可选字段 |
|--------|---------|---------|
| 属性变化 | 属性 ID、区域 ID | 防抖时间 (ms) —— 多次变化合并为一次 |
| 属性等于 / 大于 / 小于 | 属性 ID、目标值（或阈值） | 区域 ID、"仅边界触发"开关（避免值抖动持续触发） |
| 属性在范围内 | 属性 ID、最小值、最大值 | 进入 / 离开范围时哪个触发 |
| 属性双击变化 | 属性 ID、最大间隔 (ms)、目标次数 | 常用于"连续按两下远光灯拨杆"场景 |
| 定时器 (间隔) | 间隔毫秒数 | 对齐到整分/整小时 |
| 定时器 (定时) | 时间点 `HH:mm` | 星期几（勾选多天） |
| 日出 / 日落 | （无，自动按设备地理位置计算） | 偏移分钟数（负数提前，正数延后） |
| 屏幕开启 / 关闭 | （无） | 指定显示器 ID（区分主/副屏） |
| 应用前台 | 目标包名 | 是否进入时触发、离开时触发 |
| 广播接收 | Action 字符串；发送方需定向到 `com.kooo.evcc` | 当前按 Action 匹配，不做 Category / Extra 过滤 |
| Logcat 关键词 | 正则表达式 | 捕获组变量名列表（详见 6.9） |
| 音乐事件 | 事件类型（开始播放 / 暂停停止 / 切歌 / App 变化 / 检测到状态 / 状态消失） | 音乐 App 包名；留空表示任意音乐来源 |
| BLE 设备信号 | 设备 MAC、预设键盘 | 按键 ID、BindKey、点击方式（详见 6.11） |
| 方控按键 | 按键码、点击方式 | 长按时长、多击间隔 |
| 进入 / 离开区域 | 中心经纬度、半径米 | 滞回比例、冷却秒数 |
| 变量比较 | 变量名、比较方式、目标值 | 比较方式选"变化"时可选填"变化前 / 变化后"过滤 (留空=不限制, 支持 ${var} 引用) |

> 建议流程：**先用属性监视器找到属性 ID → 再根据需求选择触发器类型 → 最后填字段**。填完点"手动执行 ▶"验证动作部分没问题，再启用自动触发。

**收到广播触发器用法**：触发器里填写完整 Action 字符串，例如 `com.carapp.speaker.kill`，不要勾选"取反"。发送方必须把广播定向到 EVCC 包名；ADB 测试命令为 `adb shell am broadcast -a com.carapp.speaker.kill -p com.kooo.evcc`。普通不带包名的隐式广播不会触发 EVCC 自动化。

**音乐事件触发器用法**：适合做"音乐开始播放后打开歌词小窗"、"暂停后关闭氛围灯"、"切歌后刷新副屏音乐信息"这类联动，也可放进中断器用于运行中停止当前规则。命中后可在动作参数中使用 `$music_title`、`$music_artist`、`$music_album`、`$music_app`、`$music_pkg`、`$music_playing`、`$music_available` 等变量；如果只想把音乐状态当作前置判断或中断器条件，条件里选择"音乐状态"即可。

### 6.3 规则管理

| 操作 | 说明 |
|------|------|
| + 新建规则 | 打开编辑器配置触发器、条件和动作 |
| 编辑规则 | 点击规则进入编辑 |
| 复制规则 | 复制现有规则 |
| 删除规则 | 删除规则 |
| 启用/禁用 | 带自动触发器的规则可单独控制开关；只有手动触发的规则不显示开关，只显示运行按钮 |
| 手动执行 ▶ | 忽略触发条件手动执行一次 |
| 冷却时间 | 设置触发后的冷却间隔（秒），避免频繁触发 |

### 6.4 规则分组

- 规则可以按组管理
- 分组头部"⋯"菜单支持：一键启用/禁用/删除组内全部规则

### 6.5 属性监视器

编辑规则时可使用"**监视属性变化**"功能发现未知属性 ID。

**基本流程**：
1. 打开属性监视器（规则编辑器内点击"监视属性变化"）
2. 在车上执行操作（如打转向灯、踩刹车）
3. 监视器实时显示正在变化的属性，每条记录带时间戳和"前值 → 新值"
4. 直接从列表选取属性，一键填入当前规则的触发器/条件/动作目标

**实战示例：找出"左转向灯"的属性 ID**

1. 打开属性监视器，选择 VHAL 数据源
2. 点击"**基准快照**"把当前所有值作为基准
3. 拨动左转向拨杆（不要踩刹车、不要动其他）
4. 监视器会列出这几秒内值变化的全部属性（通常 2~5 个）
5. 把拨杆回中位，再拨一次，重复 2~3 次观察哪些属性**反复同步翻转**
6. 反复翻转的那条通常就是转向灯属性 —— 点击它，"添加为触发器的目标属性"

**用法技巧**：
- **过滤模块**：APVP 模式下可按模块过滤，先缩小范围再操作
- **回避探测**：把已经识别的属性加入"忽略列表"，避免它们持续刷新干扰识别
- **只看可写**：找"控制类"属性（比如能开关大灯）时，勾上"仅可写"
- **数据源区分**：某些功能在 VHAL 有、APVP 也有，两者值域不同，尽量挑可读可写的那个
- **保存 CSV 对比**：操作前后各导出一次 CSV，用表格工具对比"当前值"列差异

> 发现的属性 ID 建议同时加到"收藏"并备注含义，方便后续复用。

### 6.6 预设模板

5 个快速创建模板：
1. **属性通知**：属性变化时发送通知
2. **定时命令**：定时执行 Shell 命令
3. **条件联动**：属性满足条件时联动写入其他属性
4. **媒体控制**：应用启动时自动控制媒体
5. **开机启动**：系统启动时自动执行操作

### 6.7 规则商店

| 操作 | 说明 |
|------|------|
| 浏览商店 | 从云端下载其他用户分享的规则 |
| 上传规则 | 分享规则到商店（填写名称、简介；可勾选隐私上传仅用分享码分享；车型由云端按设备自动匹配，署名使用内容商店顶部"我的署名"） |
| 分享二维码 | 生成规则二维码，扫码即可导入 |
| 导入规则 | 粘贴 JSON 或 `EVCC:` 压缩格式导入 |
| 搜索 | 按名称、车型、署名、简介或分享码搜索 |
| 测试 | 下载规则详情后直接执行可单独测试的动作 |

规则商店上传和下载时会自动处理规则里引用的本地资源，例如"播放声音"动作使用的音频文件。下载规则或规则组后，EVCC 会把资源保存到本机私有目录，并把规则里的路径改为新的本机路径。规则卡片会直接显示匹配到的车型、分享码、下载次数和评分；右上角可点"时间 / 名称 / 评分 / 下载量"切换排序，默认按最新上传显示；少量结果也会正常显示；可点"♥"点赞，同一设备对同一条规则只保留一个点赞状态，再次点击会取消点赞。规则卡片的"测试"会先下载规则详情再尝试执行动作；带多个动作分支时会让你选择要测试的分支，规则组、变量联动、条件中断、触发其它规则或依赖完整上下文的规则会提示原因，不会强行执行。管理员标记为"优质"的规则会始终优先靠前显示。

### 6.8 变量管理

- 自定义变量使用 `$变量名` 语法在规则间传递数据
- 变量通过 `VARIABLE_SET` 动作创建和更新
- 变量值支持公式计算（如 `$speed * 3.6`）
- 变量持久化存储，重启后保留
- 在设置面板可查看和删除变量

### 6.9 Logcat 关键词触发 + 变量提取

Logcat 关键词触发支持正则表达式捕获组，自动提取匹配内容到变量：

```
LogRegex: "temperature=(\d+) humidity=(\d+)"
LogExtractVars: "temp,humidity"
```

捕获到的值存入 `$temp` 和 `$humidity` 变量，后续动作可直接使用。

### 6.10 执行日志

右侧面板实时显示规则执行日志：
- 显示执行时间、规则名称、执行状态
- 按状态过滤：全部 / 成功 / 失败
- 可清空日志
- RootService 托管规则会显示"RootService 托管"来源标识，并展示接近普通规则的信息量，例如触发次数、延迟、写入的属性和值、播放声音轮次和失败原因
- 日志上传会同时带上完整 RootService 日志；管理员排查托管规则时可在 RootService 日志中搜索 `RS_AUTO`

### 6.11 米家蓝牙设备配对

EVCC 支持把米家生态的 BLE 按键 / 旋钮变成车机的"遥控器"，例如用 4 键多键开关控制空调、用旋钮调音量亮度。本节讲完整配对流程。

#### 支持的米家设备预设

| 预设 | 设备举例 | 可用按键 |
|------|---------|---------|
| **米家蓝牙 Mesh 开关 / 键盘** | 米家 8 键开关、云米多键开关、Yeelight 蓝牙遥控 | 按键 1~8，支持单击 / 双击 / 长按 |
| **米家蓝牙 Mesh 旋钮** | 米家无线开关旋钮版 | 4 个物理按键 + 旋转事件（`$ble_rotation` 带符号 ±1） |

> 购买建议：选取"**米家蓝牙 Mesh**"字样、非 ZigBee、非"带网关"的产品。不需要米家多模网关。

#### 获取 BLE KEY（BindKey）

每个米家设备都有一个 32 位十六进制的配对密钥（BindKey），由米家云端为你的账号绑定的设备生成。EVCC 用它解密设备的加密广播，否则按键事件无法识别。

**获取步骤**：

1. 用**手机米家 App 正常连接设备一次**（配网入账号）。设备必须出现在你的米家账号设备列表里
2. 在 PC / Mac / Linux 上安装开源工具 **Xiaomi Cloud Tokens Extractor**（GitHub 搜同名项目）
3. 运行工具：输入米家账号邮箱/手机号 + 密码 + 服务器地区（中国大陆选 `cn`）
4. 工具会登录米家云端并列出你账号下所有设备，每个设备展示：
   - 名称、MAC 地址
   - **BLE key**（或叫 `bindkey`）—— 就是我们要的 32 位 hex 字符串
5. 复制对应设备的 BLE key（形如 `a1b2c3d4e5f6...`，全长 32 字符）

> **安全提示**：BindKey 只在本地设备有效，不等于账号密码。但仍然建议用完就关闭工具，不要泄露给他人。

#### 在 EVCC 中配对

1. 打开 EVCC → **自动化** → **+ 新建规则**
2. 触发器类型选 **"BLE 设备信号"**
3. 出现的配置面板逐项填：
   - **预设键盘**：选"米家蓝牙Mesh开关/键盘"或"米家蓝牙Mesh旋钮"
   - **学习设备**：点击此按钮进入学习对话框（见下一小节）
   - **BindKey (解密密钥)**：粘贴刚拿到的 32 位 hex（大小写不敏感，空格会被自动忽略）
   - **按键 ID**：下拉选"任意键"或具体按键（按键 1~8，旋钮预设还有"旋转"）
   - **点击方式**：单击 / 双击 / 长按 / 自定义多击
4. 配置动作（比如"设置属性"写入空调风量）
5. 点击"**手动执行 ▶**"验证动作执行正确
6. 保存规则，引擎运行中按米家按键即可触发

EVCC 会使用统一的无过滤 BLE 扫描通道接收自动化、学习和信号测试数据，再由规则本身判断是否触发。这样可以尽量避免车机蓝牙栈提前丢弃按键广播。支持蓝牙增强的车型可在服务页使用"全量增强"改善低延迟扫描，点击后会先提示风险，建议只用于对比测试。如果车机蓝牙栈出现扫描假活，EVCC 会先自动重启 BLE 扫描；连续空扫仍无结果时，会在后台恢复蓝牙栈并重新建立扫描。此内部恢复不会触发"蓝牙开关"自动化规则。

#### "学习设备"——自动识别 MAC 地址

学习对话框提供两种识别模式：

| 模式 | 操作 | 适用 |
|------|------|------|
| **单次按压识别** | 打开对话框 → 保持 3 秒静止（建立基准） → 在 10 秒扫描窗口内按一次按键 → 列表选中出现的设备 | 环境干扰少，周围没有别的米家设备 |
| **重复触发识别** | 打开对话框 → 30 秒内连续按同一键 6 次以上 → 自动判定为信号最强的那个 MAC | 周围米家设备多，防止误识别 |

识别到的设备会以"名称 · MAC · RSSI · 厂商 ID"的格式显示，点击即可自动填入 MAC 字段。

#### 信号测试（可选但强烈建议）

规则编辑界面提供**"信号测试"**按钮：

1. 点击后进入实时监听窗口
2. 按一下目标按键
3. 窗口会显示解密后的按键事件编号（1~8 / 旋转角度）和事件类型（单击 / 双击 / 长按）
4. **看到正确事件 = 配对成功**；如果窗口显示"短 FE95 帧，非按键事件"，说明车机收到了目标设备广播，但这包本身不是可触发的按键事件；如果显示"解密失败"，通常是 BindKey 不匹配，需要重新从米家云端获取

#### 常见问题

| 现象 | 原因 |
|------|------|
| 学习列表里看不到设备 | 按键电池太弱、距离太远、设备已被其他手机占用，先用米家 App 确认设备在线 |
| MAC 识别到但按键不触发 | BindKey 没填或填错，信号测试可快速定位 |
| 偶尔触发偶尔不触发 | RSSI 太低、距离车机太远，或按键电池快耗尽 |
| 一键按下触发了多次 | 米家固件会发送多帧相同事件，软件已用帧序号去重；如仍多次触发，关闭"自定义多击"或延长冷却时间 |
| 不同车之间迁移规则 | BindKey 与米家账号绑定，不同账号的同一按键 BindKey 不同；迁移后务必重新获取并替换 |

> 规则中的 MAC 和 BindKey 会本地加密存储，复制规则到别的 EVCC 设备可以直接生效（只要该设备能扫到按键）。

---

## 第七章 应用管理

### 7.1 分类浏览

| 标签 | 说明 |
|------|------|
| 全部 | 所有已安装应用 |
| 用户 | 用户安装的第三方应用 |
| 系统 | 系统预装应用 |
| 禁用 | 被禁用的应用 |
| 自启动 | 有自启动行为的应用 |
| 运行中 | 当前正在运行的应用 |
| 系统进程 | 查看系统服务、原生进程和应用进程的 CPU/内存占用；进入页面后每 10 秒会把 CPU 前列和内存前列快照写入运行日志，便于上传日志时一起排查；点击进程可查看命令行、可执行文件、cgroup 和状态等详情 |

### 7.2 操作

| 操作 | 说明 |
|------|------|
| 启动应用 | 打开应用；RootService 未连接时会使用普通方式尝试启动当前用户下有桌面入口的应用，选择具体 Activity 或隐藏入口仍需 RootService |
| 强制停止 | 关闭应用进程 |
| 清除数据 | 清除应用所有数据 |
| 卸载 | 卸载应用（系统应用需 Root） |
| 禁用/启用 | 禁用或启用应用 |
| 详情 | 先显示基础版本、路径、UID 等信息，再后台补充签名和 APK 大小 |
| 查看权限 | 查看申请的权限列表、中文说明、AppOps 状态和特殊权限 |
| 应用信息 | 打开系统应用信息页面 |

### 7.3 权限管理

点击应用的"查看权限"可以进入权限管理弹窗。弹窗会列出普通运行时权限、权限说明、关联 AppOps 状态和特殊权限，普通权限可单独开关，也可以点击"一键全部授予"批量授予。特殊权限包含悬浮窗、无障碍、通知使用权、使用情况访问、修改系统设置、修改系统安全设置、读取系统日志、未知来源安装、所有文件访问和勿扰模式访问等。

无障碍服务会单独显示在"无障碍服务"分栏。开启后 EVCC 会通过 RootService 同步写入所有已安装用户并打开无障碍总开关，不会通过清空列表或重启无障碍服务来强制刷新；勾选"持久化保护"后，如果该应用的无障碍服务被系统或其他工具关闭，EVCC 会自动补回。点击"一键全部授予"时，如果该应用声明了无障碍服务，会自动开启持久化保护。

如果只想临时开启无障碍服务，不要勾选"持久化保护"；手动关闭无障碍开关时，EVCC 会同时取消该应用的持久化保护。

### 7.4 搜索

应用列表支持按应用名称或包名搜索；系统进程页支持按进程名、完整命令、用户或 PID 搜索。

### 7.5 文件管理页

"文件"页用于浏览车机本地文件，也可连接常用远程存储。默认路径为 `/sdcard`；本地文件操作依赖 RootService，远程连接在 RootService 未连接时也可使用。

**常用操作**：

| 操作 | 说明 |
|------|------|
| 切换视图 | 列表 / 网格两种显示方式 |
| 排序与隐藏文件 | 支持按名称、大小、日期、类型排序，可显示或隐藏点号文件 |
| 搜索 | 在当前目录下搜索文件名 |
| 多选 | 批量复制、剪切、删除 |
| 长按本地文件/文件夹 | 打开、查看图片、播放视频/音频、以文本打开、安装 APK、复制/剪切、重命名、修改权限/所有者、解压文件、压缩为 tar.gz 或 zip、查看属性 |
| 底部工具栏 | 新建文件/文件夹、粘贴、打开当前目录终端、扫码输入、收藏目录 |

**媒体预览与安装器**：本地图片可直接查看，视频和音频可直接播放；如果路径是 `/data/media/<user>` 等普通进程无法读取的位置，EVCC 会先通过 RootService 临时复制到缓存再打开。从其他应用打开 `.apk` 文件时，也可以选择"EVCC 安装器"，EVCC 会读取 APK 后通过 RootService 执行安装。

**远程连接**：默认提供"EVCC 下载站"只读入口，可浏览测试版、稳定版、使用文档和其他软件，并直接下载或安装 APK；它只展示下载站允许公开的目录，不支持上传、新建或删除。自定义远程连接支持 123 网盘、WebDAV、FTP 和飞牛分享链接；这些远程目录可浏览、下载到本地、上传本地文件、新建文件夹和删除项目；远程媒体文件会先临时下载到缓存再预览，远程到远程复制暂不支持。

> 文件页可以直接修改系统和应用目录。删除、改权限、改所有者前先确认路径，系统分区和应用私有目录误操作可能导致应用或车机异常。

---

## 第八章 脚本与 Frida

顶部"脚本"页包含两个子页：**Frida** 和 **Lua 脚本**。Frida 用于修改运行中应用的行为；Lua 脚本用于编写常驻自动化逻辑、读取车辆属性、调用动作 API 和调试复杂流程。

如果只是简单的"某条件触发某动作"，优先使用第六章的自动化规则；如果需要循环、状态机、多源联动或较复杂的数据处理，再使用 Lua 脚本。

Frida 是动态代码注入工具，用于修改运行中应用的行为。

> ⚠️ **使用前提**：需先部署 Frida，并在"连接"页打开 Frida 开关。未开启时，依赖 Frida 的功能会提示处理；连接页 Frida 开关不会自动下载部署，未部署时会提示先到"脚本"页手动部署。
> 车型建议：龙鹰车型建议直接部署，稳定性较好；高通、亿咖通车型若非必要不建议部署，可能会引发系统黑屏重启。

### 8.1 Frida 部署/卸载

- **版本选择**：页面不再提供手动版本选择，也不会在部署前显示车型配置指定的版本名。EVCC 会按当前车型配置决定下一次部署下载的 Frida 文件；如果暂未获取到车型配置，会使用兼容版本。
- **部署**：将 Frida 注入组件推送到设备（首次部署会从网络下载对应文件，需联网）。点击部署后会先弹出确认提示；新手引导中点击部署时会先尝试同步车型配置，短时间内仍未获取到时会使用兼容版本。也可从"设置"页的 Frida 卡片点击"部署"进入同一流程。已经部署过的 Frida 会继续保留和使用，只有重新部署或卸载后再部署时才会按新的车型配置下载。部署成功后才会显示实际探测到的 Frida 版本，探测偶发失败时会自动重试。EVCC 本体升级后，如果 Frida 开关已开启且检测到远端 Frida 文件更新，会提示重新部署；选择"不再提醒"后，同一大小差异不会重复提醒，远端文件再次变化时才会再次提示。
- **开关**：仅启用已经部署好的 Frida。打开时如检测到 Frida 未部署，会提示先到"脚本"页部署，不会在后台自动下载；关闭开关会停止当前 Frida hook 和后台注入进程。
- **卸载**：停止 Frida，并删除当前已部署的本地文件；下次部署会重新按车型配置下载。
- 部署成功并开启 Frida 开关后，顶部状态指示变绿；未部署或开关未打开时，所有依赖 Frida 的脚本和服务功能都不会执行

### 8.2 使用流程

1. 确保 Frida 已部署，并在"连接"页打开 Frida 开关（绿色状态）
2. 在"目标进程"中选择要注入的应用包名（支持从已安装列表选或手动输入）
3. 从脚本列表选择预置脚本，或在自定义区编写 JavaScript
4. 点击"执行"，脚本注入到目标进程
5. 输出面板实时显示脚本 `console.log` 输出
6. 结束时点击"停止"或"停止全部"

### 8.3 预置脚本分类

| 分类 | 用途 |
|------|------|
| EAS | EAS Framework 鉴权相关 hook（常用于领克车型绕过音乐/投屏鉴权限制） |
| CAR | 车辆系统相关 hook（Car Service、VHAL 代理层） |
| System | 系统级 hook（PackageManager、ActivityManager 等） |
| HUD | 导航应用 HUD 相关 hook（夜间强制、焦点修复、元素隐藏、HUD 夜间底色） |
| DPI | 逐应用动态修改显示 DPI |
| 其他 | 按功能分组的脚本集合 |

> 预置脚本经过社区验证可安全使用。自定义脚本运行前请先在非关键进程上小范围验证。

### 8.4 常见使用场景

| 场景 | 对应脚本分类 | 说明 |
|------|-------------|------|
| 领克音乐桥接鉴权放行 | EAS | 部署后"音乐桥接—领克模式"才能正常工作 |
| 领克仪表车模颜色不跟随 | 服务页实验区 | 请在服务页实验区开启「仪表车模颜色」自动应用；脚本页不再提供独立热修复入口 |
| HUD 投屏强制夜间配色 | HUD | 让导航应用在投屏时使用深色背景，减少眩光 |
| 逐应用缩放界面 | DPI | 配合服务页"DPI 调节"使用，让特定 App 放大/缩小显示 |
| 绕过系统签名校验 | System | 让非原厂签名的应用可调用部分系统能力 |

### 8.5 会话管理

- 可同时运行多个注入会话（不同目标进程互不影响）
- "**停止全部**"一键停止所有活跃会话
- 列表显示当前活跃会话的目标进程、脚本名、运行时长
- 目标进程如果重启，会话会自动断开；开启"**守护模式**"后会话可自动重连

### 8.6 自定义脚本

- 在自定义区直接编写 JavaScript（标准 Frida API）
- 可保存到本地脚本目录，命名后下次从"自定义"列表直接选取
- 从脚本商店下载的 Frida 脚本也会进入本地脚本目录，回到 Frida 页后可直接运行

### 8.7 脚本商店

点击"**脚本商店**"可浏览 Lua / Frida 社区脚本，下载后写入本地脚本目录；也可以上传本地脚本，普通上传审核通过后其他用户可见，勾选「隐私上传」时不会公开上架，但分享码仍可用于定向分享。脚本商店直接嵌入统一内容商店，顶部同样可切换到其他内容商店，或输入分享码下载规则、模板、组件、皮肤、脚本、配置里的任意一种内容；脚本未审核上架或设为隐私上传时，分享码仍可用于定向分享，上传者本人也可以在"我的上传"里直接下载到本机。脚本列表和脚本商店自己的"我的上传"都会显示分享码；自己的上传卡片还会显示已上架 / 待审核 / 隐私上传 / 已驳回状态，以及服务端启用时生成的 AI 风险审核意见。脚本上传仍可填写版本、权限等专用信息，署名直接使用内容商店顶部保存的"我的署名"。管理员后台有"内容审阅"和"全部内容"总览，可跨规则、模板、组件、皮肤、脚本和配置批量通过、上架、标记优质、删除并修正名称或车型；脚本详情页保留源码审阅和 AI 风险详情。上传前请确认源码里没有密钥、token、私人坐标等敏感信息。

### 8.8 Lua 脚本与 Web IDE

Lua 脚本适合表达自动化规则难以描述的逻辑，例如累计计数、复杂条件组合、循环执行、同时监听多个属性或把规则、悬浮窗按钮和脚本互相联动。

**入口**：
- 脚本页切到"Lua 脚本"子页，可新建、导入剪贴板、选择脚本目录、运行/停止脚本，也可点击"触发"执行脚本内注册的手动触发逻辑
- 点击"Web IDE"可用手机或电脑浏览器打开在线编辑器，实时保存、运行、停止并查看日志
- 点击"脚本商店"可浏览、下载或上传社区脚本

**脚本目录**：默认 `/sdcard/Download/EVCC/scripts/{lua,frida}/`，可在页面中选择其他可写目录。

完整 API、触发器和脚本商店安全说明见附录 B。

---

## 第九章 公式与变量系统

EVCC 内置完整的表达式计算引擎，可在多个场景中使用。

### 9.1 可以在哪里使用公式

| 位置 | 说明 | `x` 变量 |
|------|------|----------|
| 控制台 INFO 卡片 — 运算公式 | 转换显示值 | ✅ 当前属性值 |
| 悬浮窗/状态栏信息项 — 转换表达式 | 转换显示值 | ✅ 当前属性值 |
| EVCC mini 仪表页 — 属性运算公式 | 转换显示值 | ✅ 当前属性值 |
| 自动化 — 变量值字段 | 计算变量值 | ❌ |
| 自动化 — 动作值/命令字段 | 计算动作参数 | ❌ |
| 自动化 — BLE 数据 Payload | 计算广播数据 | ❌ |
| 模板块 `{表达式}` | 嵌入文本中的计算 | ✅ 需传入 |

除时间/日期卡片外，控制台、悬浮窗、状态栏、EVCC mini、自动化变量值和动作参数都使用同一套表达式语法：数值计算、`if()` 条件、字符串拼接、`$变量` 和 `$prop(...)` 的写法保持一致。

> **注意**：控制台时间/日期卡片的"运算公式"字段是 Java SimpleDateFormat 日期格式（如 `HH:mm`），不是数学表达式。

### 9.2 变量引用语法

| 语法 | 含义 | 示例 |
|------|------|------|
| `$变量名` | 引用全局变量 | `$speed * 3.6` |
| `${变量名}` | 同上，花括号避免歧义 | `${voltage}V` |
| `$prop(属性ID)` | 读取车辆属性实时值 | `$prop(289410048)` |
| `$prop(属性ID, 区域ID)` | 指定区域读取属性 | `$prop(289410048, 1)` |

变量替换在公式求值之前执行。

### 9.3 内置变量

无需创建，直接可用：

| 变量 | 值 | 示例 |
|------|------|------|
| `$time` | 当前时间 HH:mm:ss | 14:30:25 |
| `$date` | 当前日期 yyyy-MM-dd | 2026-03-23 |
| `$datetime` | 日期+时间 | 2026-03-23 14:30:25 |
| `$timestamp` | Unix 时间戳（毫秒） | 1711186225000 |
| `$hour` | 当前小时 (00-23) | 14 |
| `$minute` | 当前分钟 (00-59) | 30 |
| `$gps_available` | 是否有最近定位缓存，`1` 有、`0` 无 | 1 |
| `$gps_lat` / `$latitude` | 最近定位纬度 | 30.123456 |
| `$gps_lng` / `$gps_lon` / `$gps_long` / `$longitude` | 最近定位经度 | 120.123456 |
| `$gps_altitude` | 海拔（米，无海拔时为空） | 12.3 |
| `$gps_accuracy` | 定位精度（米，无精度时为空） | 8 |
| `$gps_speed` | 定位速度（米/秒，无速度时为空） | 0 |
| `$gps_bearing` | 定位方向角（度，无方向时为空） | 180 |
| `$gps_provider` | 定位来源 | gps |
| `$gps_time` | 定位时间戳（毫秒） | 1711186225000 |
| `$gps_age_ms` | 定位缓存距离当前的毫秒数 | 2500 |

GPS 变量读取系统最近一次定位缓存，不主动发起定位；如果车机暂时没有定位，`$gps_available` 为 `0`，其他 GPS 值为空字符串。

**上下文变量**（仅在特定场景可用）：

| 变量 | 场景 | 含义 |
|------|------|------|
| `$current` | SET_PROPERTY 动作 | 当前属性的实时值 |
| `$ble_button` | BLE 按键触发 | 触发的按键编号 (1-14) |
| `$ble_rotation` | BLE 旋钮触发 | 旋转值：±1 或实际角度 |

### 9.4 算术运算符

| 运算符 | 含义 | 示例 | 结果 |
|--------|------|------|------|
| `+` | 加法 | `5 + 3` | 8 |
| `-` | 减法 | `10 - 4` | 6 |
| `*` | 乘法 | `6 * 7` | 42 |
| `/` | 除法 | `22 / 7` | 3.142857 |
| `%` | 取模 | `10 % 3` | 1 |
| `^` | 幂运算（右结合） | `2 ^ 10` | 1024 |
| `()` | 括号 | `(2 + 3) * 4` | 20 |

### 9.5 比较运算符

返回 `1`（真）或 `0`（假），主要配合 `if()` 使用：

| 运算符 | 含义 |
|--------|------|
| `>` | 大于 |
| `<` | 小于 |
| `>=` | 大于等于 |
| `<=` | 小于等于 |
| `==` | 等于 |
| `!=` | 不等于 |

### 9.6 完整函数列表

#### 取整与数值

| 函数 | 参数 | 说明 | 示例 |
|------|------|------|------|
| `round(x)` | 1 | 四舍五入 | `round(3.7)` → 4 |
| `floor(x)` | 1 | 向下取整（向负无穷） | `floor(-3.2)` → -4 |
| `ceil(x)` | 1 | 向上取整 | `ceil(3.1)` → 4 |
| `trunc(x)` | 1 | 向零截断 | `trunc(-3.7)` → -3 |
| `abs(x)` | 1 | 绝对值 | `abs(-5)` → 5 |
| `sign(x)` | 1 | 符号（-1/0/1） | `sign(-42)` → -1 |
| `frac(x)` | 1 | 小数部分 | `frac(3.75)` → 0.75 |
| `min(a, b)` | 2 | 较小值 | `min(x, 100)` |
| `max(a, b)` | 2 | 较大值 | `max(x, 0)` |
| `clamp(x, lo, hi)` | 3 | 限定范围 | `clamp(x, 0, 255)` |

> `trunc` vs `floor`：正数相同，负数不同。`trunc(-3.7)` = -3，`floor(-3.7)` = -4

> `clamp` 详解：值小于 lo 返回 lo，大于 hi 返回 hi，否则原样返回。
> `clamp(150, 0, 100)` → 100，`clamp(-10, 0, 100)` → 0，`clamp(50, 0, 100)` → 50

#### 幂与对数

| 函数 | 说明 | 示例 |
|------|------|------|
| `sqrt(x)` | 平方根 | `sqrt(16)` → 4 |
| `pow(x, y)` | x 的 y 次方 | `pow(2, 10)` → 1024 |
| `hypot(a, b)` | √(a²+b²) | `hypot(3, 4)` → 5 |
| `log(x)` | 常用对数 (log₁₀) | `log(100)` → 2 |
| `ln(x)` | 自然对数 (logₑ) | `ln(2.718)` ≈ 1 |

#### 三角函数（弧度制）

| 函数 | 说明 |
|------|------|
| `sin(x)`, `cos(x)`, `tan(x)` | 正弦、余弦、正切 |
| `asin(x)`, `acos(x)`, `atan(x)` | 反正弦、反余弦、反正切 |
| `atan2(y, x)` | 二参数反正切 |
| `rad(度)` | 角度转弧度。`rad(180)` → π |
| `deg(弧度)` | 弧度转角度。`deg(π)` → 180 |

示例：`sin(rad(45))` ≈ 0.707

#### 条件与逻辑

| 函数 | 说明 | 示例 |
|------|------|------|
| `if(条件, 真值, 假值)` | 条件判断 | `if(x > 100, 100, x)` |
| `and(a, b)` | 逻辑与 | `and(x > 0, x < 100)` |
| `or(a, b)` | 逻辑或 | `or(x == 1, x == 3)` |
| `not(a)` | 逻辑非 | `not(x == 0)` |
| `concat(a, b, ...)` | 拼接文本 | `concat("电量 ", x, "%")` |

**复合条件**：
```
if(and(x >= 0, x <= 100), x, 0)         ← x 在 0~100 内返回 x，否则返回 0
if(or(x < -40, x > 215), -999, x)       ← 超范围返回 -999
```

#### 比较函数

功能同比较运算符，在模板块 `{...}` 中更方便使用：

| 函数 | 等价 |
|------|------|
| `eq(a, b)` | `a == b` |
| `neq(a, b)` | `a != b` |
| `gt(a, b)` | `a > b` |
| `lt(a, b)` | `a < b` |
| `gte(a, b)` | `a >= b` |
| `lte(a, b)` | `a <= b` |

#### 位运算

操作数先截断为整数 (Long)。在处理 VHAL 属性位域标志时非常实用。

| 函数 | 说明 | 示例 |
|------|------|------|
| `band(a, b)` | 按位 AND | `band(x, 255)` 取低 8 位 |
| `bor(a, b)` | 按位 OR | `bor(x, 4)` 置位 bit2 |
| `bxor(a, b)` | 按位 XOR | `bxor(x, 255)` 翻转低 8 位 |
| `bnot(a)` | 按位 NOT | `bnot(0)` → -1 |
| `shl(a, n)` | 左移 n 位 | `shl(1, 3)` → 8 |
| `shr(a, n)` | 右移 n 位 | `shr(255, 4)` → 15 |
| `bit(x, n)` | 取第 n 位 | `bit(x, 3)` 取 bit3 (0 或 1) |

**常见用法**：
```
bit(x, 0)                → 最低位（开关状态）
band(x, 255)             → 低 8 位字节
shr(x, 8)                → 取高位字节（16 位值）
band(shr(x, 4), 15)      → 取 bit4~bit7（高半字节）
```

#### 映射与插值

| 函数 | 说明 | 示例 |
|------|------|------|
| `map(x, in_min, in_max, out_min, out_max)` | 线性映射 | `map(x, 0, 4095, 0, 100)` |
| `lerp(a, b, t)` | 线性插值 a+(b-a)*t | `lerp(0, 100, 0.3)` → 30 |

**`map` 常用场景**：
```
map(x, 0, 255, -40, 215)     → 字节值映射为温度 (°C)
map(x, 0, 4095, 0, 100)      → 12 位 ADC 映射为百分比
map(x, 0, 1023, 0, 5)        → 10 位 ADC 映射为电压 (V)
```

#### 格式化指令

| 指令 | 说明 |
|------|------|
| `pad(表达式, 位数)` | 前导补零 + 溢出保护 |

`pad` 是格式化指令而非数学函数，行为：
1. 计算内层表达式
2. 截断为整数
3. 限制在 0 ~ 10^位数-1 范围内（溢出保护）
4. 前导零填充到指定位数

| 表达式 | x=42 | x=1234 | x=99999 |
|--------|------|--------|---------|
| `pad(x, 4)` | 0042 | 1234 | 9999 |
| `pad(x, 6)` | 000042 | 001234 | 099999 |

**嵌套使用**：
```
pad(clamp(x, 0, 9999), 4)      → 先限制范围再补零
pad(band(x, 255), 3)            → 取低 8 位后补零
```

### 9.7 字符串表达式与模板块

#### 字符串表达式

表达式里可以直接输出文字，但文字必须用英文单引号或双引号包起来。只要 `+` 的任一边是字符串，`+` 就表示拼接文本。

```
"电量 " + x + "%"                         → x=80 时输出：电量 80%
if($a > 0, "东经 " + $a, "西经 " + abs($a)) → $a=-3 时输出：西经 3
concat("温度 ", round(x * 0.1), "°C")      → 拼接多个文本/数字片段
```

不要把文字裸写在 `if()` 分支里，下面这种写法是不合法的：

```
if($a > 0, 东经$a, 西经abs($a))             ← 错误：东经/西经没有加引号
```

如果整段都是普通文字、ADB 命令、包名、日期等，EVCC 会原样保留，不会强行当公式解析。只有看起来像公式的内容才会进入表达式计算。

#### 模板块语法

在自动化变量值中，用 `{表达式}` 在文本中嵌入计算结果，大括号外的文本原样保留：

```
温度: {x * 0.1}°C              → x=234 时输出：温度: 23.4°C
亮度: {$brightness * 100 / 255}%
时间: {$gps_time * 0.001}秒
计数器: {$counter + 1}
```

> `${变量名}` 是变量引用（前面有 `$`），`{表达式}` 是模板块（前面没有 `$`），两者不冲突。
>
> 不要把混合文本写成 `时间: $gps_time*0.001秒`。这种写法只会替换 `$gps_time`，不会在文本中单独计算 `*0.001`；请用上面的 `{...}` 模板块。

### 9.8 运算符优先级

从高到低：
1. `()` 括号、函数调用
2. `^` 幂运算（右结合：`2^3^2` = 512）
3. `*` `/` `%`
4. `+` `-`
5. `>` `<` `>=` `<=` `==` `!=`（最低）

`x + 1 > y * 2` 等价于 `(x + 1) > (y * 2)`

### 9.9 实用示例集

#### 数值转换
```
x * 0.1                          → 原始值缩放 (1234 → 123.4)
(x - 32) * 5 / 9                 → 华氏度转摄氏度
x / 3.6                          → km/h 转 m/s
map(x, 0, 255, -40, 215)         → 字节值映射为温度
x - 273                          → 开尔文转摄氏度
```

#### 条件显示
```
if(x > 100, 100, x)              → 超过100封顶
if(x == 0, -1, 1000 / x)         → 避免除零
if(and(x >= 18, x <= 65), 1, 0)  → 判断是否在范围内
max(x, 0)                        → 负值显示为 0
```

#### VHAL 位域提取
```
bit(x, 0)                        → 提取最低位 (开关状态)
band(x, 255)                     → 取低 8 位
band(shr(x, 8), 255)             → 取第 2 个字节
if(bit(x, 5) == 1, 1, 0)         → 检查 bit5 是否置位
```

#### 格式化
```
pad(x, 4)                        → 42 → "0042"
pad(clamp(x, 0, 9999), 4)        → 限制范围 + 补零
```

#### 跨属性引用
```
$prop(289410048) * 0.1            → 引用其他属性并缩放
x + $prop(289410049)              → 当前值 + 另一属性值
hypot(x, $prop(289410049))        → 两个属性的向量合成
```

#### 自动化变量计算
```
$speed * 3.6                      → m/s 转 km/h
clamp($current + $ble_rotation, 0, 255)  → 旋钮增减亮度，限 0~255
round($prop(123) / 216 / 10) * 10        → 四舍五入到十位
if($hour >= 22, 1, if($hour < 6, 1, 0))  → 判断是否深夜
if($a > 0, "东经 " + $a, "西经 " + abs($a))  → 按正负值输出方向文字
```

### 9.10 注意事项

1. **Hex 数据安全**：BLE 广播等的 hex 数据（如 `AA BB 01 02`）不会被公式引擎误处理
2. **数据类型**：所有计算使用 64 位浮点数 (Double)；位运算时截断为 Long
3. **文字要加引号**：公式中出现固定文字时请写 `"文本"` 或 `'文本'`；裸写中文/英文词不会被当作字符串
4. **数值映射顺序**：新版数值映射规则会先计算公式，再按顺序匹配；未命中且没有"直接成立/兜底"时显示原始或公式处理后的数值
5. **跨属性依赖自动刷新**：使用 `$prop(id)` 时，被引用属性变化会自动刷新当前卡片
6. **时间卡片**：时间类型卡片的"运算公式"是日期格式（`HH:mm`），不是数学表达式

---

## 第十章 设置

### 10.1 开机自启动 & 保活

- **开机自启**：车机启动后自动拉起 EVCC。该选项依赖"系统白名单"（见 10.6），未写入白名单时自启可能被系统杀掉
- **保活服务**：EVCC 开启前台通知常驻，避免系统内存回收。STR 防护、远程控制自启、自动化引擎自启都由保活服务承载

> 关闭保活后，其他依赖后台持续运行的功能（STR、远程控制、自动化）也会失效。

### 10.1.1 安全密码

设置页的"设置向导 / 新手引导"下方提供 **"设置密码"** 和 **"密码范围"** 两个按钮。

- **设置密码**：可设置、修改或清除数字安全密码。设置和修改时需要输入两次确认；修改和清除前需要先输入当前密码。所有密码输入弹窗都会显示内置数字键盘，不需要调出系统输入法。
- **密码范围**：可选择进入 EVCC 主界面时需要密码，或选择进入某些一级菜单时需要密码。也可以同时选择多个一级菜单。
- **免输入间隔**：默认 60 分钟，可设置 1-2880 分钟，范围配置弹窗同样提供数字键盘。一次输入正确后，在倒计时结束前再次进入受保护范围不需要重复输入；EVCC 应用重启后倒计时仍会保留。

> 该密码只用于防止误操作，不是强安全加密。清除 EVCC 应用数据或重装后，安全密码和范围配置会一起失效。

### 10.2 自动连接开关

| 开关 | 说明 |
|------|------|
| RootService | 自动连接 Root 权限执行入口 |
| ADB | 自动启动 ADB 连接 |
| gRPC | 自动连接 VHAL gRPC 车辆属性服务 |
| APVP | 自动连接 APVP 信号源 |
| AIDL | 自动连接 AIDL 属性源 |
| CAPI | 自动连接 CAPI 属性源 |
| AdaptAPI | 自动连接独立的 AdaptAPI 属性源；默认关闭 |
| 自动化 | 自动启动自动化引擎 |
| Frida | 启用已部署的 Frida；未部署时提示先到脚本页部署 |

> 高级功能开启时自动联动依赖项。如开启"自动化"会自动开启 RootService、ADB、gRPC。关闭上游开关（如 RootService）会自动把依赖它的下游开关一起关。

### 10.3 ADB 选项

- **ADB Root**：自动执行 `adb root` 获取 Root Shell；银河 A7 / E5、P171-A1 及设置向导选择"其它龙鹰通用"的车型会自动发送必要的 Root 握手；如果系统返回需要 `vpwd` 鉴权，EVCC 会自动补发握手并重试，不需要手动填写 Root 密码；部分 E22H 车型会在请求 Root 前自动完成必要的系统权限开关准备
- **ADB Remount**：自动执行 `adb remount` 挂载系统分区为可写。默认关闭，普通启动和保活不会自动执行；仅在需要修改系统配置时手动打开

> 写入系统白名单、AVM 限速解除 / 恢复、蓝牙增强 / 恢复等明确会修改系统配置的操作，会在执行时按需准备系统分区写入权限，不需要长期打开 ADB Remount。蓝牙全量增强会改动更多原厂扫描路径，可能影响蓝牙稳定性，建议只用于对比测试。Remount 会让系统分区不再被 OTA 认可，建议**只在安装或调试完单次后关闭**。

### 10.4 RootService 操作

| 操作 | 说明 |
|------|------|
| 连接 | 连接到已运行的 RootService |
| 断开 | 断开连接 |
| 启动 ADB | 通过 RootService 启动 ADB（无需先经过应用管家） |
| 刷新状态 | 检查连接状态 |
| 终止进程 | 终止 RootService 进程（下次有需要时会自动重启） |

**测试按钮**（用来验证 Root 权限是否真的生效）：

| 按钮 | 动作 |
|------|------|
| Ping 测试 | RPC 往返一次，看连通性 |
| 亮度闪烁 | 屏幕亮度快速变化 3 次 |
| 字体缩放 | 系统字体短暂放大再恢复 |
| 反色测试 | 全屏反色一秒再恢复 |

任何一个能成功 = Root 权限正常。

### 10.5 VHAL gRPC 调试

| 操作 | 说明 |
|------|------|
| 连接 / 断开 | 手动切换 gRPC 连接 |
| 获取所有属性配置 | 从 VHAL 拉取完整属性定义表，同步到本地缓存 |
| 全量推送 | 主动请求一次全部属性当前值 |
| 手动写入属性 | 输入属性 ID、区域 ID、值，直接写入（绕过控制台和自动化） |

> 适合验证"属性能不能写"以及"写入后车辆如何响应"。属性写入有风险，不清楚含义的属性不要盲写。

### 10.6 系统白名单

让 EVCC 在 FlymeAuto 的保活和权限系统里获得"系统级应用"待遇，不会被内存清理误杀。

- **写入白名单**：一键写入 → 重启车机生效；执行时会按需准备系统分区写入权限
- **恢复白名单**：移除 EVCC，还原系统默认；执行时会按需准备系统分区写入权限；如果备份文件缺失，会尽量直接删除 EVCC 写入的白名单条目

> **什么时候该写白名单**：用到开机自启、长期保活、STR 防护、自动化引擎常驻时必写；只是偶尔用控制台写属性可以不写。

### 10.7 配置备份、还原与缓存清理

设置页的"配置备份"区域提供四个入口：

| 按钮 | 作用 |
|------|------|
| 备份全部配置 | 生成 `EVCC_backup_*.zip`，保存到 `Download/EVCC/backups`。备份内容只包含用户配置，例如控制台、自动化、悬浮窗、投屏、音乐桥接设置、主题、常用连接参数、自定义 Frida 脚本等 |
| 还原全部配置 | 从 `Download/EVCC/backups` 中选择备份包还原；旧版本保存在 `Download/EVCC` 或 `Download` 根目录的备份包也会继续识别。还原后需要重启应用才能完全生效 |
| 清除缓存 | 清理云端配置缓存、商店清单、历史运行状态、临时文件和封面/TTS 等缓存，同时保留用户配置；本机 Frida 已部署版本和部署状态会保留 |
| 配置商店 | 打开内容商店里的配置商店，可上传或下载一组可复用配置 |

备份和还原不会恢复授权状态、云端缓存、商店缓存、VIN 缓存、更新检查时间、音乐桥接的上次歌曲状态、Frida 部署状态等运行态数据。遇到升级后界面异常、旧配置导致行为异常、缓存疑似污染时，可以先点击"清除缓存"，再按提示重启应用。

配置商店更适合把一组可复用配置分享给其他用户，例如某车型地图投屏参数、主屏地图美化参数、整套控制台 + 自动化、或一套脚本和服务页参数。它不是完整备份还原：上传和下载时都能勾选具体配置项，选中的内容覆盖生效，未选中或配置包没有包含的本机配置会继续保留。服务页配置会尽量按服务页功能板块拆分，例如地图投屏和主屏地图美化可以分开选择。配置包上传时先勾选要打包的内容，点击"上传配置包"后再填写配置名称和说明；可勾选「隐私上传」让配置包不进入公开审核/上架流程，只通过分享码分享；署名直接使用内容商店顶部保存的"我的署名"。如果当前车型云端配置隐藏了某个服务功能，对应服务配置也不会出现在配置包上传选项中。服务端管理员可在内容审阅页打开配置详情，查看完整配置包内容和 AI 风险审核意见后再决定是否上架。

### 10.8 日志上传

遇到 Bug 时，上传日志包给开发者排查：

1. 在"问题描述"框简要描述复现步骤（越具体越快定位）
2. 点击 **"上传当前日志"** 或 **"上传上次日志"**（后者是本次启动之前的那次运行）
3. 上传成功后弹窗会显示日志编号，把编号告知开发者即可

普通日志上传会同时附带系统状态摘要，包含电量、内存、存储、网络、显示、温度、权限、SELinux、启动和基础系统设置等信息，方便开发者先判断车机环境是否异常。

如果需要排查黑屏、系统重启、桌面突然重载等系统级问题，且当前车型已开放诊断入口，可以点击 **"上传系统诊断日志"**。点击后会先选择故障类型（闪退、黑屏、严重卡顿或其他），也可以补充发生时间和操作场景。EVCC 会抓取最近约 15 分钟的系统日志、DropBox、ANR、tombstone、pstore/ramoops、关键 dumpsys、进程状态、重启原因、RootService Shell 审计，以及车机已有的系统异常、启动/休眠恢复、窗口跟踪、受限内存转储、网络、MCU/QNX/NFS、原厂缓存和部分地图/互联应用日志目录（存在时会自动打包）。如果该车型由云端开启了诊断探针，EVCC 会先运行云端选定的探针，再把探针结果并入同一份系统诊断日志；云端自动探针上传和用户手动点击"上传系统诊断日志"走的是同一套打包上传流程。选择"探针 5"时，诊断包会附带当前车机可读取的车辆服务 APK 和适配 API/Car JAR 等车型适配资料，缺失或无法读取的可选文件会记录原因并继续。诊断包保存到 `Download/EVCC/logs/system_diagnostic`，内容较多时会自动分为多个压缩包；正式上传前会提示总大小、分卷数量和保存目录，用户确认后才会上传给开发者，取消上传也会保留本地文件。上传弹窗会分别显示"收集诊断日志"和"上传诊断日志"两段进度，并展示当前步骤、等待时间和收集结果。这个按钮不要求先打开 Debug 模式；当前车型未开放诊断入口时，EVCC 也不会持续运行对应的后台系统日志采集。

打开 Debug 模式时会先选择模式：
- **普通 Debug**：增加 EVCC 自身调试日志，适合排查普通功能问题
- **深度抓取**：连续记录系统日志，用于黑屏/系统重启等偶发问题；之后点击"上传系统诊断日志"会优先附带深度抓取到的日志

设置页底部的 **"RootService Shell 保护（实验）"** 仅在对应车型由云端适配开放时显示。开关默认开启，用于降低短时间多条 Shell 指令叠加造成的系统服务压力；诊断和安装等长任务会走独立通道，不会长时间阻塞普通操作。

日志包含：
- LogCollector 全部应用日志
- 最近主进程 logcat 输出
- 系统状态摘要（电量、内存、存储、网络、显示、温度、权限、SELinux、启动状态等）
- 系统诊断压缩包（手动上传系统诊断日志时包含）
- RootService 日志
- CP (dashcastd) 日志
- Frida 注入/守护日志（新日志保存到 `Download/EVCC/logs/frida`，旧目录日志也会兼容收集）
- EVCC mini 进程日志（运行时）
- 诊断快照（已连接服务、当前属性缓存等）
- 设备信息（型号、Android 版本、EVCC 版本）

> **隐私提醒**：日志会记录属性 ID 和值，不会记录账号密码、位置经纬度。如果你担心某些值敏感，可以用文本编辑器提前脱敏再上传。

### 10.9 调试模式

打开时可选择普通 Debug 或深度抓取。普通 Debug 会显示更多 DEBUG 级别日志；深度抓取会持续记录系统日志，便于黑屏或系统重启后上传最近 15 分钟诊断包。诊断结束后建议关闭，以免产生额外日志文件。

### 10.10 版本更新

- 启动时自动检查新版本，有更新时弹窗提示
- 弹窗内点击 **"更新日志"** 可按版本分组查看所有版本变更摘要
- 点击 **"立即更新"** 下载新 APK 并启动安装
- 下载完成弹窗会提醒：更新后建议重启车机一次，否则可能会遇到未知 BUG
- 一键安装开始前会自动清理可能影响更新的缓存，保留用户配置；清理失败时会在安装日志中提示并继续安装
- 一键安装失败时会显示可读原因；如果提示 RootService / ADB 不可用或安装包不可读，可改用手动安装
- 也可在设置页随时点击 "检查更新" / "更新日志" 按钮，并通过通道开关在 "测试版" 与 "稳定版" 间切换；默认使用测试版通道，检测成功后会在版本区域显示该通道最新版本
- 切换通道后会立即检查该通道版本。如果通道版本低于当前安装版本，仍可下载，但降级后建议先清空 EVCC 数据再使用

> 下载失败多半是网络问题，可打开 EVCC 下载中心手动下载对应通道的安装包再安装；EVCC 安装器默认下载测试版。

### 10.11 运行日志

设置页底部区域显示完整运行日志（最新在下方）：
- 按级别着色（白/橙/红/灰）
- 长按一条日志可复制
- 右上角"清空"按钮清除显示（不影响已存储的日志文件）
- 右上角"导出"可把当前可见日志导出为 txt

### 10.12 其他开关

设置页还提供若干零散开关，按需启用：

| 开关 | 作用 |
|------|------|
| 关闭登录校验 | 开启后无需再激活就能打开所有页面（仅用于激活失败时临时应急） |
| 禁用云端同步 | 本地独立运行，不再拉取云端属性/命令/模板 |
| 保留历史值 | 控制台切换页面后回来仍显示上次的值 |
| 严格写入确认 | 所有属性写入前都弹一次确认对话框 |
| 监测悬浮窗 | 显示资源/状态监测浮层，便于临时观察车机运行状态 |
| 系统进程悬浮窗 | 显示系统进程 CPU/内存排行，并每 10 秒把快照写入运行日志 |
| Overlay 清除 | 查看并清除 `/system`、`/vendor` 等分区的 overlayfs 上层修改，清除后需重启；仅在适配开放时显示 |

---

## 第十一章 自动化实战教程

以下是一些常见的自动化场景配置步骤。

### 11.1 夜间自动开启大灯

1. 新建规则
2. 触发器：`日落触发`，偏移 `-10` 分钟（日落前 10 分钟）
3. 条件：（无）
4. 动作：`SET_PROPERTY`，属性 ID = 大灯属性，值 = 开启值
5. 冷却时间：3600 秒（1 小时，避免重复触发）

### 11.2 BLE 旋钮控制亮度

1. 新建规则
2. 触发器：`BLE_RECEIVED`，选择已配对的旋钮设备
3. 条件：（无）
4. 动作：`SET_PROPERTY`，属性 ID = 亮度属性，值 = `clamp($current + $ble_rotation, 0, 255)`

### 11.3 车速超速提醒

1. 新建规则
2. 触发器：`PROPERTY_GREATER_THAN`，属性 ID = 车速属性，阈值 = 120
3. 条件：（无）
4. 动作：`TTS_SPEAK`，内容 = "当前车速超过120，请注意安全"
5. 冷却时间：60 秒

### 11.4 到家自动执行

1. 新建规则
2. 触发器：`GEOFENCE_ENTER`，使用地图选点选择家的位置，半径 300 米
3. 条件：（无）
4. 动作 1：`TTS_SPEAK` = "欢迎回家"
5. 动作 2：`LAUNCH_APP` = 智能家居 App 包名

### 11.5 开机自动启动导航

1. 新建规则
2. 触发器：`BOOT_COMPLETED`
3. 条件：（无）
4. 动作 1：`DELAY` = 5000（等 5 秒系统稳定）
5. 动作 2：`LAUNCH_APP` = 导航 App 包名

### 11.6 定时发送状态报告

1. 新建规则
2. 触发器：`TIMER_CRON` = "08:00"（每天早 8 点）
3. 条件：（无）
4. 动作：`SEND_REMOTE_MESSAGE`，平台 = Telegram，内容 = "车辆状态正常，电量: {$prop(电量属性ID)}%"

### 11.7 Logcat 监听温度

1. 新建规则
2. 触发器：`LOG_KEYWORD`
   - LogRegex: `"cpu_temp=(\d+)"`
   - LogExtractVars: `"cpu_temp"`
3. 条件：`VARIABLE_COMPARE`，`$cpu_temp > 80`
4. 动作：`NOTIFICATION` = "CPU 温度过高: {$cpu_temp}°C"

### 11.8 米家多键开关控制空调

需要先按 6.11 节完成米家按键的配对。

1. 新建规则
2. 触发器：`BLE 设备信号`
   - 预设键盘：米家蓝牙Mesh开关/键盘
   - 设备 MAC：通过"学习设备"自动填入
   - BindKey：从 Xiaomi Cloud Tokens Extractor 获取的 32 位 hex
   - 按键 ID：按键 1
   - 点击方式：单击
3. 条件：（无）
4. 动作：`SET_PROPERTY` 写入空调风量属性 = `clamp($current + 1, 0, 7)`（风量 +1，最大 7）
5. 复制规则，改按键 ID = 按键 2 / 点击方式 = 单击，动作改为 `clamp($current - 1, 0, 7)`（风量 -1）
6. 按键 3 / 4 可分别做空调温度 +1 / -1

> 一个米家 4 键开关可以覆盖"空调风量 +-、温度 +-"4 个常用动作，比方控拨盘顺手。

### 11.9 上车后一键场景

利用"蓝牙连接"触发器检测手机连上车机蓝牙，作为"人坐进车里"的信号。

1. 新建规则
2. 触发器：`经典蓝牙设备连接`，选择你的手机 MAC
3. 条件：`时间范围` = `06:00` ~ `10:00`（只在早上触发）
4. 动作 1：`DELAY` = 3000（等 3 秒让车机系统稳定）
5. 动作 2：`LAUNCH_APP` = 导航 App 包名
6. 动作 3：`TTS_SPEAK` = "早上好，正在为你打开导航"
7. 动作 4：`SET_PROPERTY` 写入空调自动模式属性 = 1
8. 冷却时间：3600 秒（避免同一早上多次蓝牙断连重连反复触发）

### 11.10 低电量保护 + 远程通知

1. 新建规则
2. 触发器：`PROPERTY_LESS_THAN`，属性 ID = 12V 电瓶电压属性，阈值 = `11.8`
3. 条件：`TIME_RANGE` = `00:00` ~ `23:59`（全天都触发，这里用条件模板也可改为"非充电中"）
4. 动作 1：关闭 STR 防护（`SET_PROPERTY` 写入 STR 属性 = 0 或改为 `TRIGGER_AUTOMATION` 触发"关闭 STR"规则）
5. 动作 2：`SEND_REMOTE_MESSAGE`，Telegram，内容 = "⚠️ 车辆 12V 电压 {$prop(电压属性ID)}V 过低"
6. 冷却时间：1800 秒（30 分钟）

### 11.11 HUD 夜间自动切换配色

1. 新建规则
2. 触发器：`日落触发`，偏移 `0`
3. 动作：`SET_PROPERTY` 写入 HUD 投屏"白天/夜间"模式属性（或用"触发其他自动化"调用投屏更新）
4. 新建第二条规则：触发器 = `日出触发`，动作反向切回白天模式

> 如果投屏参数已开启"**自动模式**（跟随系统暗色）"，此规则可用来提前/延后切换（例如日落前 15 分钟就切夜间）。

---

## 第十二章 常见问题 (FAQ)

### Q1: 所有页面显示锁定状态怎么办？
**A**: 软件尚未激活。请联系管理员提供设备 ID 进行激活，或使用 EVCC 在线自助激活页输入购买到的激活码；如果管理员给的是传统长激活码，也可使用隐藏入口（连续点击设备 ID 7 次）手动输入。

### Q2: RootService/ADB Shell 无法连接？
**A**: 尝试使用应用管家开启"永久开启无线ADB功能"。并确认应用管家右上角显示已连接，若应用管家也连不上，先解决该连接问题。

### Q3: 软件的多个功能同时出现不正常？
**A**: 软件升级或修改了配置后，尝试重启车机。使用应用管家确认软件获得了所有他所需的权限。

### Q4: 音乐桥接没有反应？
**A**: 领克车型需先部署 Frida。可尝试关闭后重新打开桥接开关，或重启车机。车机重启后，需 60 秒左右音乐桥接才会启动。

### Q5: 投屏画面不正确？
**A**: 调整虚拟屏分辨率、缩放、裁切和旋转参数。可导入其他用户分享的参数快速适配。

### Q6: 属性抓不到，或者抓取异常？
**A**: 属性翻译是 AI 翻译的，自行确认翻译是否准确。如果抓不到或者属性异常，说明车辆未暴露该属性，非软件问题。

### Q7: 自动化规则不触发？
**A**: 
1. 确认自动化引擎已启动（顶部开关）
2. 确认规则已启用（单条规则开关）
3. 检查触发条件是否正确（用属性监视器验证）
4. 检查条件是否满足
5. 查看执行日志是否有错误信息
6. 检查冷却时间是否过长

### Q8: 公式不生效或显示错误？
**A**: 
1. 确认公式语法正确（括号匹配、函数名正确）
2. 如果设置了数值映射规则，先确认公式结果是否落入规则条件；没有命中且没有"直接成立/兜底"时会显示原始或公式处理后的数值
3. 时间卡片的"运算公式"是日期格式，不是数学公式
4. 变量名区分大小写
5. `$prop(id)` 中的 id 需要是正确的属性 ID

### Q9: 悬浮窗不显示？
**A**: 
1. 确保已授予"显示在其他应用上方"权限
2. 在系统设置中检查悬浮窗权限

### Q10: Frida 部署失败？
**A**: 
1. 确保设备已 Root
2. 确保网络可用（首次部署需下载 Frida 注入组件）
3. 检查存储空间是否充足
4. 尝试"卸载"后重新"部署"

### Q11: 仪表投屏连接失败？
**A**: 
1. 确认车型支持（龙鹰一号等）
2. 检查 CP 节点网络连通性（默认 198.18.44.2）
3. 软件会自动扫描 198.18.44.0/24 网段发现 CP 节点

### Q12: 如何备份/迁移配置？
**A**: 
1. 整体迁移：设置页 → "配置备份" → 点击"备份全部配置"，在新设备上复制该 ZIP 到 `Download/EVCC/backups` 后点击"还原全部配置"
2. 还原后按提示重启应用
3. 如果只是排查缓存污染，不需要导入备份，点击"清除缓存"即可保留配置并清理运行态/云缓存
4. 单项分享仍可使用：仪表盘保存为模板、自动化导出 JSON、投屏参数导出二维码/JSON、悬浮窗导出配置
5. 银河 L6（G733）在 1.7.3、2.3.0、2.3.1 系统之间迁移时，可使用官网“配置转换器”双向转换完整备份 ZIP，再在目标系统中还原

### Q13: 如何查看更新日志？
**A**: 设置页 → "更新日志"按钮，可按版本分组查看历史变更。

---

## 第十三章 安全注意事项

1. **车辆属性读写风险**：不当操作可能导致车辆功能异常。修改属性前请确认属性含义和影响。
2. **先测试后启用**：自动化规则建议先用"手动执行"测试，确认无误后再启用自动触发。
3. **设置冷却时间**：为频繁触发的规则设置合理的冷却时间，避免属性被快速反复写入。
4. **确认执行**：高风险组件开启"确认执行"选项，避免误触。
5. **定期备份**：建议定期备份自动化规则和仪表盘配置。
6. **Frida 谨慎使用**：使用前了解目标应用行为，避免不可预期的后果。
7. **STR 防护注意电量**：设置合理的电量阈值，避免电池耗尽。
8. **远程控制安全**：妥善保管机器人 Token 和密钥，避免未授权访问。

---

## 第十四章 社区资源与相关链接

EVCC 有一个活跃的车友社区"**技术共创星球**"，大家在群内交流使用技巧、分享自动化规则和仪表盘模板、帮助解答技术问题。

### 14.1 官方网站

- **官网**：[coauto.cc](https://coauto.cc)
- **EVCC AI 助手**：`https://evcc.coauto.cc/ai-assistant`（已默认接入本手册，可直接提问 EVCC 使用、配置、自动化和公式问题；支持上传截图、手机拍照、粘贴图片或拖拽图片，图片会自动压缩；输入框会随长内容自动增高，到达上限后在输入框内部滚动；AI 回复支持 Markdown、代码块复制、整条回复复制和一键刷新重新回答；支持浅色/深色/跟随系统显示模式；弱网或浏览器后台导致回复中断时会保留已收到内容，并提示可点刷新重新回答；页面顶部可返回 `https://evcc.coauto.cc/` 导航页。管理员可在后台配置 AI API、模型、系统提示词、问候语、预设问题、图片体积上限、每小时对话限流和日志 AI 分析范围；设备日志页的问题类型筛选会按登录账号保存；达到限流时页面会提示稍等后再聊）
- **服务端后台导航**：管理员后台的"异常检测"按"心跳异常 / 指令下发 / 异常报告 / 完整性事件"分组，"内容商店"收纳 ADB 命令入口，"AI 助手"按"助手配置 / 对话记录"分组；车型适配的设备覆写添加页支持每行一个设备 ID 批量创建相同覆写；设备管理会显示每台设备新增时的固定来源，并区分自动迁移和网页自助迁移；异常报告详情会汇总 VIN/SN、账号、位置、网络和蓝牙等归因线索；付费总览按激活类来源统计并剔除已拉黑设备，代理也可查看自己的付费总览；单台收入只保存在当前浏览器，不写入服务端。
- **本 SKILL 下载地址**：`https://evcc.coauto.cc/static/evcc_user_guide.md`（问 AI 有关 EVCC 的问题时，把这个文件导入给 AI，AI 就能准确回答）

### 14.2 入群须知

1. **进群备注车型**：进群后请备注自己的车型，方便大家交流和解答技术问题
2. **善意文化**：遇到好心人解决了你的问题，记得发个小红包鼓励一下
3. **郑重声明**：
   - 本群仅为技术交流，群内提供的技术及软件为内部工具，请勿对外传播
   - 使用群内分享的技术或工具导致设备故障，群主概不负责
   - 本群收费为入群费用，作为入群门槛收取，与群内软件、技术无关联

### 14.3 教程与文档

| 资源 | 链接 | 说明 |
|------|------|------|
| EVCC 使用说明书（腾讯文档） | https://docs.qq.com/aio/DS2ZpQktxYkJrZ3Ju | 官方使用教程（腾讯文档版，可直接在线阅读） |
| 银河 E5 技术共创（腾讯文档） | https://docs.qq.com/aio/DS0VoTE92YW5LdVBx | 银河 E5 深度搞机文档 |

### 14.4 软件下载

| 资源 | 链接 | 说明 |
|------|------|------|
| EVCC 软件下载 | https://download.coauto.cc:9568/ | EVCC 下载中心，可下载测试版/稳定版安装包、使用文档和相关工具。**安装后点击左上角设备 ID，发给管理员激活** |
| 银河 E5 进阶搞机包 | https://suyunkai.top:5667/s/898dc3cea4964f9bb0 | 银河 E5 的进阶搞机资源包 |

### 14.5 激活迁移

重置车机后，原激活状态可自助迁移到新设备，无需联系管理员重新激活：

- **自动迁移**：重置后重新安装并打开 EVCC，保持联网。如果服务器检测到 SN、机型、VIN、Android 版本与已有激活记录完全一致，会在应用内弹出迁移确认框。新版会在识别到车辆 VIN 后立即重试迁移检测，减少等待弹窗的时间；如果多用户车机已经迁移到新用户后又切回原 Android 用户，也会通过同样的弹窗确认是否迁回当前设备。确认后原已激活设备 ID 失效，当前设备自动激活。
- **迁移限制**：任一身份字段缺失或不一致都不会自动迁移；同一 SN 一生最多迁移 50 次，不再限制两次迁移的间隔天数。公开迁移页同一 IP 每小时最多提交 20 次、每天最多提交 50 次。
- **迁移地址**：https://evcc.coauto.cc/migrate
  - 如果忘记旧设备 ID，可在迁移页点击“找回历史设备 ID”，输入 VIN，并通过最初自助激活码，或任意历史设备 ID + 对应 SN 验证后找回当前有效设备 ID。找回功能需要完成页面验证码，每个 IP 每小时最多尝试 10 次；它只显示设备 ID，不会自动执行迁移。
  - 如果应用内没有弹出自动迁移，仍可使用网页自助迁移或联系管理员处理。

### 14.6 车友共创项目（GitHub）

| 项目 | 链接 | 说明 |
|------|------|------|
| 智驾小蓝灯 | https://github.com/shileime/LYNKCO-08-IDL-simple | 领克 08 智驾状态小蓝灯实现，可在驾驶过程中直观感知智驾状态 |
| 青龙面板脚本 | https://github.com/suyunkai/geely-galaxy-assistant | 吉利银河助手青龙面板脚本，自动化签到等 |

### 14.7 社区风格

- 技术交流为主，鼓励分享和共创
- 遇到问题可在群内求助，也可以贡献自己的模板/规则到云端商店供他人下载
- 发现 Bug 或有功能需求，可通过"EVCC 需求与 Bug 收集表"提交

---

## 附录 A：版本历史摘要

| 版本 | 主要更新 |
|------|----------|
| v2.9.44 | 自动化、控制台和悬浮窗动作在米德宝 BLE 直发模式开启后可选择米德宝联动动作编组；悬浮窗默认 EVCC 启动按钮可改图标和功能；播放声音动作选择本地音频时会转存到 EVCC 私有目录 |
| v2.9.43 | 服务页实验区新增 EVA 联动；音乐转发桥接支持 BPM 显示和缓存；米德宝联动新增 BLE 直发模式、音乐律动配置和手动测试指令 |
| v2.9.28 | 自动化、控制台和悬浮窗的媒体控制动作新增全局媒体键模式，可兼容部分 CarPlay 盒子和蓝牙盒子的上一首、下一首、播放暂停控制 |
| v2.9.23 | 设置向导新增音乐桥接选择步骤，可按车型方案自动选择桥接车型；主界面功能引导介绍内容商店时会真正展示商店页面；优化开机自动化后端连接等待 |
| v2.9.22 | 配置商店的服务配置按服务页功能板块细分；设置向导支持车型推荐问答，音乐桥接和悬浮窗等可由推荐配置按需套用，完成后继续显示车型默认 DPI 与完整主界面功能引导；EVCC mini 空控制台可直接引导添加小窗模板 |
| v2.9.21 | 优化内容商店加载和应用反馈；上传内容可选择隐私上传并仅通过分享码分享，后台可锁定上传内容；新增规则/组件测试和皮肤恢复初始入口 |
| v2.9.10 | 优化部分 E22H 车型自动获取 Root 权限流程，启动前会自动完成必要的系统权限开关准备 |
| v2.9.9 | 桌面歌词支持 ICCOA 和 HUAWEI 手机互联音乐歌词识别；新增 L7 HUD 歌词；优化导出目录、音乐转发恢复、自动化恢复和设备迁移识别，并移除自动小窗自动拦截功能和后台监控 |
| v2.9.8 | 内容商店整合配置包分享；新增数字安全密码；优化后台清理、系统诊断采集和仪表信息卡刷新，并下线自动小窗自动拦截入口 |
| v2.9.1 | 小程序 MQTT 上报支持同时读取车辆属性、预设变量和自定义全局变量，属性和变量变化会实时推送；变量系统新增 GPS 定位相关预设变量 |
| v2.8.14 | 设置页新增按车型开放的 8155 黑屏保护、RootService Shell 保护和复现测试工具；优化启动期权限自恢复与音乐占位源刷新流程 |
| v2.8.7 | 系统诊断日志上传前可选择故障类型并补充说明，诊断包会尽量包含更多系统异常日志 |
| v2.8.6 | 服务页实验区新增系统底栏视觉调试；应用权限管理授予无障碍服务时会同步到所有已安装用户；Debug 模式支持深度系统日志抓取和手动上传系统诊断日志 |
| v2.8.4 | 自动化、控制台组件和悬浮窗组件在选择“触发自动化”目标时同时显示规则名称和 ID；控制台编辑模式删除组件前会弹窗确认 |
| v2.8.3 | 服务页实验区新增“小程序”MQTT 上报；修复音乐桥接无播放会话时方向盘 OK 键可能反复触发的问题；优化注册源列表提示图标；服务页“仪表车模颜色”入口移入实验区 |
| v2.8.2 | 修复银河 L6/L7 使用伪装注册源时音乐转发可能和原车仪表链路重复推送、导致封面闪烁的问题；桌面歌词新增歌词偏移调节；优化注册源列表，并新增白名单音乐源占位包伪装能力 |
| v2.7.9 | 修复音乐转发桥接暂停后恢复、后台唤醒和酷狗播放/暂停兼容问题；无障碍权限保护升级，EVCC 自身和勾选持久化的第三方 App 被关闭后会自动恢复，应用权限管理中授予第三方无障碍后会刷新服务绑定，关闭单个 App 时不再误关其他无障碍服务，并新增"补授常用"按钮；脚本页移除车模改色热修复入口，旧版脚本自启会自动关闭，服务页"仪表车模颜色"功能保留并增加使用前风险提示 |
| v2.7.8 | 优化音乐转发注册媒体源、自选源管理和强制上送逻辑，修复音乐桥接冷启动、控制台皮肤按钮、音量组查询/设置反馈，并补充音量组测试音、服务日志反馈和商店车型匹配/排序能力 |
| v2.7.6 | 优化音乐转发桥接的原生 MediaCenter 接管识别，EVCC mini 音乐页和 2×3 及以上音乐组件支持拖动进度条调整播放位置，新增可选显示屏、-20% 起步位置、旋转角度、位置锁定、单/多行、紧凑底色、描边强度、轻微阴影、颜色模式和自定义日夜配色的桌面歌词，并让桌面歌词不受 EVCC 软件 DPI 设置影响；控制台、悬浮窗按钮和自动化新增热点控制动作；配置备份/还原改为只处理用户配置，并新增清除缓存入口；重置车机后支持自动确认迁移旧激活 |
| v2.7.3 | APVP 写入弹窗补充 RX 模拟写入提示、Struct 分字段写入、Bytes/Mixed 按需图片/文本/十进制/HEX 预览、输入框/选项/快捷按钮主题化边框与底色，以及白天模式按钮可见性修复；优化自动化中断器、TTS 与音乐转发兼容性 |
| v2.7.2 | APVP 写入支持 REAL/DEBUG transfer mode 与枚举项直选；商店上传/下载可携带本地资源和关联自动化；媒体播放/暂停动作支持播放、暂停、切换；自动化新增条件判定延迟和运行期中断器；RootService 并发探测、托管自动化日志优化；文件页支持媒体预览和 EVCC APK 安装器 |
| v2.6.9 | 自动化条件分支支持 IF IF 多命中模式；EVCC AI 助手限流提示改为正常回复用户稍等后再聊，并优化弱网/后台中断时的半截回复保留；修复规则商店规则组导入后的组内联动指向，优化音乐高清封面切歌刷新流程，并收敛深度休眠后 HUD 地图与仪表投屏恢复链路 |
| v2.6.8 | EVCC AI 助手回复新增一键刷新重新回答；补充银河 L7 三指流转白名单解除、Lua 属性展示值规整、激活遮罩 VIN 刷新、mini 音乐打开与 Flyme 小窗浅色状态栏等优化 |
| v2.6.7 | 官网导航新增 EVCC AI 助手入口，可基于使用手册咨询配置、自动化、公式和常见问题；支持图片/拍照提问、Markdown 展示、代码复制、深浅色模式、后台对话记录、限流配置、第三方代理兼容、系统提示词和预设问题管理 |
| v2.6.6 | 修复深睡唤醒后的 HUD 地图投屏恢复、音乐桥接冷启动、mini 音乐状态、权限自愈和若干白天模式弹窗可读性问题，并降低诊断日志刷屏 |
| v2.6.4 | EVCC mini 新增应用菜单、虚拟屏幕复用、三种 App 启动方式、单 App 沉浸式状态栏、图标大小/行列/排序设置、音乐页大封面与高清封面；MC 卡片直开支持无障碍 / Log 监测两种触发方式 |
| v2.6.4 | 服务页卡片收起逻辑、悬浮窗触摸区域、音乐转发歌词偏移、自动化播放声音增益、RootService 托管执行和 Lua AIDL/CAPI 属性能力增强 |
| v2.4.4 | EVCC Mini 转为增值服务 (7 天免费试用 + 激活码激活)，激活码与设备 ID 绑定，随"设备迁移"跟走；主 EVCC 侧增"💎 增值服务"管理面板；Bridge 协议升级到 v3 |
| v2.4.4 | EVCC mini 新增"音乐"页面 (Flyme AutoMediaControl 1:1 复刻)，mini 支持多页面滑动切换与 tab 管理 (增删改排) |
| v2.4.2 | 应用管理权限对话框新增"特殊权限一键授予"分组 (悬浮窗/无障碍/电池优化等 9 种) |
| v2.4.1 | mini 封面/字体/Shell 按钮/小窗启动四连修复；Bridge 协议升级到 v2 |
| v2.4.0 | 系统小窗拆分为独立 APK (EVCC mini)，通过 ContentProvider + AIDL 跨进程桥接 |
| v2.3.x | 脚本引擎 (Lua + Web IDE + 脚本商店)；系统小窗 DPI uniform zoom；仪表投屏 BGRA+LZ4 编码 |
| v2.2.4 | 仪表投屏信息卡重构、虚拟屏稳定性、Display 选择器统一 |
| v2.2.3 | 仪表投屏功能（龙鹰一号）、日出/日落触发、地理围栏、地图选点、规则组管理 |
| v2.2.2 | 商店统一搜索、更新日志按钮、音乐转发焦点控制 |
| v2.2.1 | BLE 广播台升级（UDP/HTTP 传输） |
| v2.2.0 | 银河 A7 低配适配、新手引导 DPI |
| v2.1.8-v2.1.9 | 多语言支持（中/英/俄）、领克 09 适配 |
| v2.1.6 | 异屏同显 |
| v2.1.5 | 星舰 7 适配、云端 DPI 配置 |
| v2.1.4 | TTS 新引擎（Edge/阿里云）、命令历史 |
| v2.0.7-v2.0.8 | 引擎声音、TTS 选择、"我的模板" |
| v2.0.2-v2.0.4 | BLE 广播台、系统小窗、DPI 调节 |
| v2.0.0-v2.0.1 | 白天/夜间主题、自动小窗、云端配置 |
| v1.9.x | 仪表盘升级、TTS、规则商店、应用管理、音乐桥接 |
| v1.5.x-v1.8.x | 自动化引擎、开机自启、ADB 工具 |
| v1.0.x | 初始版本 |

---

## 附录 B：脚本中心（编程引擎）

> 当前"脚本"tab 包含 Frida 与 Lua 两个子页，页面内提供"脚本商店 / Web IDE"入口。

### B.1 Lua vs 自动化规则

| | 自动化规则 | Lua 脚本 |
|---|---|---|
| 编辑方式 | 图形化 | 写代码 |
| 学习成本 | 几乎零 | 需要 30 分钟入门 |
| 表达能力 | 中等（触发→条件→动作） | 高（任意逻辑/循环/状态机） |
| 适合 | 简单的"X 时做 Y" | 复杂判断、累计计算、循环、多源联动 |

两套引擎共享所有事件源和动作能力，可互相触发（自动化里 `RUN_SCRIPT` / Lua 里 `automation.trigger`）。

### B.2 脚本目录

默认 `/sdcard/Download/EVCC/scripts/{lua,frida}/`，和 EVCC 其他资源同目录。左上 "选择文件夹" 可改到任意可写路径。目录下的 .lua/.js 文件自动被扫描识别。

### B.3 头部元信息

```lua
--@name 智能巡航控制
--@version 1.0.0
--@author you
--@description 车速超过 120 自动 TTS 提醒
--@autostart false
--@permissions property_write, shell, tts
```

`autostart` 也可通过脚本卡片上的 Switch 切换。Frida 脚本开启自启前会弹出风险确认；Frida 注入可能导致系统异常，关闭对应自启后可恢复。

Lua 脚本如果写了 `trigger.on_manual(function() ... end)`，需要先让脚本处于运行状态（手动运行或开启自启），然后可在脚本页点击"触发"，也可在控制台组件、自动化动作或悬浮窗动作里选择"触发 Lua 脚本"并填写脚本 ID。它只触发已经运行脚本里的手动回调，不等同于"运行脚本"。

### B.4 完整 API

#### `property` — 5 源属性 R/W + 监听

```lua
property.read("vhal:VehicleSpeed")          -- 默认 vhal，可省略前缀
property.read("apvp:某信号名")               -- APVP（自动 refresh，无需先订阅）
property.read("aidl:557877498")             -- AIDL：优先使用十进制属性 ID
property.read("capi:557877498")             -- CAPI / CarApi：同样支持十进制属性 ID
property.read("adaptapi:772277248")         -- AdaptAPI：使用语义属性 ID 或名称
property.read("settings:system/screen_brightness")
property.read("sysprop:ro.build.version.sdk")
property.write("sysprop:debug.evcc.x", "1") -- → ok, err
property.on_change("vhal:VehicleSpeed", function(p)
  log.i(p.new .. " (was " .. p.old .. ")")
end)
property.on_change("aidl:557877498", fn)    -- AIDL/CAPI/AdaptAPI 监听优先写十进制 ID
property.on_change("aidl:557877498/0", fn)  -- 只有同 ID 多区域时才需要 /areaId
property.list("vhal")                       -- 当前源所有已知属性
property.list("aidl")                       -- 返回 aidl:<十进制属性ID>
property.list("adaptapi")                   -- 返回 adaptapi:<语义属性ID>
property.info("vhal:VehicleSpeed")          -- {id, area_id, data_type, value, ...}
```

车辆属性的 `value/new/old` 会自动按自动化规则的口径规整：例如底层显示为 `1 (0x1)`、`2 (READY)` 时，Lua 里拿到的是 `1`、`2`，可直接用于 `tonumber()`、大小比较和等值判断。需要显示底层原始文本时，`property.info()` 里读取 `value_display`，`property.on_change` 回调里读取 `new_display/old_display`。`settings:` 和 `sysprop:` 保持系统返回的原始字符串，不做车辆属性规整。

`property.on_change` 只在车辆属性真实变化时回调；底层重复上报同一值、或脚本/界面主动读取当前值造成的刷新，只会更新缓存，不会触发回调。

`property.read/write/info/on_change` 返回 `(nil, err)` 时，EVCC 会自动把 `[property.xxx] 错误原因` 写入该脚本的日志和上传日志；脚本仍可读取第二返回值做自定义处理。同一脚本 5 秒内相同错误会节流，避免刷屏。

`property.on_change` 回调参数 `p` 包含 `source/name/new/old/new_display/old_display`，车辆属性事件还会带 `id/area_id/hex`，便于脚本按属性 ID 做兼容判断。`area_id` 是 Android CarProperty 的区域 ID：全局属性通常是 `0`，座椅/车门/车窗/空调分区这类属性可能按区域拆分。Lua 里只写 `aidl:<属性ID>` 时会匹配任意区域；只有同一个属性 ID 出现多个区域且必须区分时，才写 `aidl:<属性ID>/<areaId>`。

**APVP 自动订阅：** `on_change("apvp:xxx", fn)` 会自动调 `addSubscription` 让脚本成为订阅者；脚本停止时自动注销。

#### `var` — 引擎变量（和自动化共享）

```lua
var.read("counter")
var.write("counter", "42")
var.read("gps_lat")           -- 读取预设 GPS 纬度变量
var.on_change("counter", function(p) log.i("new=" .. p.new) end)
var.list()                    -- 自定义变量列表 {"counter", "foo", ...}
var.delete("temp")
```

Lua 的 `var.read()` 和自动化变量系统共用同一套变量：自定义全局变量、时间预设变量和 GPS 预设变量都可以直接读取。`var.list()` 只列出已创建的自定义变量，预设变量按名称直接读。

#### `shell` — root 命令

```lua
local out, err = shell.exec("getprop ro.product.model", 5000)  -- 超时可选
```

#### `log` / `sleep` / `time` / `json` / `storage` / `toast` / `http`

```lua
log.i("info");  log.w("warn");  log.e("error")
print("自动重定向到 log.i")

sleep(1000)                          -- 100ms 切片，停止立刻打断

time.now()                           -- ms 时间戳
time.format(ts, "yyyy-MM-dd HH:mm")
local d = time.today()               -- {year, month, day, hour, weekday}

json.encode({a=1, b="x"})
json.decode('{"k":1}')

storage.write("state.txt", "running")  -- 沙箱在 _data/<script_id>/
storage.read("state.txt")

toast.show("Hello")

http.get("https://api.xxx/data")     -- → {status, body, headers}, err
http.post(url, body, {headers={...}, timeout_ms=30000})
```

#### `script` — 自我信息 + 退出钩子

```lua
log.i(script.name .. " path=" .. script.path)
script.on_stop(function() log.i("cleanup…") end)
-- 主动停止: script.stop()
```

#### `trigger.*` — 全部 15 种触发器

```lua
trigger.on_boot(function() log.i("开机") end)

trigger.on_screen({on=true}, function() log.i("亮屏") end)
trigger.on_app_foreground("com.tencent.mm", function() end)
trigger.on_app_background("com.tencent.mm", function() end)
trigger.on_broadcast("android.intent.action.BOOT_COMPLETED", function() end)

trigger.on_log({tag="MyTag", keyword="WARN", debounce_ms=5000}, function(p)
  log.i("命中: " .. p.line)
end)

trigger.on_ble({preset="rotary_1", button=3, clicks=2}, function(p) end)
trigger.on_bluetooth({on=true}, function() end)
trigger.on_bt_device({mac="AA:BB:CC:DD:EE:FF", event="connect"}, function() end)
trigger.on_hard_key({code=24, action="pressed", clicks=2}, function(p) end)
trigger.on_geofence({name="家", mode="enter"}, function(p) end)

trigger.on_timer(60000, function() log.i("每分钟") end)
trigger.on_cron("08:30", function() log.i("早上 8:30") end)
trigger.on_sun({event="sunrise", offset=-30, cooldown_ms=60000}, function(p) end)
trigger.on_sun({event="sunset", offset=0}, function(p) end, {cooldown_ms=60000})

trigger.on_manual(function() log.i("手动触发") end)
trigger.on_automation("rule_id_or_name", function() log.i("规则触发了") end)

-- 通用参数: cooldown_ms / negate；on_sun 的 offset 单位是分钟，第三参可选兼容 cooldown_ms
-- 取消: trigger.off(handler_id)
```

#### 动作模块（35+ 种）

```lua
app.launch("com.tencent.mm")
app.kill("com.xxx"); app.background("com.xxx", true)
home.press(); voice_assistant.dismiss()

media.play_pause(); media.next(); media.previous()
media.volume("media", 80)            -- stream: media/ring/notification/alarm

audio.play("/sdcard/Music/x.mp3", {usage=11, repeat=true, repeat_count=3})
tts.speak("注意减速", {repeat_count=2})

broadcast.send("com.example.ACTION", {k1="v1", k2="v2"})
notification.show("标题", "内容")

ble.broadcast("AABBCC...")           -- hex
remote.send("钉钉/飞书消息文本")
webhook.post("https://...", "body")

automation.trigger("rule_id")        -- 触发某条自动化规则（深度限制 5）
automation.list()

mini_window.launch("com.tencent.mm")
system_mini_window.launch("com.tencent.mm")
display_mirror.start(2); display_mirror.stop()

-- 反向控制 widget / 悬浮窗
widget.on_press("widget_id", function() log.i("按钮被按") end)
float_btn.on_press("btn_id", function() log.i("浮窗按钮") end)
```

每个动作返回 `(ok, err)`。

### B.5 Web IDE — 浏览器实时调试

脚本页点击 "Web IDE" → 弹二维码 + URL（`http://<车机IP>:29999/debug/`）。手机/电脑浏览器打开。

四块布局：

- 顶栏：Lua/Frida 切换 / 脚本下拉 / ID 输入 / 加载/保存/运行/停止
- 左：编辑器（textarea，支持 Tab 缩进）
- 右：**模拟注入**。填 `vhal:VehicleSpeed = 80` 这种键值，运行时 `property.read` 命中 mock 直接返回；不填就用真实车机数据
- 底：日志（复制/清空/自动滚动/暂停）

保存直接落到本地脚本目录；脚本运行中车机端"活跃脚本"自动跟随并同步日志。

### B.6 脚本商店

脚本页点击 "脚本商店"。三子 tab：

- **浏览**：按类型、车型和关键词筛选；点 "下载" 写入本地脚本目录（Lua 出现在 Lua 列表，Frida 出现在 Frida 自定义列表）
- **我的上传**：列表 + 审核状态（reviewing / approved / private / rejected）；如果服务端启用了 AI 审核，还会显示风险等级和简短意见
- **上传**：选本地或粘贴 → 名称/版本/简介/权限 → 提交审核或隐私上传；署名默认使用内容商店顶部保存的"我的署名"

服务端管理员可以打开脚本源码进行人工审阅；AI 审核只给出风险意见，不会自动通过或上架脚本。

**⚠ 上传安全：** 脚本商店普通上传审核通过后公开可见，隐私上传不公开但仍可通过分享码分享。系统会自动检测这些模式并要求确认：

- `api_key` / `apikey`
- `secret` / `token` / `password`
- `Bearer xxx`
- GitHub token (`ghp_...`)
- OpenAI/Anthropic key (`sk-...`)
- AWS access key

**自动检测不保证 100%。最终责任在你。** 上传前建议：
1. grep 一遍源码，确认无密钥/token/手机号/家庭坐标
2. 用变量（`var.write`）或 storage 存敏感值，不写死在源码里
3. 不确定就别传

### B.7 调试技巧

- 一次性脚本（main 跑完即退）vs 常驻脚本（注册 trigger/on_change 自动留住）
- `sleep(N)` 100ms 切片，停止能立刻打断
- 控制台支持复制全部 / 清空 / 自动滚动开关 / 暂停（不抢焦点）
- 预设模块函数返回 `(nil, err)` 时会自动写入脚本日志，格式如 `[property.read] aidl backend not connected`
- 单脚本日志缓冲 2000 行，超出丢最早
- 单脚本崩溃自动停，不影响其他；并发上限 20 个
- 脚本停止后日志保留 60 秒供 Web IDE 拉取最终输出

---

*EVCC — 让你的车机更智能*
