Releases: damifan3/legadoPP
Release list
legado_app_beta_3.26.082023
更新内容
- [修复]:进入未缓存正文快速退出导致“正在下载”数量卡死及状态泄漏的问题
-
Bug现象:
一本书全本下载后,进入未缓存章节的正文页,如果还没缓存完就快速退出了正文页,就会一直显示正在下载:3,即使整本缓存结束,还是显示3。 -
核心修复 (Coroutine.kt):
修复了在协程被动取消(如scope.cancelChildren())时,onCancel清理回调因为上次commit新增的防御机制被错误丢弃的 Bug。
原因:原代码依赖job.invokeOnCompletion触发cancel()方法,但由于此时job.isCompleted必定为 true,导致被cancel()内部的安全检查直接拦截。
解决:在invokeOnCompletion监听到被动取消(CancellationException)时,绕开cancel()方法的生命周期拦截,直接派发执行清理闭包,确保僵尸任务得到妥善处理。
legado_app_beta_3.26.082023
更新内容
- [修复]:进入未缓存正文快速退出导致“正在下载”数量卡死及状态泄漏的问题
-
Bug现象:
一本书全本下载后,进入未缓存章节的正文页,如果还没缓存完就快速退出了正文页,就会一直显示正在下载:3,即使整本缓存结束,还是显示3。 -
核心修复 (Coroutine.kt):
修复了在协程被动取消(如scope.cancelChildren())时,onCancel清理回调因为上次commit新增的防御机制被错误丢弃的 Bug。
原因:原代码依赖job.invokeOnCompletion触发cancel()方法,但由于此时job.isCompleted必定为 true,导致被cancel()内部的安全检查直接拦截。
解决:在invokeOnCompletion监听到被动取消(CancellationException)时,绕开cancel()方法的生命周期拦截,直接派发执行清理闭包,确保僵尸任务得到妥善处理。
legado_app_beta_3.26.081715
更新内容
- [修复 优化]:修复离线缓存界面,单本下载取消后 CacheBookService 通知栏有时无法正常关闭的 Bug;修复缓存任务列表未及时清理引起的内存泄漏,及结束时的异常取消问题
内存泄漏和协程竞态问题修复
(首先补充大量了对僵尸任务 (ZombieTask) 的日志打点,方便后续排查生命周期问题。)
a. 修复离线缓存界面,单本下载取消后 CacheBookService 通知栏有时无法正常自动关闭的 Bug
Bug 现象:
同时下载多本书籍时,如果在离线缓存界面通过点击列表单独取消书籍(暂停),当取消到最后一本时,有时通知栏无法消失,并死卡在“正在下载:0|等待中:0|失败:0|成功:X(历史累计成功数)”的状态。
根本原因:
- 触发单本取消 (
IntentAction.remove) 时,内部调用CacheBookModel.stop(),其通过tasks.clear()异步取消下载协程。 - 由于协程的 cancel 回调是异步执行的,此时同步代码往下走,
onDownloadSet(正在下载集合)并未立即清空。 - 同步触发的
onFinally()因onDownloadSet不为空,拒绝将该书从cacheBookMap中移除。 - 导致外层
CacheBookService的if (cacheBookMap.isEmpty())判定为 false,完美错失了调用stopSelf()的唯一时机。 - 服务变成“僵尸进程”,其内部轮询持续读取未清零的
successDownloadSet历史数据,并不断刷新通知栏。
(此时点击取消可以正常销毁通知)
修复逻辑:
CacheBookModel.stop() 中加入onDownloadSet.clear()。确保即使单本停止时也同步清空运行队列,让后续的 onFinally() 能立即将书籍踢出 cacheBookMap,从而顺利触发 stopSelf() 销毁服务。
b. 修复缓存任务列表未及时清理引起的内存泄漏,及结束时的异常取消问题
问题背景:
当我们在进行书籍缓存下载时,会在后台输出大量 Coroutine.cancel() 和 onCancel() called 日志。特别是在停止缓存服务(如接收到 IntentAction.stop 停止广播)时,会瞬间对所有历史成功完成的任务再次调用取消并打印错误堆栈。这暴露出任务管理上的内存泄漏和底层协程框架的方法缺陷。
修复详情:
-
修复
CacheBook.kt中的内存泄漏:
在CacheBookModel中启动章节下载时,每个下载协程都会通过tasks.add被加入CompositeCoroutine中保存。但任务自然结束(成功/失败)后,缺少移除逻辑,导致tasks随下载章节无限膨胀。- 修改方案:使用
.also { coroutine -> ... }取代原有的.apply { ... }和.let { ... }链式调用。在确保明确的coroutine变量引用的前提下,在协程自带的.onFinally { ... }生命周期回调中加入tasks.remove(coroutine)。保证每一个任务在执行生命周期终了时都能将自己移出缓存管理队列。 - 采用
tasks.delete(coroutine)而不是tasks.remove(it),避免因remove内部的联动cancel()触发了onCancel回调,从而把该章节错误地塞回waitDownloadSet产生死循环。
- 修改方案:使用
-
修复
Coroutine.kt的取消设计缺陷:
修改自定义协程封装Coroutine.kt中的cancel()方法。之前该方法缺少对生命周期的把控,只要被调用就会无条件触发内部的onCancel回调。导致原本的错误内存泄漏下,如CompositeCoroutine.clear()等批量清理方法误杀早已结束的无辜任务。- 修改方案:在
cancel()方法头部加入if (job.isCompleted) return拦截。当探测到目标底层Job已经执行结束时,阻断取消回调,并且打印异常调用的追踪日志 (ZombieTask Log: Coroutine.Cancel() 错误调用...) 进行监控。
- 修改方案:在
legado_app_beta_3.26.081321
更新内容
- [修复]:彻底解决 GitHub Releases 页面 beta 版本排序置底的问题(上两次 commit 是错误的)
- 问题背景:之前发现
beta标签即使使用了空 Commit 或伪造的 2038 年时间戳,也始终排在beta-xxx后面(置底)。 - 根本原因:查阅数据后确认,GitHub Releases 页面在处理带有
beta等相似前缀的标签时,会强制使用 SemVer(语义化版本)或字母降序排列,而忽略时间戳。在字符串比对规则中,beta-xxx永远大于单纯的beta,因此beta永远被压在最底下。 - 解决方案:
- 修改历史版本的 tag 命名,由
beta-${{ env.VERSION }}改为archive-beta-${{ env.VERSION }}。在首字母比对中(a < b),archive-beta会自然排在beta之后,从而让beta顺利登顶。 - 同步更新
Delete All Previous Beta Releases清理脚本,使其能够同时识别并清理旧的beta-与新的archive-beta-标签。 - 移除了此前无效的
git commit --allow-empty与伪造时间的逻辑代码,恢复为最纯粹的标签覆盖。
- 修改历史版本的 tag 命名,由
legado_app_3.26.072411
更新内容
2026.07.24
🎧 有声书及音频功能 (Audio & Audiobooks)
- [功能] 新增了有声书离线缓存与本地播放的全面支持。
- [功能] 完善了本地有声书的导入及播放相关功能。
- [功能] 在有声书播放页新增了“下载缓存”按钮。
- [功能] 缓存迁移 (
migrateTocCache) 逻辑已适配有声书。 - [优化] 优化了有声书下载超时机制(5分钟重试),同时“点击取消”不再计入重试次数,减少无谓报错。
- [优化] 针对有声书下载突然终止的情况,增加了临时 (
tmp) 文件的垃圾回收处理。 - [修复] 修复了有声书最后一章点击“下一曲”时通知栏消失,以及“上一曲”模式判定的相关问题。
- [修复] 引入防抖机制,修复了有声书快速切换章节时,系统通知栏标题未及时更新的问题。
- [修复] 修复了在音频播放过程中删除书籍,音频仍继续播放的异常情况。
- [修复] 优化了有声书切换章节时的同步逻辑(使用同步的
durChapterIndex替代异步获取),解决了偶尔出现的暂停问题。
📖 界面交互与阅读体验 (UI & Experience)
- [功能] 在书籍详情页底部新增了缓存操作入口(兼容横屏布局)。
- [功能] 在缓存页面新增了可视化进度条。
- [功能] 文字书正文页右上角菜单中新增了“复制章节 URL”功能。
- [优化] 刷新书籍目录时,排除了之前已有缓存带来的影响。
- [优化] 软件生成的自动任务通知机制优化,改为通过修改
defaultTpl模板处理,而非直接强行拼接内容。 - [修复] 修复了书籍导入完成后,界面左下角的选中数量没有清空,且右下角按钮状态没有重置的问题。
legado_app_3.26.071111
更新内容
2026.07.11
- [优化]:书籍详情页右上角定时任务快捷入口改进
- [优化]:自动任务解析的健壮性提高:url中含有分号等
- [功能 优化]:本地缓存迁移:增加章节名md5匹配,增加本地缓存文件md5直接匹配的逻辑
- [优化]:修复自动任务刷新目录时没有缓存自动迁移的问题;
refreshToc方法中直接加入migrateTocCache方法,覆盖本地(除txt)和在线书籍 - [修复]:将缓存行为改成懒加载,防止协程竞态导致任务栏通知无法关闭的问题
- [修复]:为自动任务注册专用的通知渠道,修复应用通知管理中不显示自动任务的问题
legado_app_3.26.061620
更新内容
2026.06.16
- [功能]:成功移植定时任务功能
- [修复]:修复使用 url 判断是否是新章节,而不是绝对index,并修复缓存等逻辑,防止章节进出小黑屋导致新章节识别和数量信息混乱
- [功能 修复]:实现书籍目录和章节名变动时的本地缓存自动重命名,防止缓存失效;并优化目录刷新逻辑,避免底层级联删除问题
- [功能]:书源编辑界面迁移快捷导航功能;将快捷导航栏提取为可复用组件