移动互联网中,主要的两个平台是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. Laravel [1045] 解决方法 Access denied for user 'homestead'@'localhost'

    这几天学习Laravel框架遇到了数据库方面的问题. PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denie ...

  2. struts通过action返回json

    其实struts2通过action返回json挺简单的,但是就是老要忘,所以索性写在博客上.好的,开始. 首先是引入必须的jar包: struts2-json-plugin-2.3.24.jar 然后 ...

  3. 十二种获取Spring的上下文环境ApplicationContext的方法

    转载:https://my.oschina.net/u/2391658/blog/729414

  4. java多线程-锁

    自 Java 5 开始,java.util.concurrent.locks 包中包含了一些锁的实现,因此你不用去实现自己的锁了.但是你仍然需要去了解怎样使用这些锁. 一个简单的锁 让我们从 java ...

  5. 向ES6靠齐的Class.js

    写在前面 在2008年的时候,John Resig写了一 Class.js,使用的方式如下: var Person = Class.extend({ init: function(isDancing) ...

  6. mvc中form表单提交的几种形式

    第一种方式:submit 按钮 提交 <form action="MyDemand" method="post"> <span>关键字: ...

  7. MYSQL进阶,新手变司机

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  8. sharepoint powershell 批量处理匿名访问

    配置Web Application启用匿名访问 Add-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyCont ...

  9. Sharepoint学习笔记—ECM系列—文档列表的Metedata Navigation与Key Filter功能的实现

    如果一个文档列表中存放了成百上千的文档,想要快速的找到你想要的还真不是件容易的事,Sharepoint提供了Metedata Navigation与Key Filter功能可以帮助我们快速的过滤和定位 ...

  10. GitHub for Windows提交失败“failed to sync this branch”

    今天github for windows同步推送远端github出问题了,提交到本地没问题,远端一直推送不上去,挺棘手的,试了几个网上的方法不管用.问题如下,报这个错: failed to sync ...