Skip to content

Releases: damifan3/legadoPP

legado_app_beta_3.26.082023

Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Aug 15:15
0084585

更新内容

  • [修复]:进入未缓存正文快速退出导致“正在下载”数量卡死及状态泄漏的问题
  • 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Aug 15:15
0084585

更新内容

  • [修复]:进入未缓存正文快速退出导致“正在下载”数量卡死及状态泄漏的问题
  • 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

Pre-release

Choose a tag to compare

@github-actions github-actions released this 17 Aug 07:57
57ae22c

更新内容

  • [修复 优化]:修复离线缓存界面,单本下载取消后 CacheBookService 通知栏有时无法正常关闭的 Bug;修复缓存任务列表未及时清理引起的内存泄漏,及结束时的异常取消问题

内存泄漏和协程竞态问题修复

(首先补充大量了对僵尸任务 (ZombieTask) 的日志打点,方便后续排查生命周期问题。)

a. 修复离线缓存界面,单本下载取消后 CacheBookService 通知栏有时无法正常自动关闭的 Bug

Bug 现象:
同时下载多本书籍时,如果在离线缓存界面通过点击列表单独取消书籍(暂停),当取消到最后一本时,有时通知栏无法消失,并死卡在“正在下载:0|等待中:0|失败:0|成功:X(历史累计成功数)”的状态。

根本原因:

  1. 触发单本取消 (IntentAction.remove) 时,内部调用 CacheBookModel.stop(),其通过 tasks.clear() 异步取消下载协程。
  2. 由于协程的 cancel 回调是异步执行的,此时同步代码往下走,onDownloadSet(正在下载集合)并未立即清空。
  3. 同步触发的 onFinally()onDownloadSet 不为空,拒绝将该书从 cacheBookMap 中移除。
  4. 导致外层 CacheBookServiceif (cacheBookMap.isEmpty()) 判定为 false,完美错失了调用 stopSelf() 的唯一时机。
  5. 服务变成“僵尸进程”,其内部轮询持续读取未清零的 successDownloadSet 历史数据,并不断刷新通知栏。
    (此时点击取消可以正常销毁通知)

修复逻辑:
CacheBookModel.stop() 中加入onDownloadSet.clear()。确保即使单本停止时也同步清空运行队列,让后续的 onFinally() 能立即将书籍踢出 cacheBookMap,从而顺利触发 stopSelf() 销毁服务。

b. 修复缓存任务列表未及时清理引起的内存泄漏,及结束时的异常取消问题

问题背景:
当我们在进行书籍缓存下载时,会在后台输出大量 Coroutine.cancel()onCancel() called 日志。特别是在停止缓存服务(如接收到 IntentAction.stop 停止广播)时,会瞬间对所有历史成功完成的任务再次调用取消并打印错误堆栈。这暴露出任务管理上的内存泄漏和底层协程框架的方法缺陷。

修复详情:

  1. 修复 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 产生死循环。
  2. 修复 Coroutine.kt 的取消设计缺陷:
    修改自定义协程封装 Coroutine.kt 中的 cancel() 方法。之前该方法缺少对生命周期的把控,只要被调用就会无条件触发内部的 onCancel 回调。导致原本的错误内存泄漏下,如 CompositeCoroutine.clear() 等批量清理方法误杀早已结束的无辜任务。

    • 修改方案:在 cancel() 方法头部加入 if (job.isCompleted) return 拦截。当探测到目标底层 Job 已经执行结束时,阻断取消回调,并且打印异常调用的追踪日志 (ZombieTask Log: Coroutine.Cancel() 错误调用...) 进行监控。

legado_app_beta_3.26.081321

Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Aug 13:20
f25d973

