移动互联网中,主要的两个平台是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. $content =file_get_contents("/tmp/Info.plist");
  3. $plist = new CFPropertyList();
  4. $plist->parse($content);
  5. var_dump( $plist->toArray() );

$plist这个数组的信息如下:

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

在这个数组中,关键的部分如下:

'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. $png = new PngFile($filename);
    5. if ($png->revertIphone($newFilename)) {
    6. echo 'cleaning done!'.PHP_EOL;
    7. echo '<img src="'.$newFilename.'"/>'.PHP_EOL;
    8. }

链接:

如何获取app(apk和ipa)中的资源

提取MacOSX/iOS应用图标的6种技巧

APK文件结构和安装过程

关于ipa和apk文件的解压的更多相关文章

  1. tar.xz文件如何解压

    1. tar.xz介绍 XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 2. 压缩 ta ...

  2. linux ubuntu12.04 解压中文zip文件,解压之后乱码

    在windows下压缩后的zip包,在ubuntu下解压后显示为乱码问题 1.zip文件解压之后文件名乱码: 第一步 首先安装7zip和convmv(如果之前没有安装的话) 在命令行执行安装命令如下: ...

  3. Linux下*.tar.bz2等文件如何解压--转

    如果tar不支持j这个参数就先用 bzip2 -d xxx.tar.bz2 把它解压成.tar文件,然后再用 tar xvf xxx.tar 拆包.压缩解压 linux下怎么解后缀名是gzip的文件? ...

  4. PHP zip压缩文件及解压

    PHP zip压缩文件及解压 利用ZipArchive 类实现 只有有函数.界面大家自己写 ZipArchive(PHP 5.3 + 已自带不需要安装dll) /** * 文件解压 * @param ...

  5. SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html

    SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...

  6. 解决MOFH免费空间cpanel面板大文件无法解压的情况

    解决办法: 解压大文件,重新压缩为tar格式的压缩格式,这样可以更小,而且也可以在cpanel面板解压,记得使用filezilla软件上传文件,在cpanel的网页界面不要刷新,一刷新就不可以解压大文 ...

  7. Java实现zip压缩文件的解压

    需求描述: 前段时间写了一篇博客<Java实现对文本文件MD5加密并ftp传送到远程主机目录>,实现了一部分的业务需求.然而有些业务可能不止传送一个文件,有时候客户需要传多个文件,原有系统 ...

  8. .tar.xz文件的解压方法

    废话不多说: 直接看 方法一: tar -xvJf ***.tar.gz 方法二: 先减压成 .tar 格式的文件, 再解压 .tar #xz是一个工具, 系统中没有安装,需要下载 xz -d *** ...

  9. Android 下载zip压缩文件并解压

    网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,在此记录一下下载zip文件并直接解压的方法. 其实也很简单,就是把下载文件和解压zip文件结合到一起.下面即代码: URLConne ...

随机推荐

  1. Linux-网络连接-(VMware与CentOS)

    VMware虚拟机中安装CentOS,进行网络连接,分为两步,内网连接,与外网连接. 前提: 当你正确安装VMware后,网络适配器会增加2个新的网卡:(可在设备管理器->网络适配器中查看) 第 ...

  2. OData V4 学习目录

    开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. Open Data Protocol (开放数据协议,OData)是用 ...

  3. 【JavaScript】浅析javaScript和HTML与unicode字符集的关系

    目录结构: // contents structure [-] javaScript和HTML的字符集 javaScript和HTML如何表现unicode字符集 参考文章 javaScript和HT ...

  4. js实现web网页版台球游戏

    js桌球小游戏在线试玩地址:http://keleyi.com/game/13/ 游戏截图: 完整代码,保存到html文件可以试玩: <!DOCTYPE html PUBLIC "-/ ...

  5. 怎么在MVC中使用自定义Membership

    首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe 地址一般位于: C:\WINDOWS\Microsoft.NET\Framework\v2.0.507 ...

  6. SharePoint 2013 配置Excel Services

    前言:本文主要介绍如何启用SharePoint 2013版本Excel Services服务,并配置Excel Web Access部件,使Excel文档可以显示在Web页面中. 简单说一下流程,Sh ...

  7. jeecg环境搭建20160707

    1.首页修改位置:src/main/webapp/webpage/main 2.tomcat45秒超时启动修改,open打开servers项目,在右上角处的timeouts参数修改: 3.eclips ...

  8. IOS开发基础知识--碎片45

    1:iOS SEL的简单总结 SEL就是对方法的一种包装.包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法 a.方法的存储位置 在内存中每个类的方法都存储在类对象中 每个方法都有一 ...

  9. ios手势操作,四个基本事件与六个常用事件

    基本事件包括begin,canceled,move,ended四项,如果对象的hidden属性为yes,则无效果,hidden属性必须为no;才能使用: -(void)touchesBegan:(NS ...

  10. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

    在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...