YCDownloader下载库(多线程、多任务、多进程)

0x01 前言

以前在个人文章《Android高速下载器实现思路——单个任务的提速与优化》提到了一些下载器的实现方式。而后由于这学期实验报告超级多,这个项目一鸽再鸽到如今基本成型了,作成了Android Library上传到了Jitpack。java

项目传送门git

欢迎下载sample体验、start。github

0x02 集成

根目录的build.gradlebash

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
复制代码

在module的build.gradle中:多线程

dependencies {
    implementation 'com.github.SirLYC:YC-Downloader:latest.release'
}
复制代码

Application中:异步

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        // multi process
        YCDownloader.install(this, true)
        // single process
        //        YCDownloader.install(this, false);
        // or
        //        YCDownloader.install(this);
    }
}
复制代码

到这里就已经启动了下载服务。下载服务是和Application Context绑定的,目前暂未提供退出服务的接口。maven

0x03 使用

全部的接口都经过YCDownloader的静态方法导出,接口要么经过方法名就能够知道功能要么有相应的文档注释说明。ide

文件传送门post

若是还不清楚,项目中有一个现成的sample,涵盖了这个库常见的一些API的使用(做为纯粹的HTTP下载器,功能应该还算比较完整)。测试

sample传送门

须要注意的地方是,若是使用多线程,最好不要有其余组建运行在:yc_downloader进程,这个进程在库的Manifest已经注册为了远程下载服务运行的进程。

0x04 有关上一篇文章的实际实现改进

上一篇文章中有提到把读和写的线程分离,按照读、写线程n:1的方式组织。实际上在以前实现时,这样的方法最后达到的下载效率并非很高。

首先须要知道的是,读写线程分离确实能提高下载的速度,可是,读写线程比是一个重要的参数。在几回实验后发现,当读写线程为n:1时,读线程常常会被写线程拖慢,由于写线程只有一个,要处理多个线程下载下来的缓冲区的读。写完一个缓冲区后才能释放给某个读线程下载,而且还要被多个读线程竞争。

所以,改变这种局面的方式,一个是减少读写线程比(增多写线程),另外一个是使用双缓冲(理论上缓冲区能够适量继续增长,但通常双缓冲足够了,一个写一个读循环使用,毕竟空间有开销)。最后在实现中,采用的是每一个读线程对应一个写线程,而且有两个缓冲区

最后经过这种方式测试,下载速度基本能够跑满带宽。

0x05 后续维护/新功能

  • 若是有必要,添加退出服务的功能。
  • 对于下载文件的完整性校验。或者说检查下载文件相比于上一次下载是否过时(断点续传时)。
  • API可能须要调整的更加易于使用。目前不少API由于IPC的关系不能直接在主线程使用,须要异步的方式,后续可能会经过一些方式调整。
  • 若是有精力,能够试着添加其余协议的下载,好比很是常见的FTP下载。
  • 下载引擎部分基本已经成型,后续会基于当前版本的sample开发一个功能完整的下载器(有上架商店的想法)。