更新内容

  • [修复]:彻底解决 GitHub Releases 页面 beta 版本排序置底的问题(上两次 commit 是错误的)
  • 问题背景:之前发现 beta 标签即使使用了空 Commit 或伪造的 2038 年时间戳,也始终排在 beta-xxx 后面(置底)。
  • 根本原因:查阅数据后确认,GitHub Releases 页面在处理带有 beta 等相似前缀的标签时,会强制使用 SemVer(语义化版本)或字母降序排列,而忽略时间戳。在字符串比对规则中,beta-xxx 永远大于单纯的 beta,因此 beta 永远被压在最底下。
  • 解决方案:
    1. 修改历史版本的 tag 命名,由 beta-${{ env.VERSION }} 改为 archive-beta-${{ env.VERSION }}。在首字母比对中(a < b),archive-beta 会自然排在 beta 之后,从而让 beta 顺利登顶。
    2. 同步更新 Delete All Previous Beta Releases 清理脚本,使其能够同时识别并清理旧的 beta- 与新的 archive-beta- 标签。
    3. 移除了此前无效的 git commit --allow-empty 与伪造时间的逻辑代码,恢复为最纯粹的标签覆盖。

legado_app_3.26.072411

Choose a tag to compare

@github-actions github-actions released this 29 Jul 09:58
b4964ff

更新内容

2026.07.24

🎧 有声书及音频功能 (Audio & Audiobooks)

  • [功能] 新增了有声书离线缓存与本地播放的全面支持。
  • [功能] 完善了本地有声书的导入及播放相关功能。
  • [功能] 在有声书播放页新增了“下载缓存”按钮。
  • [功能] 缓存迁移 (migrateTocCache) 逻辑已适配有声书。
  • [优化] 优化了有声书下载超时机制(5分钟重试),同时“点击取消”不再计入重试次数,减少无谓报错。
  • [优化] 针对有声书下载突然终止的情况,增加了临时 (tmp) 文件的垃圾回收处理。
  • [修复] 修复了有声书最后一章点击“下一曲”时通知栏消失,以及“上一曲”模式判定的相关问题。
  • [修复] 引入防抖机制,修复了有声书快速切换章节时,系统通知栏标题未及时更新的问题。
  • [修复] 修复了在音频播放过程中删除书籍,音频仍继续播放的异常情况。
  • [修复] 优化了有声书切换章节时的同步逻辑(使用同步的 durChapterIndex 替代异步获取),解决了偶尔出现的暂停问题。

📖 界面交互与阅读体验 (UI & Experience)

  • [功能] 在书籍详情页底部新增了缓存操作入口(兼容横屏布局)。
  • [功能] 在缓存页面新增了可视化进度条。
  • [功能] 文字书正文页右上角菜单中新增了“复制章节 URL”功能。
  • [优化] 刷新书籍目录时,排除了之前已有缓存带来的影响。
  • [优化] 软件生成的自动任务通知机制优化,改为通过修改 defaultTpl 模板处理,而非直接强行拼接内容。
  • [修复] 修复了书籍导入完成后,界面左下角的选中数量没有清空,且右下角按钮状态没有重置的问题。

legado_app_3.26.071111

Choose a tag to compare

@github-actions github-actions released this 29 Jul 10:08
55af732

更新内容

2026.07.11

  • [优化]:书籍详情页右上角定时任务快捷入口改进
  • [优化]:自动任务解析的健壮性提高:url中含有分号等
  • [功能 优化]:本地缓存迁移:增加章节名md5匹配,增加本地缓存文件md5直接匹配的逻辑
  • [优化]:修复自动任务刷新目录时没有缓存自动迁移的问题;refreshToc方法中直接加入migrateTocCache方法,覆盖本地(除txt)和在线书籍
  • [修复]:将缓存行为改成懒加载,防止协程竞态导致任务栏通知无法关闭的问题
  • [修复]:为自动任务注册专用的通知渠道,修复应用通知管理中不显示自动任务的问题

legado_app_3.26.061620

Choose a tag to compare

@github-actions github-actions released this 29 Jul 10:07
1e6914b

更新内容

2026.06.16

  • [功能]:成功移植定时任务功能
  • [修复]:修复使用 url 判断是否是新章节,而不是绝对index,并修复缓存等逻辑,防止章节进出小黑屋导致新章节识别和数量信息混乱
  • [功能 修复]:实现书籍目录和章节名变动时的本地缓存自动重命名,防止缓存失效;并优化目录刷新逻辑,避免底层级联删除问题
  • [功能]:书源编辑界面迁移快捷导航功能;将快捷导航栏提取为可复用组件