移動互聯網中,主要的兩個平台是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的文件信息。
- /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)就能把里面的內容解密。
簡單的用法如下:
- require_once(__DIR__.'/../classes/CFPropertyList/CFPropertyList.php');
- $content =file_get_contents("/tmp/Info.plist");
- $plist = new CFPropertyList();
- $plist->parse($content);
- var_dump( $plist->toArray() );
$plist這個數組的信息如下:
- array(29) {
- 'CFBundleName' =>
- string(12) "DataDemo"
- 'DTXcode' =>
- string(4) "0511"
- 'DTSDKName' =>
- string(11) "iphoneos7.1"
- 'DTSDKBuild' =>
- string(6) "11D167"
- 'CFBundleDevelopmentRegion' =>
- string(2) "en"
- 'CFBundleVersion' => //版本號
- string(3) "2.0"
- .........
- 'CFBundleDisplayName' => //應用名稱
- string(12) "DataDemo"
- .........
- array(1) {
- 'CFBundlePrimaryIcon' =>
- array(1) {
- 'CFBundleIconFiles' => //圖標文件
- array(2) {
- [0] =>
- string(5) "icon2"
- [1] =>
- string(4) "icon"
- }
- }
在這個數組中,關鍵的部分如下:
'CFBundleVersion':版本號
'CFBundleDisplayName':應用名稱
'CFBundlePrimaryIcon'->'CFBundleIconFiles':圖標文件
根據這里的圖標名稱,在ipa文件中找到加密過的圖標文件。使用開源工具(https://github.com/pcans/PngCompote),就能把加密過的圖標文件還原。
Pngcompote的用法:
- require_once 'pngCompote.php';
- $filename = 'Lenna.crush.png'; //需要解密的文件路徑
- $newFilename = 'Lenna.compote.png'; //解密后的文件路徑
- $png = new PngFile($filename);
- if ($png->revertIphone($newFilename)) {
- echo 'cleaning done!'.PHP_EOL;
- echo '<img src="'.$newFilename.'"/>'.PHP_EOL;
- }
鏈接: