Java 读取 Assets Zip文件并解压到SD卡指定目录

这个不是一篇教程,只是今天下午为了进一步改造安卓项目的apk安装流程的操作心得。

目前安卓项目使用的是 Java + NDK 进行开发,由于资源文件非常大,暂时也没时间优化和精简部分资源文件大小,目前压缩成 Zip 包,大概有 2gb 左右。之前我采用的方法是编译好 apk 让用户直接安装,大小只有 2-3mb,然后第一次启动申请相关权限,再检测远程 oss 的 apk 版本是否需要更新。之后就读取写入在 apk 当中的下载更新列表,并与本地的文件夹与文件大小进行比较。因此,用户第一次启动下载,大概就需要下载 2-3gb 的文件。但是在实际的使用过程中出现很多细节问题,严重影响安装流程体验。

比如说,用户下载过程中信号不好或者网络不好导致中断,我的下载模块写得太不好,虽然有些断线续传,但是还是经常失败。另外就是部分安卓手机可能运存不够,导致下载过程中闪退或者解压缩失败等问题。

所以一直想要把安卓项目改成本地化安装,就是把所有资源文件,全部打包成 zip 压缩包,塞到 apk 当中,并在用户第一次启动的时候,解压缩到手机根目录指定文件夹。从第二次启动开始,就检查是否已经解压缩过,如果是,则不再解压缩。并继续进入检测 apk 版本和新的更新文件列表即可。

实现思路:

  • 在 Android Studio 项目中创建 assets 文件夹
  • 将资源文件压缩成 zip 包,放入到 assets 当中,打包 apk 的时候,Android Studio 默认会自动将 assets 文件夹里所有资源自动打包到 apk 当中
  • 重写 OnCreate 方法,先判断是否存在文件夹,没有则读取 assets 当中的 zip 包,并解压缩到指定目录
  • 读取的方法和解压缩的方法网络上很多,搜索即可使用,略微需要修改,比如判断是否存在,比如修改缓存等。如果碰到有多个 zip 包,也需要适当修改。
  • 后续可能考虑使用 7z 的压缩包和解压,实现更小的体积和解压效果,目前暂时使用 Zip 够用。
  • 使用过程中碰到一个问题,就是 Zip 包的大小越大,生成apk的时候,Gladle 所需要的内存越大,我的 Zip 暂时只放了 600mb,但是已经需要消耗将近 15gb 的内存了,看来要上 64gb 内存才够把 2gb 的 Zip 都塞进去了。
  • 实际安装大概15秒,首次解压缩大概30秒,相对还能忍受。以后如果重写项目代码和精简资源,应该有把握把整个项目压缩到 200mb 以内,从而实现全部塞到 apk 当中,就比较完美了。

由于时间有限,又要去带娃洗澡睡觉了,今天暂时只折腾到这里,后续继续完善成为 7z 格式,并优化解压缩的内存问题和性能问题,还有大量的细节和优化空间。

当初设定的小目标基本实现了:

  • 首次启动权限申请
  • 首次启动解压缩 assets 资源
  • 每次启动监测远程 apk 版本并自动更新和安装 apk
  • 更新完 apk 之后,自动更新远程资源列表文件和 lua 文件等
  • 适配大部分安卓机型权限和分辨率
  • 优化项目 CPU 占用和尽可能使用 GPU 绘制
  • 优化项目内存占用和电池占用,目前相对满意

这个水文就是简单记录一下实现的思路,距离完美还有非常远的距离,回头继续搞起,没时间,不可能写成教程类,暂时也达不到教程水平,都是非常简单粗暴的实现需求而已。

发表评论

电子邮件地址不会被公开。 必填项已用*标注