Android多种格式的异步解压/压缩解决方案

前言

最近由于项目需要,需要我谅解一下关于在移动平台的解压功能,在移动平台解压,我个人感觉是没有太大必要的,毕竟手机的性能有限。但是,不口否认,移动端的解压功能又是必备的,因为如果对于一些资源管理器类的应用,接入解压功能,会更完全,例如:资源管理器、手机QQ、UC浏览器等一些列应用,涉及到文件的管理与传输,那么查看压缩包下的内容就会显得十分必要了。所以说,如果有必要的话,移动应用还是需要支持的解压的功能的。

压缩文件介绍

既然要解压,那就必须先了解压缩文件,这篇文章只是初稿,所以这里就先介绍几种常见的压缩文件格式,以后会慢慢补充。

  1. zip格式,ZIP是一个计算机文件的压缩的算法,原名Deflate(真空),发明者为菲利普·卡兹(Phil Katz)),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为 application/zip 。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7-Zip格式。从性能上比较,RAR格式较ZIP格式压缩率较高,但是它的压缩时间远远高于Zip。而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用)。
  1. rar格式,同样是无损数据压缩,RAR文件通常比[IP文件压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件,其MIME格式为application/x-rar-compressed
  2. 7z格式,7z 是一种主流高效的压缩格式,它拥有极高的压缩比。在计算机科学中,7z是一种可以使用多种压缩算法进行数据压缩的档案格式。该格式最初被7-Zip实现并采用,但是这种档案格式是公有的,并且7-Zip软件本身亦在GNU宽通用公共许可证(GNU LGPL)协议下开放源代码。目前LZMA软件开发工具包的最新版本为V9.34。7z格式的MIME类型为application/x-7z-compressed
�解压过程的显示

具体来介绍下解压各个格式的方法

  • zip格式,zip格式算是我们最常见的压缩文件格式,当然,也是最容易处理的压缩格式,jdk本身就支持对zip文件进行解压,但是,jdk自带的解压毕竟有一定的局限性,我们肯定可以有更好的解决方法来处理。
    经过对一些应用的反编译,我发现他们很多用的并非是java.util.zip提供的解压方法,如果是小的文件,用这个其实也能够处理,但是考虑到性能与效率,我决定寻找更合适的方法。
    zip4j
    zip4j是一个在java上比较好用的zip文件压缩解压库,其功能比较强大,支持压缩与解压、加密、更新、移除等一系列操作,感兴趣的童鞋可以根据链接查看相应地文档。既然是java平台的库,那么放在移动端上来运行,我觉得是不会有太大问题的,毕竟zip解压对机器的性能要求不是很高。
    看下我的demo中如何解压zip文件:
zip解压的主要步骤

解压过程是在一个线程里运行,然后会通过handler回调到ui线程中,通知相应地解压进度以及相关信息.
具体效果如下:

由此,zip文件格式的解压过程至此为止。

  • rar格式
    rar格式算是比较麻烦的一种格式之一,jdk是不带rar格式的解压的,所以只能够实用开源的库来进行解压。说一下,rar格式由于压缩算法是不公开的,所以我们一般式不能够来压缩文件,一般只有用于解压的库。经过探索,我找到一款效率较高的rar格式解压库,在Android上完全适用。
    java-unrar
    其主要解压方式为:
rar解压方式

其同回调方法是和之前的一致的,所以有兴趣的可以看我的demo。

  • 7z格式
    关于7z格式,才是过程最艰难的寻找。由于7z是一种高压缩的格式,所以如果是用java代码来进行解压,效率是十分低效的,所以我找了好几款开源库,都是利用c/c++代码打包成jar库,然后进行解压,那么问题来了,如果是用动态库的话,那么机器的架构和平台是有差异的,在windows和linux上适用,不一定对Android平台能适用。因此,我一开始找到了
    7-Zip-JBinding
    这个开源库是十分强大的,利用c++编写的压缩解压算法,对大部分平台都有了对应的jar包,但是,唯独对Android的就没有很好的支持,我试着在把all-window包导入项目,我就知道,果然报错了。
    看了下编译的结果,问题是由于这个库的代码在编译时,机器没有足够的内存以及性能来编译,导致直接抛出错误,我在stackoverflow上来寻找了下问题,发现内存问题解决了,但是又莫名其妙出了另一堆问题,我想这应该是平台架构的问题了,估计我现在是解决不了了。
    不过,7-Zip-JBinding秉承了开源的精神,是提供了c的源代码的,我们可以利用这些源代码来进行jni的的开发,我发现在stackoverflow上还是有说这个解决方法的。
    有需要的朋友可以看一下stackoverflow这个问题:

http://stackoverflow.com/questions/14024874/j7zip-on-android-extracting-from-an-archive-and-listing-contents/14676769#14676769

所以用jbinding的想法是泡汤了,通过上述问题,我找到了**andro7z **这个思路的解决方法,也是提供了相应地c代码,需要我们自己进行编译ndk,打包成动态库来执行。
但是我想有没有更好的方法呢?
经过老大的指点,我找找到了一个github现成的工程AndroidUn7zip
作者已经做好了编译并且打包成了动态库和jar包,所以我们如果有需要的话,可直接把相应地库下载下来就可以运行了:
具体使用方法如下:

�核心代码

由于是采用的ndk的方法,所以我们比较难监听解压的过程,不过对于这种需要高性能的解压的方法,我们也很难去添加进度。
而且作者还对其他的格式解压也经行了封装,可以使用同一个库对不同的格式解压的。

https://github.com/hzy3774/AndroidP7zip
真心感谢老大和作者的指导。

对于还有一种7z的解压方法,就是利用compressor开源库解压,也可以在Android上运行,但是实际使用过程中还是有点问题的,等以后有时间再写具体的文章来说明。

结论

demo结构:

�工程目录

我觉得整个探究过程还是蛮有意思的,学到了许多以前没有接触到的知识,有时间我会把这个demo完善成一个解压类库,到时候就可以直接调用了,欢迎看一下我的这个解压demo,希望有能力的可以完善这个demo。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容