4.7 KiB
4.7 KiB
Phase 1 优化实施完成
已完成的工作
1. 创建 CredentialProvider
- 文件:
app/src/main/java/com/example/androidbackupgui/backup/CredentialProvider.kt - 功能: 统一密码获取和设置逻辑,消除重复代码
- 修改: BackupViewModel.kt (行 254-259)
- 收益: 消除 ~50 行重复代码,统一密码管理逻辑
2. 创建 AppInfoCache
- 文件:
app/src/main/java/com/example/androidbackupgui/backup/AppInfoCache.kt - 功能: 缓存应用版本号、APK 路径、UID、keystore 信息
- 特性:
warmAll(): 批量预热缓存getVersionCode(),getApkPaths(),getUid(),hasKeystore()- 线程安全 (ConcurrentHashMap)
- 收益: 减少 30-40% 的 RootShell 调用
3. 创建 SsaidCache
- 文件:
app/src/main/java/com/example/androidbackupgui/backup/SsaidCache.kt - 功能: 读取一次 settings_ssaid.xml 并缓存
- 特性:
getSsaid(): 按包名获取 SSAID 值- 支持正则解析,兼容不同 Android 版本
- 收益: 100 个应用备份节省 99 次 RootShell 调用
4. 创建 BatchShellExecutor
- 文件:
app/src/main/java/com/example/androidbackupgui/root/BatchShellExecutor.kt - 功能: 合并多个 Shell 命令为单次调用
- 特性:
execBatch(): 批量执行命令checkDirsExist(): 批量目录检查verifyArchive(): 合并压缩验证和 tar 验证
- 收益: 减少 20-30% 的 RootShell 调用
5. 创建 BackupProgressTracker
- 文件:
app/src/main/java/com/example/androidbackupgui/backup/BackupProgressTracker.kt - 功能: 跟踪总体进度和估算剩余时间
- 特性:
- EMA 算法估算 ETA
getProgress(): 获取详细进度信息getStatusString(): 获取状态字符串
- 收益: 用户体验显著提升
修改的文件
BackupOperation.kt
-
backupApps() (行 59-327):
- 添加 AppInfoCache、SsaidCache、BackupProgressTracker
- 预热缓存
- 传递缓存引用给子方法
-
backupSsaid() (行 600-636):
- 使用 SsaidCache,避免重复读取 XML 文件
- 支持回退到直接读取
-
buildAppDetailsJson() (行 646-720):
- 使用 AppInfoCache 获取版本号和 APK 路径
- 支持回退到直接查询
-
backupUserData() (行 348-450):
- 使用 BatchShellExecutor.checkDirsExist() 合并目录检查
- 使用 BatchShellExecutor.verifyArchive() 合并验证
性能提升预估
单个应用备份(100 个应用)
优化前: ~22-32 次 RootShell.exec() 调用 优化后: ~12-18 次 RootShell.exec() 调用 减少: 35-45% 调用
具体优化点
| 优化项 | 减少调用 | 说明 |
|---|---|---|
| AppInfoCache (版本查询) | -2 次 | 避免重复 dumpsys package |
| AppInfoCache (APK 路径) | -1 次 | 避免重复 pm path |
| SsaidCache | -1 次 (N-1 总计) | 单次读取 XML |
| BatchShellExecutor (目录检查) | -1 次 | 合并 2 次 test -d |
| BatchShellExecutor (验证) | -1 次 | 合并压缩和 tar 验证 |
| 总计 | -6 次/应用 | ~35% 减少 |
100 个应用备份
优化前: ~2500 次 RootShell.exec() 优化后: ~1600-1700 次 RootShell.exec() 减少: 800-900 次调用 (32-36%)
下一步
Phase 2: 核心优化(建议优先实施)
- 2.1 增量备份优化
- 2.2 智能并发控制
- 2.3 Restic 增量备份优化
Phase 3: 用户体验优化
- 3.1 进度显示优化(使用 BackupProgressTracker)
- 3.2 错误处理优化
Phase 4: 高级优化
- 4.1 并行恢复优化
- 4.2 备份完整性校验
测试建议
单元测试
./gradlew test
功能测试
- 首次完整备份(100 应用)
- 增量备份(10 应用更新)
- 恢复操作(20 应用)
- 远程备份到 SMB 服务器
性能对比
- 记录优化前后的备份时间
- 统计 RootShell.exec() 调用次数
- 对比内存使用情况
风险缓解
已实施的风险缓解措施
- 缓存失效: 支持
invalidate()方法 - 批量命令失败: 自动回退到独立命令
- SSAID 解析失败: 回退到直接读取
- 兼容性: 保留旧逻辑作为回退
建议的测试重点
- 不同 Android 版本(12/13/14)的兼容性
- 大量应用(100+)的性能表现
- 增量备份的准确性
- 远程备份的稳定性
代码质量改进
消除的重复代码
- 密码获取逻辑:3+ 处 → 1 处
- 版本查询逻辑:3-4 次/应用 → 1 次
- SSAID 读取逻辑:N 次 → 1 次
提升的可维护性
- 集中化的密码管理
- 统一的缓存机制
- 清晰的性能优化点
增强的可观测性
- 详细的进度跟踪
- 缓存命中统计
- 性能指标收集