# 凯迪拉克联屏 · APK 仪表盘与主题文件提取包

从 `凯迪28版本.apk`、`yibiao.apk` 两个安装包里直接抽出的原始文件 + 解析结果。
**没有做任何改写**，二进制与 APK 内完全一致（见 `index.json` 里的 sha1）。

## 目录

```
apk-assets/
├─ cluster-yibiao/                  左侧仪表盘（yibiao.apk，com.ct5.dashboard）
│  ├─ themenone.kzb                 原始 Kanzi 主题包，1860 B，唯一真正可用的主题文件
│  ├─ themenone_unpacked/           KZB 拆包结果：12 个条目 + 字符串表 + _manifest.json
│  ├─ theme-spec.json               主题语义规格（消息类型、18 个属性名、激活协议）
│  ├─ AndroidManifest.xml           原始二进制 manifest
│  ├─ AndroidManifest.txt           解析后的明文
│  ├─ app.json                      包名/版本/入口 Activity/签名主体
│  ├─ signature.txt                 签名证书 subject
│  └─ res/                          ic_dashboard.xml（矢量仪表图标）+ 路径数据 + resources.arsc
└─ wallpaper-28/                    右侧副屏壁纸（凯迪28版本.apk，uni.app.UNIF50B59F）
   ├─ libct5paper.so                原生壁纸落盘模块，686 KB —— 全部协议都在这里
   ├─ js/app-service.js             业务逻辑（389 KB，未混淆）
   ├─ app-config.js / -service.js   后台域名与运行时配置
   ├─ protocol.json                 抽出来的落盘路径、返回字段、卡片守护命令
   ├─ uni-manifest.json             uni-app 配置
   └─ static/                       包内自带的预览图与 logo
```

## 两个包的定位

| | yibiao.apk | 凯迪28版本.apk |
|---|---|---|
| 包名 | `com.ct5.dashboard` | `uni.app.UNIF50B59F` |
| 名称 | 凯迪仪表 | 凯迪壁纸 |
| 版本 | 0.3.1 | 1.0.28 (114) |
| 管哪块屏 | 左侧仪表 | 右侧副屏 |
| 技术栈 | Kanzi 主题包 + 360 加固壳 | uni-app + UTS 原生插件 |
| 主题载体 | `themenone.kzb` | 目录落盘的图片文件 |

## 关键事实

**1. `themenone.kzb` 是空壳模板，不是成品主题。**
拆开后 12 个条目里，`theme_dark`、`theme_light`、`DefaultValues` 三块**都是 20 字节全零**，sha1 完全相同。它只声明了结构（Screen 节点、资源字典挂载点、启动 Prefab）和主题切换的消息通路，没有任何颜色/数值内容。这也是它只有 1860 字节的原因 —— 一份完整仪表主题包正常在几百 KB 到几 MB。

**2. 主题激活走 Kanzi 消息，不走广播。**
`$property_dictionary` 里第 17 项就是参数键：
`MessageArgument.Screen.ActivateThemeMessageArguments.Theme`，配合 `Message.Screen.ActivateTheme` 使用，取值对应 `/Themes/Theme/` 下的子节点名（`theme_dark` / `theme_light`）。资源引用统一写成 `kzb://themenone/...`。

**3. 18 个可写属性（做主题时照这个清单填）：**
```
Node.Locale            Screen.ClearColor        Screen.HostName
Window.Height          Window.MetricsType       Window.Orientation
Window.Width           Node2D.BackgroundBrush   Page.AutoActivate
PageHost.DefaultSubPage  PageHost.LoopSubPages  PageHost.Transitions
Action.Delay           DispatchMessageAction.DispatchMode
DispatchMessageAction.RoutingTarget
DispatchMessageAction.RoutingTargetLookup
MessageType            MessageArgument.Screen.ActivateThemeMessageArguments.Theme
ResourceDictionarySelector.SelectedDictionary
```

**4. 仪表 APK 的核心代码读不出来。**
`classes.dex` 只有 533 KB，入口是 `com.stub.StubApp`，配 5 个 `libjiagu*.so` —— 360 加固。真正的业务逻辑在运行时解密，静态拿不到。**但主题系统不需要它**：主题由车机自带的 Kanzi 运行时加载，APK 只负责把 `.kzb` 放到位、发消息。

**5. 签名是研究证书，不是原厂证书。**
`C=CN, O=CT5 Research, CN=CT5 Theme Controller Research Debug`。这说明 `yibiao.apk` 本身就是第三方研究者重打包的产物，不是凯迪拉克/泛亚官方签名。所以它拿不到系统签名权限，装车需要 root 或预装位。

**6. 壁纸落盘要写三处，副屏在 user 10。**
```
/var/paper/<id>/
/sdcard/Download/paper/<id>/
/storage/emulated/10/Download/paper/<id>/
```
`emulated/10` 是副屏独立用户空间，只写主用户目录只有半边生效。`libct5paper.so` 返回字段里有 `refreshAfterTimeout`、`noVisibleRefresh`、`%s failed to broadcast` —— 原生作者踩过刷新生效的竞态，做了超时兜底。

## 怎么用

- **只想换仪表主题**：拿 `themenone.kzb` 当模板改，保持 `$property_dictionary` 的顺序不动，往 `theme_dark`/`theme_light` 里写值，包名同步改（`kzb://` 前缀要一起换）。
- **想接进后台**：`themenone.kzb` 已经在 `ct.l5588.cn` 后台登记为左侧仪表样例主题，`install_mode` 走 KZB 流程；`wallpaper-28` 的 `protocol.json` 就是落盘参数表。
- **想复用壁纸模块**：`libct5paper.so` 依赖 uni-app 的 UTS 运行时（`uts-native-kit`），不能直接给普通 Android 工程用，但 `protocol.json` 里的路径和命令可以直接照搬。

## 来源与校验

- 提取自 `C:\Users\dxlm5\Desktop\yibiao.apk`、`C:\Users\dxlm5\Desktop\凯迪28版本.apk`
- 每个文件的 sha1 与字节数见 `index.json`
- KZB 解析器：`_re/kzb_unpack.py`（独立脚本，可复用于其它 Kanzi 包）
