云取 YunGet

下载引擎

TurboDL 负责什么、应用里为什么不止一个引擎、什么时候会用到哪一个。

docs/ENGINES.md在 GitHub 上查看原文下载

同一个链接,在某个引擎手里卡住,换一个可能就下动了,反过来也成立。YunGet 里放了四套下载实现,设置里可以随时换。这篇讲清楚四套各自是什么、什么时候该选谁,以及 Gopeed 的内核为什么要在应用里手动导入一次。

为什么不止一个引擎#

默认走 TurboDL。它是一套独立发布的下载 SDK(内置的是 0.2.0.6),做了多线程 Range 分片、断点续传、动态分段,HLS 交给插件处理,日常的 HTTP/HTTPS 直链基本都靠它。

但有些任务它压根做不了。磁力和 BT 跟 HTTP 直链不是一回事,得指望 Gopeed 的 Go 内核。项目早期自己写的那套下载器也留在代码里,删掉没什么好处,就当成兜底选项留着。aria2 平时用不着,主要拿来对照排查:某个链接在 TurboDL 里出问题,换成 aria2 试试,就能分清是链接本身有问题,还是引擎处理得不对。

所以设置里的引擎切换更像一个应急出口,而不是让你天天调参的地方。

四个引擎分别是什么#

引擎实现什么时候用
TurboDLTurboDownloadManager,架在 TurboBootstrap + TurboClient 上默认选择,普通 HTTP/HTTPS 直链
内置兼容引擎LegacyDownloadManager + AdaptiveDownloadEngine兜底
aria2APK 里自带的 libaria2c.so实验性,用来对照排查
Gopeed跑在应用进程里的 Go 内核(gomobile 编译)磁力 / BT 这类任务

TurboDL 是默认引擎,代码里是 TurboDownloadManager,底下由 TurboBootstrap 启动、TurboClient 干活。普通 HTTP/HTTPS 直链、分片并发、断点续传、插件形式的 HLS 都归它管,还支持现场诊断(把连接状态一类的信息导出来看)。没有特别理由就别换。

内置兼容引擎在设置里显示为「内置下载器」,标着 Legacy,实现是 LegacyDownloadManager 加 AdaptiveDownloadEngine。它是项目早期的写法:固定开比较满的并发、4MB 一块、用工作窃取调度。有两点和 TurboDL 不一样——它没有现场诊断,也不持久化请求头,所以那些靠会话(cookie、鉴权头)才能下的链接,它接不住。

aria2 是实验性的。二进制就是 APK 里的 libaria2c.so,实际版本是 aria2-next 2.8.3,只有 arm64 设备可用。并发参数 -x 保守取 16,再往上容易触发网盘的风控,反而下不动。HTTPS 需要一份 CA bundle,应用会从系统证书目录自动拼好,不用你手动准备。

Gopeed 是跑在应用进程内的 Go 内核,用来做内置分片器做不到的事,比如磁力和 BT。它的内核不随 APK 分发,得你在「下载引擎」页里手动导入一次。

怎么切换#

设置分两层。第一层选「内置下载器」还是「Gopeed 引擎」;选了「内置下载器」之后,下面还有一层,再挑 TurboDL、内置兼容还是 aria2。

改完不会立刻生效,要重启应用——正在跑的任务底下的引擎被临时抽掉会出问题。重启之后,新引擎对之后建的任务生效。

有几个边界情况值得知道:

  • 选了 Gopeed 但内核还没导入:本次任务会走内置路径,不会因为找不到内核就直接报错。
  • 应用启动时发现设置里选着 Gopeed、而内核文件不在:会把设置改回「内置下载器」。
  • 已经明确用了哪个引擎,建任务却失败:不会悄悄换一个引擎继续下。报错总比「换个下载器默默下完」容易排查。

Gopeed 内核怎么来#

内核包来自上游维护的公开构建仓库 CYQawa/yunx_gopeed_build 的 Release。应用按本机的 ABI 去匹配对应的 libgopeed-<abi>.aar,下载通道有三条:GitHub 直链、GitHub 加速镜像、网盘。Release 说明里带了 [网盘下载](链接) 的时候,应用会多给你一个「网盘更新」入口。

校验这件事得说清楚,别指望它有签名:

  • 走 GitHub 通道,会比对 Release 资产里的 sha256。
  • 走网盘通道,拿不到摘要,跳过 sha256 校验,只校验下载后的大小。

也就是说,网盘通道能保证的只有「文件大小对得上」,没有签名校验这一层。

解开之后内核装到 filesDir/gopeed/lib/libgojni.so,引擎数据放在 filesDir/gopeed/store 和 filesDir/gopeed/tmp,导入完成后临时包会删掉。运行期的 Gopeed 不监听任何 TCP 端口(apiEnable 是关的)。

HLS 的两条路#

用哪个引擎,决定了 HLS 走哪条路。

TurboDL 这边交给 turbo-plugin-hls 插件:解析 M3U8、分片并发,支持 AES-128 解密和 EXT-X-BYTERANGE。内置兼容引擎有自己的一套轻量实现,能力弱一些,AES 加密和 BYTERANGE 都不支持。

如果你下载加密的 HLS 失败,先看一眼当前用的是不是 TurboDL——默认就是它,正常情况下不用管这件事。

这里的 HLS 指的是下载能力,不是播放器。

并发口径#

TurboDL 单任务的上限能开到 256,应用把默认值和上限装配成了「连接数上限 16、诊断档位上限 64」。理由不复杂:网盘服务端普遍有风控,连接数拉满往往比 16 还慢。

还有一点,并发是上限而不是硬性目标。一个文件只切出 5 个可调度的分片时,实际并发就是 5,想再多也没有东西可下。

← 全部文档