Thur4day

Results 15 comments of Thur4day

请问现在有Android demo吗?

请教一下,Usage C: sync_patch(oldFile,hsyniFile,hsynzDownloader,diffInfoCacheFile,outNewFile,...)这种方式是使用native库的下载方式吗?

如果我想客户端自己下载差分文件,是用sync_info(oldFile,hsyniFile,hsynzDownloader,diffInfoCacheFile,...)方式获取到差分的信息,然后通过hsynzDownloader的回调去按需下载数据块到diffInfoCacheFile里面吗?diffInfoCacheFile就是readMe里面的-diffi#cacheTempFile文件吗?

> 安卓客户端所有同步函数都调用了native层的hsynz.doSyncPatch函数,根据参数的不同完成不同的阶段任务; 但这个函数并不负责具体的下载,而是通过回调`IRangeDownloader hsynzDownloader`接口来完成。 > > hsynz.sync_info函数是只负责执行diff算法(计算出需要下载哪些块,但不下载),并把该计算结果保存到diffInfoCacheFile文件。(该文件就是readme里面的-diffi#cacheTempFile文件) 想先下载到差分文件,那就是`Usage A`的方式:先调用hsynz.diff函数,它执行diff算法并同时下载补丁包到outDiffFile文件,然后调用hsynz.patch函数得到outNewFile。 请问下载到outDiffFile文件里需要我在实现的hsynzDownloader方法里通过网络直接写入outDiffFile里吗?还是把responseBody流通过hsynzDownloader的readDownloadedData方法传到native层,native自己写入文件?

``` class HsynzDownloader(val scope: CoroutineScope) : hsynz.IRangeDownloader { val apkUrl by lazy { "https://xxx.85a7ece1e135233231cc7de4504a525a.zip" } val okHttpClient by lazy { OkHttpClient.Builder().build() } var needLoadRanges: hsynz.TNeedDownloadRanges? = null var dstBufferPos =...

> @Thur4day 需要在每次进入readDownloadedData时,设置dstBufferPos=0; 因为dstBuf缓冲区只是一个固定大小的bytes数组,用于中转数据的,每次必须按顺序填满需要的数据长度。 "xxx.85a7ece1e135233231cc7de4504a525a.zip" 为什么是zip文件,按hsyz项目的命名,应该是个.hsynz文件,不会是个zip文件(该文件不压缩时就是指原文件,而用-gzip参数式时就是.gz格式的文件)。 建议可以用一个本地文件来测试,整个流程调通以后在转成http下载。 > > 另外可以考虑的优化:http1.1请求支持一次请求多个区域(ranges),这样可以大量减少请求次数,即 "Range: bytes=" 后面跟多个下载的区域。 而且还可以考虑在downloadRanges的时候就启动异步线程负责快速下载。 我使用本地文件测试调通了。url对应的.zip文件就是我的原文件,因为没有设置压缩参数和out_hsynz_file,所以没有生成额外的.hsynz文件。 在downloadRanges的时候启动下载这里我尝试了,这里下载下来我保存的是responseBody,因为之前你说是native自己负责写文件。那么我在每次进入readDownloadedData时,dstBufferPos重置为0,然后调用dstBuf.setData(dstBufferPos, buffer, 0, len)。是这样吗?

> @Thur4day 需要在每次进入readDownloadedData时,设置dstBufferPos=0; 因为dstBuf缓冲区只是一个固定大小的bytes数组,用于中转数据的,每次必须按顺序填满需要的数据长度。 "xxx.85a7ece1e135233231cc7de4504a525a.zip" 为什么是zip文件,按hsyz项目的命名,应该是个.hsynz文件,不会是个zip文件(该文件不压缩时就是指原文件,而用-gzip参数式时就是.gz格式的文件)。 建议可以用一个本地文件来测试,整个流程调通以后在转成http下载。 > > 另外可以考虑的优化:http1.1请求支持一次请求多个区域(ranges),这样可以大量减少请求次数,即 "Range: bytes=" 后面跟多个下载的区域。 而且还可以考虑在downloadRanges的时候就启动异步线程负责快速下载。 非常感谢,还得请教: readDownloadedData这个方法是回调一次还是说我按顺序填满需要的数据长度后,return true。然后会再次进入这个方法?readDownloadedData的循环调用是native层控制的是吗?没有数据填充的时候等待要客户端来做?相当于我在downloadRanges的时候就启动异步线程负责快速下载这里是生产者,readDownloadedData是消费者?我需要控制流的生产和消费即可?

@sisong 我使用阻塞队列来控制数据流,但是遇到了run throw errorCode: 42。这个我查源码没有看到对应的错误码注释。能帮忙确认一下42是发生了什么错误吗?

@sisong 想问一如果是目录的话,Android这个so会报21错误:“call import system api error! errno: 21, errmsg: Is a directory.” 目前Android还不支持oldFile是一个目录的情况是吗?