zoukankan      html  css  js  c++  java
  • 关于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文件结构和安装过程

  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/On1Key/p/5829868.html
Copyright © 2011-2022 走看看