【数据完整性加固 - 三层防护】
## 问题背景
虽然前一版本已添加完整性验证,但存在两个可能导致误报成功的边缘情况:1. 流创建失败但未明确检测
2. 文件写入 0 字节但未专门检查
## 修复内容
### 1. 显式流创建检查```kotlin// 修复前(Elvis 运算符隐式检查,可读性差)
context.contentResolver.openOutputStream(uri)?.use { ... } ?: throw Exception(...)
// 修复后(显式检查,逻辑清晰)
val outputStream = context.contentResolver.openOutputStream(uri)
?: throw Exception("无法创建输出流 - 可能是权限问题或存储已满")
outputStream.use { ... }
```
### 2. 三层验证机制
```kotlin
// 第1层:检查文件是否为空(0字节)
if (writtenContent.isEmpty()) {
throw Exception("文件为空 (0 字节) - 写入失败")
}
// 第2层:检查长度是否匹配
if (writtenContent.length != json.length) {
throw Exception("文件长度不匹配: 期望 ${json.length}, 实际 ${writtenContent.length}")
}
// 第3层:检查内容是否完全一致if (writtenContent != json) {
throw Exception("文件内容校验失败 - 数据损坏")
}
```
## 防护场景
| 场景 | 检测方式 | 用户反馈 |
|------|----------|----------|
| **流创建失败** | Elvis 抛异常 | "无法创建输出流" |
| **0 字节写入** | isEmpty() 检查 | "文件为空 (0 字节)" |
| **部分写入** | 长度比对 | "文件长度不匹配" |
| **数据损坏** | 内容比对 | "文件内容校验失败" |
## 原子性保证
```
✅ 成功路径:写入完整 → 验证通过 → "备份文件已保存并验证成功"
❌ 失败路径:任何异常 → 删除文件 → "保存失败: [具体原因]"
```
## 验证
编译成功:✅ BUILD SUCCESSFUL in 21s
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| libs | ||
| src/main | ||
| build.gradle.kts | ||
| proguard-rules.pro | ||