Android多種格式的異步解壓/壓縮解決方案

前言

最近因爲項目須要,須要我諒解一下關於在移動平臺的解壓功能,在移動平臺解壓,我我的感受是沒有太大必要的,畢竟手機的性能有限。可是,不口否定,移動端的解壓功能又是必備的,由於若是對於一些資源管理器類的應用,接入解壓功能,會更徹底,例如:資源管理器、手機QQ、UC瀏覽器等一些列應用,涉及到文件的管理與傳輸,那麼查看壓縮包下的內容就會顯得十分必要了。因此說,若是有必要的話,移動應用仍是須要支持的解壓的功能的。html

壓縮文件介紹

既然要解壓,那就必須先了解壓縮文件,這篇文章只是初稿,因此這裏就先介紹幾種常見的壓縮文件格式,之後會慢慢補充。java

  1. zip格式,ZIP是一個計算機文件的壓縮的算法,原名Deflate(真空),發明者爲菲利普·卡茲(Phil Katz)),他於1989年1月公佈了該格式的資料。ZIP一般使用後綴名「.zip」,它的MIME格式爲 application/zip 。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放源碼的7-Zip格式。從性能上比較,RAR格式較ZIP格式壓縮率較高,可是它的壓縮時間遠遠高於Zip。而7-Zip因爲提供了免費的壓縮工具而逐漸在更多的領域獲得應用)。
  2. rar格式,一樣是無損數據壓縮,RAR文件一般比[IP文件壓縮比要高,可是壓縮速度較慢。由於RAR文件頭也要佔據必定空間,在數據壓縮餘地不大時,壓縮過的文件可能比原文件要大。RAR的一個主要優勢是能夠把文件壓縮目標分割到多個文件,而且很容易從這樣的分割的壓縮文件解壓出源文件,其MIME格式爲application/x-rar-compressed
  3. 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線程中,通知相應地解壓進度以及相關信息.
具體效果以下:linux

由此,zip文件格式的解壓過程至此爲止。android

  • rar格式
    rar格式算是比較麻煩的一種格式之一,jdk是不帶rar格式的解壓的,因此只可以實用開源的庫來進行解壓。說一下,rar格式因爲壓縮算法是不公開的,因此咱們通常式不可以來壓縮文件,通常只有用於解壓的庫。通過探索,我找到一款效率較高的rar格式解壓庫,在Android上徹底適用。
    java-unrar
    其主要解壓方式爲:

rar解壓方式

其同回調方法是和以前的一致的,因此有興趣的能夠看個人demo。c++

  • 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#14676769git

因此用jbinding的想法是泡湯了,經過上述問題,我找到了andro7z 這個思路的解決方法,也是提供了相應地c代碼,須要咱們本身進行編譯ndk,打包成動態庫來執行。
可是我想有沒有更好的方法呢?
通過老大的指點,我找找到了一個github現成的工程AndroidUn7zip
做者已經作好了編譯而且打包成了動態庫和jar包,因此咱們若是有須要的話,可直接把相應地庫下載下來就能夠運行了:
具體使用方法以下:github


核心代碼

因爲是採用的ndk的方法,因此咱們比較難監聽解壓的過程,不過對於這種須要高性能的解壓的方法,咱們也很難去添加進度。
並且做者還對其餘的格式解壓也經行了封裝,可使用同一個庫對不一樣的格式解壓的。算法

https://github.com/hzy3774/AndroidP7zip
真心感謝老大和做者的指導。windows

對於還有一種7z的解壓方法,就是利用compressor開源庫解壓,也能夠在android上運行,可是實際使用過程當中仍是有點問題的,等之後有時間再寫具體的文章來講明。瀏覽器

結論

demo結構:


工程目錄


我以爲整個探究過程仍是蠻有意思的,學到了許多之前沒有接觸到的知識,有時間我會把這個demo完善成一個解壓類庫,到時候就能夠直接調用了,歡迎看一下個人這個解壓demo,但願有能力的能夠完善這個demo。

 

原文地址:http://www.jianshu.com/p/339ab9048f91

相關文章
相關標籤/搜索