移动互联网中,主要的两个平台是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. B-Tree索引在sqlserver和mysql中的应用

    在谈论数据库性能优化的时候,通常都会提到“索引”,但很多人其实并没有真正理解索引,也没有搞清楚索引为什么就能加快检索速度,以至于在实践中并不能很好的应用索引.事实上,索引是一种廉价而且十分有效的优化手 ...

  2. 监听页面上的checkbox是否选中

    第一种 <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>checke ...

  3. JS 预解释相关理解

    1.JS中的内存空间分为两种:栈内存.堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存 堆内存:存储引用数据类型的值(对象是把属性名和 ...

  4. 2016年4月最佳的20款 jQuery 插件推荐

    这个列表包括20个我们觉得是最有用的免费的 jQuery 插件,它们都是最具创新性和最省时省力的解决方案,很多都是现代化的设计和开发中碰到的问题的处理方案.如果你熟悉下面列出的任何插件,请与我们的读者 ...

  5. webpack继续

    序言:继续上一篇<webpack初入> 1.上一篇配置完成后最终的命令是:webpack,如果更改package.json中的一个配置如下: 换为 此时最终的命令:npm start等同于 ...

  6. http 缓存相关学习

    在面试中被问到好多缓存的问题  200 cache cookies 304(304 和 200 cache的区别) cookies在什么时候创建  发送  等等  自己回答的并不是很好 这次仔细的学习 ...

  7. #8.31课堂总结#JS基础

    一.Javascript能做些什么? 表单数据合法性验证 网页特效:使用DOM和CSS可以实现网页特效 交互式菜单:创作具有动态效果的交互式菜单,完全能够与flash制作的导航菜单相媲美 动态页面:使 ...

  8. 缓存、队列(Memcached,Redis,rabbitMQ)

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...

  9. 移动端web开发总结

    前一个星期实战完一个PC端的基于HTML+CSS的项目,这几天则接触了移动端的开发,同样也是在HTML+CSS的基础上完成.虽然第一次接触移动端的开发,但在开发过程中,我也是按照PC端的开发步骤来进行 ...

  10. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

    原地址 :http://www.cnblogs.com/wangmars/p/3914090.html SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中 ...