Some checks failed
Android CI Build / check (push) Has been cancelled
Android CI Build / package-apks (push) Has been cancelled
Docs Deploy / build (push) Has been cancelled
Module Market Check / Validate modules/ (push) Has been cancelled
Module Market Publish / Generate submissions.json (push) Has been cancelled
Docs Deploy / deploy (push) Has been cancelled
- Package rename com.webtoapp -> br.com.drukstech.codeapp - Product rename WebToApp/web-to-app -> DruksCode/drukscode - Design system Wta* -> Dkc* - applicationId br.com.drukstech.codeapp (.play for gplay flavor) - rootProject.name DruksCode - Fresh git history (upstream kept as remote for sync)
50 lines
2.3 KiB
Markdown
50 lines
2.3 KiB
Markdown
# 配置字段漂移
|
|
|
|
DruksCode 中最常见的静默失败:某功能预览正常,却在导出的 APK 中被悄悄跳过,原因是配置字段名在导出工厂和 shell 配置类之间发生了漂移。
|
|
|
|
## 为什么会发生
|
|
|
|
shell 用 **Gson** 读取配置,而 Gson 会**静默丢弃**未知或缺失的字段 —— 没有异常,没有日志。因此,如果导出工厂写入的 JSON 键与 shell 配置字段上的 `@SerializedName` 不完全匹配,该功能就是……不运行,且毫无报错。
|
|
|
|
必须保持对齐的三样东西:
|
|
|
|
1. `ApkConfigJsonFactory.kt` 中的 payload 键(`"key" to value` 对)。
|
|
2. `ShellModeManager.kt` 的 shell 配置类中的 `@SerializedName("key")` 注解。
|
|
3. 它们所映射的 `ApkConfig` 字段。
|
|
|
|
## 门禁
|
|
|
|
有一个 CI 门禁自动检查这一点:
|
|
|
|
```bash
|
|
./gradlew :app:checkConfigFieldDrift --no-configuration-cache
|
|
# 或直接:
|
|
python3 scripts/check_config_field_drift.py
|
|
```
|
|
|
|
它从 `ApkConfigJsonFactory.kt` 解析出 payload 键,从 `ShellModeManager.kt` 解析出 `@SerializedName` 注解,然后报告任何不匹配(受 `scripts/config_field_drift_allowlist.json` 中的允许清单约束)。
|
|
|
|
**只要你改了配置字段就运行它。** 它是 Android CI `check` 任务的一部分。
|
|
|
|
## 诊断清单
|
|
|
|
当某功能"预览正常、导出失效"时,按此顺序检查:
|
|
|
|
1. shell 配置 JSON 在运行时真的包含该字段吗?
|
|
2. `ApkConfig` JSON 中的字段名与 shell 配置中的 `@SerializedName` 匹配吗?运行 `checkConfigFieldDrift`。
|
|
3. 运行时使用点是 shell 同步的(而非宿主专属)吗?
|
|
4. 特别针对去广告:确认 `adBlockEnabled` 映射、从缓存订阅重建宿主过滤器,以及导出规则编译时没有清掉宿主状态。
|
|
5. 同步改动后重建模板(陈旧模板是常见疏漏)。
|
|
|
|
## 添加一个影响生成 APK 的设置
|
|
|
|
追踪并更新**全部**:
|
|
|
|
1. 模型(`WebApp` / 嵌套配置)与编辑器 UI 绑定。
|
|
2. 导出映射(`ApkBuilder` / `ApkConfig` / `ApkConfigJsonFactory`)。
|
|
3. shell 配置类型(`ShellModeManager` / shell 配置数据类),如果运行时读取它们。
|
|
4. shell 同步代码中的运行时使用点。
|
|
5. 当开关变化时,为导出接线编写单元测试。
|
|
|
|
漏掉任何一步,通常会导致:编辑器显示开关、导出忽略它,或导出嵌入了运行时从不读取的配置。
|