主要观点:
- 讲述一款被数十亿用户使用的消息应用程序,遵循强隐私模式,用户数据不在服务器留存,通信端到端加密。
- 安卓用户常卸载重装应用,为防止丢消息,消息备份到用户 SD 卡,因 SD 卡为公共存储空间,备份需加密。
- 突然出现用户抱怨消息恢复失败,虽有内部指标确认但需样本调试,样本加密正常但 SQLite 数据库损坏,包括主键约束违反和错误 Unicode 字符等,低端安卓手机易出现数据库损坏。
- 通过反复阅读 SQLite Shell 手册,发现可将数据库转储为忠实重现数据库的 SQL 命令序列,最终决定牺牲少量坏消息以恢复其他所有消息,通过识别并删除坏行来实现,流程为用户先尝试正常恢复,失败后进行一系列操作,如使用 SQLite Shell 转储和恢复数据库,且该修复层代码约 200 行已安装在数十亿设备上。
关键信息:
- 应用程序的隐私模式和数据存储方式。
- 安卓用户的行为及消息备份机制。
- 数据库损坏的情况及表现。
- 解决数据库损坏的方法和过程。
重要细节:
- Android 安全模型中 SD 卡为公共存储空间。
- 数据库损坏在低端安卓手机上较常见。
- 通过 SQLite Shell 手册找到解决办法,如使用
.bail off
命令。 - 最终修复过程的具体步骤和代码片段。
- 修复后对数据库的测试结果,大部分用户仅丢失少量消息且大部分数据库得以恢复。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。