關於ipa和apk文件的解壓


移動互聯網中,主要的兩個平台是Android和ios,android上文件的安裝包是后綴名為apk的文件,ios上文件的安裝包是后綴名為ipa的文件,在本文分析一下這兩種文件的特點,以及如何用程序去解析這些安裝包的資源。

 

1.    android的apk文件

 

(1) apk文件的結構

 

apk文件其實是zip格式,但后綴名被修改為apk,所以,把apk的文件后綴改為zip后,就能用壓縮軟件打開安裝包。

打開apk文件后,可看到如下的文件結構,如圖1:

 

 

                         圖1

META-INF目錄:存放的是簽名信息,用來保證apk包的完整性和系統的安全。

 lib目錄:子目錄armeabi存放的是一些so文件。

 assets目錄:存放一些配置文件,這些文件的內容在程序運行過程中可以通過相關的API獲得。

 res目錄:放資源文件。包括圖片,字符串等等。

 AndroidManifest.xml:該文件是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息。

 classes.dex:java源碼編譯后生成的java字節碼文件(首先是java文件通過jdk編譯成字節碼文件然后經過dex編譯成classes.dex)。

 resources.arsc:編譯后的二進制資源文件的索引(apk文件的資源表(索引))

 

(2) 如何獲取apk文件的基本信息

 

要獲取apk文件的基本信息(例如圖標,應用名稱,版本),可以使用android-apktool(我已打包上傳到http://download.csdn.net/detail/newjueqi/7713025), 把里面的所有文件復制到/usr/local/bin/ 目錄后,用如下命令就能獲取apk的文件信息。

 
  1. /usr/bin/sudo/usr/local/bin/aapt dump badging apk文件路徑  

執行的例子如圖2:

 

 

                                                                           圖2


從上面紅框的三行,就能獲取apk的版本號,名稱,圖標。

 

2.    ios的ipa文件

(1) ipa文件架構

 

ipa文件其實也是一個zip文件,把ipa后綴名改為zip后,就能把它打開,打開后首先看的是”payload”文件夾,進入”payload”文件夾就是”應用名.app”文件夾,進入這個文件夾后就是資源的位置。

 

         資源的例子,如圖3所示:

 

 

 

_CodeSignature:文件的簽名。

 Info.plist: 被加密過的文件,應用名,版本,圖標等信息都包含在這個文件中。

 icon2.png,icon.png:不同尺寸的圖標文件,也是被加密過的。

 

(2) 如何獲取ipa文件的信息

 

在(1) 中已經提過了,ipa文件的信息是保存在Info.plist,用開源工具(https://github.com/rodneyrehm/CFPropertyList)就能把里面的內容解密。

 簡單的用法如下:

 
  1. require_once(__DIR__.'/../classes/CFPropertyList/CFPropertyList.php');  
  2.    
  3. $content =file_get_contents("/tmp/Info.plist");  
  4. $plist = new CFPropertyList();  
  5. $plist->parse($content);  
  6. var_dump( $plist->toArray() );  

 

 $plist這個數組的信息如下:

 
  1.    
  2. array(29) {  
  3.  'CFBundleName' =>  
  4.  string(12) "DataDemo"  
  5.  'DTXcode' =>  
  6.  string(4) "0511"  
  7.  'DTSDKName' =>  
  8.  string(11) "iphoneos7.1"  
  9.  'DTSDKBuild' =>  
  10.  string(6) "11D167"  
  11.  'CFBundleDevelopmentRegion' =>  
  12.  string(2) "en"  
  13.  'CFBundleVersion' =>   //版本號  
  14.  string(3) "2.0"  
  15.  .........  
  16.   'CFBundleDisplayName' => //應用名稱  
  17.  string(12) "DataDemo"  
  18.  .........  
  19.  array(1) {  
  20.    'CFBundlePrimaryIcon' =>  
  21.    array(1) {  
  22.      'CFBundleIconFiles' =>  //圖標文件  
  23.      array(2) {  
  24.        [0] =>  
  25.        string(5) "icon2"  
  26.        [1] =>  
  27.        string(4) "icon"  
  28.      }  
  29. }  


在這個數組中,關鍵的部分如下:

 

'CFBundleVersion':版本號

'CFBundleDisplayName':應用名稱

'CFBundlePrimaryIcon'->'CFBundleIconFiles':圖標文件

 根據這里的圖標名稱,在ipa文件中找到加密過的圖標文件。使用開源工具(https://github.com/pcans/PngCompote),就能把加密過的圖標文件還原。

 Pngcompote的用法:

 
    1. require_once 'pngCompote.php';  
    2. $filename = 'Lenna.crush.png'; //需要解密的文件路徑  
    3. $newFilename = 'Lenna.compote.png'; //解密后的文件路徑  
    4.    
    5. $png = new PngFile($filename);  
    6. if ($png->revertIphone($newFilename)) {  
    7.        echo 'cleaning done!'.PHP_EOL;  
    8.        echo '<img src="'.$newFilename.'"/>'.PHP_EOL;  
    9. }  

鏈接:

如何獲取app(apk和ipa)中的資源

提取MacOSX/iOS應用圖標的6種技巧

APK文件結構和安裝過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM