zijunchiang
8ad2aa50d7
V1.4.2: 修复极米 H1S(Android 5.1.1) 一打开就闪退 —— 存储根目录写死导致
真正根因(用崩溃诊断包在该机上逐步定位得出,非此前推测的 API 守卫问题):
- AppPaths 把存储根写死成 /storage/emulated/0/MaidongKTV,该机上此路径不可写,
ensureDirectories() 里 check(it.exists() || it.mkdirs()) 抛异常 →
onCreate 中断 → App 一打开就闪退(该机历来所有版本均如此)。
- 定位过程: 逐条语句打启动轨迹 + 把异常直接写进轨迹通道,最终锁定
「oc431 之后、oc432 之前」= AppPaths.ensureDirectories();包上 try/catch 后
App 立即可正常打开,确认根因。
修复:
- AppPaths 改为运行时解析可写根目录: Environment 外部根 → 历史硬编码路径 →
getExternalFilesDir() → filesDir,取第一个「可建且可写」的(幂等 init)。
- AppPaths.init(context) 在 KtvApplication.attachBaseContext 最前面调用,
早于任何 AppPaths 访问;路径成员由 val 改为 getter。
- ensureDirectories() 不再抛异常,返回 Boolean;MainActivity 拿到 false 只告警继续。
- 去掉编译期内联的路径常量: MuseDatabase.VIDEO_ROOT(const→getter)、
defaultDbFile()/findDatabaseFile() 改用 AppPaths.databaseFile
(否则改存储根后 DB 仍指向硬编码路径)。
- 用户可见的目录提示文案改用 AppPaths.*Dir.absolutePath。
- 启动上报一行 STORAGE root=.. by=.. envState=.. probe=[..] 到远程日志,
便于排查不同盒子的存储差异。
验证:
- DEX 中「内联的完整 DB 路径」由 1 处 → 0 处。
- 单元测试 2/2 通过;lint NewApi 闸门通过;签名证书不变(可覆盖 1.4.0/诊断包)。
- AGENTS.md 增补「存储根目录必须运行时解析」条目。
说明: versionCode 18~21 被本机临时诊断包占用,本版取 22 以便直接覆盖安装。
2026-09-26 15:53:22 +08:00
..
2026-09-04 21:23:21 +08:00
2026-09-26 15:53:22 +08:00
2026-09-26 15:53:22 +08:00
2026-09-04 21:23:21 +08:00