首页 / 资讯中心 / 文章详情

Universal ReVanced Manager代码深潜:批量补丁调度器BatchPatchCoordinator的实现原理

Universal ReVanced Manager代码深潜:批量补丁调度器BatchPatchCoordinator的实现原理 ★ FEATURED ARTICLE
【免费下载链接】Universal-ReVanced-Manager Android manager for ReVanced and Morphe with third-party patch bundles, batch and automatic repatching, advanced installers, APK tools, and deep customization.项目地址https://gitcode.com/gh_mirrors/un/Universal-ReVanced-Manager点击查看免费下载Universal ReVanced ManagerURV是一款面向 Android 的 ReVanced 与 Morphe 补丁管理器其核心能力之一是批量补丁batch patching——一次处理多个应用的补丁、安装与自动重补丁。本文将深入源码解析其背后的调度中枢BatchPatchCoordinator它如何用状态机管理整条流水线、如何串行调度多个应用的补丁任务、又如何在失败、取消、进程重启等异常场景下保证数据不丢、文件不坏。一、它要解决什么问题 在 URV 中用户可以把多个应用加入一个批量队列统一配置补丁后一键完成规划Planning确认每个应用的 APK 来源、补丁包、补丁选择是否有效执行Running逐个应用跑补丁器产出打好的 APK安装Installing按策略逐个安装支持多种安装器并自动回退收尾Finished持久化结果快照供界面恢复展示。整个过程可能持续数小时期间还可能遇到补丁器崩溃、安装冲突、用户取消、App 进程被杀等状况。BatchPatchCoordinator约 3500 行的核心类位于 BatchPatchCoordinator.kt就是为这些复杂性而生的总指挥。二、核心设计执行闸门 状态机2.1 BatchExecutionGate全局互斥的执行许可批量任务最忌讳并发双开。URV 用一个极简的许可类解决它——BatchExecutionGatetryAcquire(owner)同一时刻只有一个持有者能拿到执行权重复申请直接拒绝release(owner)只有持有者本人能释放避免误释放。协调器的每次关键操作plan()、start()、install()、cancel()等都先尝试获取许可拿不到就安静返回false。特别巧妙的是定时自动重补丁scheduled在执行结束后仍保留许可由 shouldRetainBatchExecutionAfterFinish 控制防止自动任务期间被手动操作插队。2.2 两级状态机阶段 × 条目状态调度状态定义在 BatchPatchModels.kt 中分为两层整体阶段BatchPhase第 100 行阶段含义PLANNING正在解析批量计划PREFLIGHT预检完成等待用户确认/开始RUNNING正在逐个打补丁INSTALLING正在逐个安装CANCELLING取消中FINISHED结束结果可查看、可重试每个应用的条目状态BatchItemState第 24-32 行READY就绪、NEEDS_APK缺 APK、VERSION_MISMATCH版本不匹配、NO_PATCHES无可选补丁、EXCLUDED已排除、RUNNING/SUCCEEDED/FAILED/CANCELLED。整个运行时状态封装在不可变的BatchRunState数据类中存放在MutableStateFlow里——这让它天然适配 Compose UI 的响应式刷新界面只需订阅 state: StateFlow任何条目进度变化都会自动重绘。三、从 plan() 到 runQueue()一次批量补丁的完整旅程3.1 规划阶段并行解析失败不拖垮全队plan()方法第 280-343 行接收一组包名交给 BatchPlanResolver 解析。解析器内部用协程async awaitAll并行处理每个应用核对已安装版本、查找保留的原始 APK用于未来重补丁、匹配补丁包与补丁配置、确定补丁引擎等。值得注意的容错设计任何非取消类异常不会中断整个批次而是把所有条目标记为FAILED并记录错误信息第 310-328 行——单个应用的元数据问题不会让整个批量任务灰掉。3.2 执行阶段严格串行的队列调度start()触发 runQueue()其调度逻辑可以概括为三步取出所有READY条目按用户在预检页调整的顺序reorder()依次处理每个条目独立成一次性事务创建输出文件 → 启动补丁 Worker → 成功后做签名元数据注入 → 持久化 APK → 标记状态单项失败不阻塞队列try/catch把异常收敛为该条目的FAILED状态第 626-635 行然后继续下一个。为什么是串行而不是并行因为补丁器PatcherWorker是系统级重任务且通过 WorkManager 以Unique Work方式运行第 970-994 行——同一时间设备上只能有一个补丁器实例串天然是安全下限协调器还会捕获UniqueWorkAlreadyRunningException把已有补丁器在跑翻译成用户可读的失败原因。进度条的计算非常直观总进度 当前队列序号 当前应用的内部进度÷ 总应用数第 954-959 行补丁器的日志、内存采样每应用上限 2000 条也通过状态流实时汇入界面。3.3 持久化staging backup 的原子替换成功打补丁后persistPatchedItem() 负责把 APK 落盘到已保存应用目录这里有一套教科书级的安全替换流程先写入.tmp临时文件并校验大小一致若目标文件已存在先备份到.bak用临时文件覆盖目标再次校验同步更新 Room 数据库记录任何一步失败回滚——用备份恢复原文件或删除未提交的新文件保证磁盘上永远是一个完整可用的 APK。数据库操作失败时还会通过 runPostCommitStep 在NonCancellable上下文中尽力清理避免文件写了、记录没记上的悬挂状态。四、安装阶段多安装器路由与智能回退补丁全部完成后若策略为INSTALL_AFTER或用户点全部安装进入安装子阶段。installOne() 是这一阶段的核心它按InstallPlan类型分派到五种安装路径Internal标准 PackageInstaller 会话安装Shizuku借助 Shizuku 以系统权限安装冲突时可选择自动卸载重装且会阻止危险的降级RootPlayStore / MountRoot 挂载替换支持伪装成 Play Store 来源并在失败时回滚到原版挂载installWithRootMountExternal调用第三方安装器应用配合PendingExternalInstallerLease租约机制CAS 原子抢占 超时宽限期防止两个外部安装互相干扰第 2490-2512 行。当主安装器失败时shouldOfferBatchFallback 会判断是否满足回退条件手动任务、未指定安装器、回退安装器可用且与补丁模式匹配满足则弹窗询问用户同意后自动用回退安装器递归重试该应用——用户无感知地跨过安装器兼容性问题。五、可靠性设计亮点清单 ✅通读这个 3485 行的类有五个工程细节特别值得新手学习设计点做法源码位置统一超时交互所有需要用户点按钮的请求都走 awaitBatchRequest5 分钟超时自动返回安全默认值杜绝协程永久挂起BatchExecutionControl.kt无头执行的降级定时自动任务scheduledtrue禁止弹出任何交互窗口所有 Activity 请求直接返回取消结果allowsInteractiveBatchActivity结果快照持久化每次结束都把结果序列化为 JSON512KB 上限超限时逐级裁剪日志和补丁清单存入偏好重启后可用 restoreLastResult 完整恢复界面persistResult取消语义清晰cancel()先取消 WorkManager 中的补丁 Worker再取消协程最后把RUNNING/READY条目统一标记为CANCELLED第 3086-3125 行只重试失败项retryFailed() 只重新解析FAILED/CANCELLED的条目成功项原样保留无需整批重来BatchPatchCoordinator.kt此外协调器在 DI 容器中被注册为factory每次请求新建实例RepositoryModule.kt 第 51 行配合shutdown()的完整资源释放关闭三个请求 Channel、取消协程作用域、释放租约生命周期管理非常干净。六、相关文件导航 想继续深入可以按这条链路阅读调度核心domain/batch/ 目录BatchPatchCoordinator.kt——状态机与主流程BatchExecutionControl.kt——执行闸门与超时交互BatchPatchModels.kt——阶段、条目状态、运行状态模型BatchPlanResolver.kt——规划解析器ManualBatchPatchQueue.kt 与 PendingRequestRegistry.kt——手动批量队列与请求登记上层调用BatchPatcherViewModel.ktUI 侧所有coordinator.plan/start/retryFailed/cancel入口都在这里后台自动重补丁AutoPatchWorker.kt 定时触发同样的协调器流程单元测试app/src/test/java/app/urv/manager/domain/batch/ 下有 7 个测试类覆盖调度契约、安装器路由、回归场景等。总结BatchPatchCoordinator 的价值不在于发起补丁本身而在于把一件长耗时、多分支、可中断的事做成了状态可恢复、文件不损坏、队列不阻塞、交互可超时的工程化流水线。其闸门 两级状态机 事务式文件替换 结果快照的组合对任何需要设计后台批量任务系统的开发者都是很好的参考。如果你在用 URV 做批量补丁或自动重补丁理解这套机制也能帮你更快看懂界面上的每个进度与错误提示。赞分享【免费下载链接】Universal-ReVanced-Manager Android manager for ReVanced and Morphe with third-party patch bundles, batch and automatic repatching, advanced installers, APK tools, and deep customization.项目地址https://gitcode.com/gh_mirrors/un/Universal-ReVanced-Manager点击查看免费下载相关推荐Universal ReVanced Manager批量打补丁实战多应用排队补丁自动安装全流程Universal ReVanced Manager批量打补丁实战多应用排队补丁自动安装全流程 Universal ReVanced Manager简称Universal ReVanced Manager 补丁档案完全指南一键复现你的完美补丁配置Universal ReVanced Manager 补丁档案完全指南一键复现你的完美补丁配置 Universal ReVanced Manager简称 UUniversal ReVanced Manager自动重补丁教程让已打补丁应用永不落伍Universal ReVanced Manager自动重补丁教程让已打补丁应用永不落伍 Universal ReVanced ManagerURV 是一创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站