android文件上传优化分享(切片上传),2024年最新从新手到Flutter架构师一篇就够

  1. 能知道媒体文件压缩的原理

整个优化经历了两个阶段

  1. 第一阶段是上传模块重构,并且通过UI和数据的分离,提升了扩展性,逐步被运用到产品的各个模块中

  2. 第二阶段是上传尺寸的优化,通过对视频文件的压缩,大幅减少用户的上传等待时间。

chapter 1.上传框架重构

================

评估现有模块表现

  1. 使用中低配置手机运行apk,查看上传模块实际表现

  2. 使用Charles抓包工具,观察每个上传文件体积是否被压缩到合理范围、对上传模块发送的http请求按照功能对其分类,检查是否可以合并同类请求

  3. 退出上传,查看上传后续步骤是否被停止;大文件重新上传是否跳过已上传的数据块

  4. 查看上传后的结果是否正常播放、是否失真、音频异常

上传模块现存问题

  • UI和上传代码耦合在一起,难以拓展维护

  • 停止上传后仍然继续上传,说明流程控制有问题

  • 在上传时,对每个文件会进行尺寸压缩、计算md5值,比较费时

  • 每个文件上传前都会发送一次存在校验(根据文件md5值),导致在上传的场景中会发送多次http请求校验文件存在

  • 视频文件没有做压缩,导致上传费时

整体设计思路

上传设计思路.png

  1. 数据UI分离:使用观察模式,抽离UI部分代码。使用弱引用设置观察者,避免生命周期不一致引起的内存泄漏。

  2. 费时操作前置:在选择图片的步骤,开启异步线程压缩图片、计算md5,将费时操作提前处理掉_(此步骤在mx4 pro上处理拍照的图片耗时100~200ms,基本上选择图片后就已经完成好了计算)_

  3. 将文件上传成功的md5值保存在内存中,避免重复处理。

  4. 分次请求合并:向服务端开发者申请批校验的接口,将多个文件存在的http请求被合并成一个。

优化后 逻辑UML

上传步骤.png

文件切片

文件切片将一个大文件切成若干小文件进行上传,在上传失败的情况下,可以跳过已上传的小文件。

切片代码底层使用JDK的RandomAccessFile对文件提供数据读取

经测试,上传的瓶颈在于上行带宽,所以切片、上传时单线程任务,不会出现10个切片一起上传的情况。

切片目前设定为10MB一片,上传时,把当前的块的数据读取到内存中进行上传

切片步骤

  1. 对文件md5计算,向服务端校验文件是否已存在,是则提前结束

  2. 对文件进行切片,计算每片的md5值用于校验是否已上传。比如38mb的视频,限定每片最大10mb,切出4片,最后一片8mb,其余10mb。


                    FileChannel fc = new RandomAccessFile(mSourceFile, "r").getChannel();

                    MappedByteBuffer byteBuffer;



                    for (int i = 0; i < mBlockCount; i++) {

                        long leftBlockSize = Math.min(mSourceFile.length() - i * mBlockSize, mBlockSize);

                        byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, i * mBlockSize, leftBlockSize).load();

                        mResultArray.add(new BlockInfoModel("", MD5Util.md5(byteBuffer), i));

                    }

                    fc.close();



  1. 批校验文件的切片md5值, 记录没有被上传过的切片下标,循环从源文件读取对应数据切片进行上传。切片数据流读到内存中性能最佳,但是需要谨慎考虑OOM问题;数据流保存到磁盘中,再循环每次1MB的读取比较稳健,但是性能稍差。本次重构提供了这两种切片方式都可以选择

  2. 所有数据切片上传成功后,向服务端发起一次文件合并请求,成功则结束,否则跳到步骤3。

chapter 2.媒体压缩

==============

对于媒体资源来说,压缩就是在保证用户体验的情况下,尽可能地抹去用户感官之外的细节,达到降低文件尺寸的目的

1.音频的无损格式ape、flv 压缩到有损格式的Mp3,就是抹去了人听觉之外的音频细节

2.图片视频经过压缩,虽然放大N倍看细节会变得模糊,但是正常浏览下是可以接受的

举个例子

针对 1920*1080的屏幕截图,经过压缩后尺寸不变,但是降低采样率,文件体积从1MB降低到了200KB

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后:学习总结——Android框架体系架构知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。

下方即为我手绘的Android框架体系架构知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)

除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-qhvAhVaO-1712619434352)]

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值