Releases: th2006464/ShadowSleuth
Releases · th2006464/ShadowSleuth
Release list
v1.3.3 - dHash 内存修复 + 搜索页 UI 优化
v1.3.3 更新内容
修复
- dHash 大量图片崩溃:15000 张照片 dHash 扫描完成后崩溃(OOM)
- 重写
findDuplicatesByDHashBatched,去掉候选对预存储(旧版 ~1GB → OOM) - 改为流式比较:遍历每张图时从桶索引临时捞候选 → 立即比较 → 丢弃
- 内存占用从 ~1GB 降至 ~10MB
- 重写
优化
computeBatch并发数 16→8,Bitmap 解码用 RGB_565(内存减半)ScanState合并逻辑简化,避免大列表双重遍历- 搜索页 dHash 按钮缩小并移至样本图片右上角,更简洁美观
v1.3.2
v1.3.1
v1.3.0
v1.3.0 - dHash 分桶索引性能优化
重大性能提升
15000 张照片的 dHash 扫描从"卡死"变为"秒级完成":
- 分桶索引算法: 将 64-bit hash 拆为 8x8-bit 多级索引,
候选比较次数从 O(n^2) 约1.12亿降至约50万次, 速度提升约200倍 - 消除双重 openInputStream: 复用 MediaStore 已知宽高,
节省15000次跨进程文件打开 - 并发控制: 信号量限制同时解码数(默认16), 避免 OOM
- 不阻塞主线程: 分桶+汉明距离比较在 Dispatchers.Default 运行
- 支持取消: 定期 yield(), 用户可随时中断扫描
其他改进
- 批量计算 computeBatch() 使用结构化并发
- 协程取消时优雅退出, 不误报错误
- 默认并发上限16(平衡速度与内存)
v1.2.4 - 扫描结果页面也添加序号显示
v1.2.4 - 扫描结果页面也添加序号显示
🐛 修复
- 扫描结果页面也显示序号:如
1/30表示 30 个结果中的第 1 个 - 之前只在搜索结果页面有序号,现在两个页面都一致了
📝 变更
ResultsScreen.kt:改用itemsIndexed,传递index/total参数- 更新版本号至 1.2.4(versionCode 15)
下载后请在手机上允许「安装未知应用」权限。
v1.2.3 - 移除滚动条,改用序号显示
v1.2.3 - 移除滚动条,改用序号显示
🐛 修复
- 移除搜索结果页面的滚动条:原实现有 bug,滚动时滚动条不更新
- 改用序号显示进度:如
1/30表示 30 个结果中的第 1 个
📝 变更
SearchScreen.kt:移除滚动条代码,改用itemsIndexedDuplicateGroupCard.kt:添加index/total参数,标题前显示序号- 更新版本号至 1.2.3(versionCode 14)
下载后请在手机上允许「安装未知应用」权限。
v1.2.2 - 滚动条修复 + dHash 优化 + 删除权限二次确认
v1.2.2 - 滚动条修复 + dHash 性能优化 + 删除权限二次确认
🐛 修复
- 修复搜索结果页面滚动条不显示的问题:改用
Canvas绝对定位实现滚动条,确保可见 - 修复导航按钮失效:替换已弃用的
findStartDestination()API,改用 route 字符串
⚡ 优化
- dHash 计算性能大幅提升:新增
computeFast()方法,使用inSampleSize直接加载缩小图,速度提升 5-10 倍 - 并行计算 dHash:使用 Kotlin 协程并行处理,15000 张照片扫描时间从 10-15 分钟降至 1-3 分钟
- 复用 dHash 缓存:点击 dHash 搜索时优先使用已计算的缓存,避免重复计算
🔒 安全增强
- 删除权限改为可选开关(默认关闭):使用 DataStore 持久化用户选择
- 自定义二次确认弹窗:删除操作使用与 APP 风格一致的
SsDialog,不再使用系统弹窗 - 移除
MANAGE_EXTERNAL_STORAGE自动请求:改为用户可选手动授权,保护隐私
📝 其他
- 更新关于页面字符串资源
- 新增
AppPreferences.kt管理 DataStore 偏好设置 - 版本号升级至 1.2.2(versionCode 13)
下载后请在手机上允许「安装未知应用」权限。
v1.2.1-debug
v1.2.1-debug — Bug 修复
dHash 标签
- dHash 结果组标题改为显示 dHash 值(如
dHash: 3A2BC4D5...),而非文件名 - DuplicateGroup 新增 dHashValue 字段
搜索页滚动条
- 搜索结果列表右侧新增滚动进度条,直观了解滚动位置
dHash 缓存复用
- 搜索样本图片时优先从现有缓存读取 dHash,避免重复计算
- 缓存容量和创建时间同步更新
底部导航修复
- 修复扫描按钮在结果页下滑后无反应的导航问题
v1.2.0-debug
v1.2.0-debug — UI 改进
筛选按钮改名
- 结果页 FilterChip「文件名相同」→「名称相同」
- 结果页 FilterChip「文件大小相同」→「容量相同」
- 匹配组副标题同步更新
搜索页滚动条
- 搜索结果列表右侧新增半透明滚动进度条
- 直观了解当前滚动位置
dHash 缓存详情
- 关于页显示缓存占用容量(自动格式化为 B/KB/MB)
- 显示上次缓存创建时间
搜索样本图缩小
- 搜索页右下角样本图片从 140dp 缩小到 88dp
Bug 修复
- SsComponents.kt 中 ripple() → rememberRipple() 编译错误
v1.1.0-debug: 更新 Logo 图标 + dHash 缓存管理
v1.1.0-debug
新增功能
- 更换 App 图标:使用新 Logo,去除白色圆角背景,保留核心图像内容
- dHash 缓存管理:右上角「关于」弹窗新增缓存信息卡片,显示已缓存图片数量及内存占用估算
- 清空缓存按钮:支持一键清空 dHash 哈希缓存,清空后可重新触发 dHash 扫描
说明
- dHash 缓存(
Map<Long, Long>)存于内存,每张图约 8 字节,1000 张约 8KB - 清空缓存后,再次点击「dHash 相似扫描」将重新计算所有图片哈希
版本
- versionCode: 10 / versionName: 1.1.0