34.如何获取app(apk和ipa)中的资源
移动互联网中,主要的两个平台是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;
}
-------------------------------------------------------------------------------------------------
打开链接 app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。
【作者】曾健生
【QQ】190678908
【app后端qq群】254659220
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi
如果您觉得文章对你有所帮助,欢迎打赏。
微信打赏:
支付宝打赏:
版权声明:本文为博主原创文章,未经博主允许不得转载。
34.如何获取app(apk和ipa)中的资源的更多相关文章
- 把app(apk和ipa文件)安装包放在服务器上供用户下方法
怎么把app(apk和ipa文件)安装包放在服务器上供用户下载? IIS服务器网站不能下载.apk文件的原因:IIS的默认MIME类型中没有.apk文件,所以无法下载.解决办法:给.apk格式文件添加 ...
- MFC中获取App,MainFrame,Doc和View类等指针的方法
From: http://hi.baidu.com/wxnxs/item/156a68f5b3b4ed18e3e3bd03 MFC中获取App,MainFrame,Doc和View类等指针的方法 ...
- 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)
原文:在论坛中出现的比较难的sql问题:34(递归 获取连续值问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 小程序中关于获取app实例与当前组件
1.getApp()来获取 App 实例 2.getCurrentPages()获取前页面栈
- 解压Assets.car获取App中的图片资源
iOS开发时图片资源(png)是放置在Images.xcassets文件夹中进行管理的. 项目归档后就是ipa文件,在ipa文件中,Images.xcassets文件夹的内容放置在了Assets.ca ...
- Expo大作战(十八)--expo如何发布成独立应用程序,打包成apk或者ipa,发布到对应应用商店
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- APP store 上架过程中碰到的那些坑&被拒的各种奇葩原因整理&审核指南中文版
苹果官方发布的十大常见被拒原因 1.崩溃次数和Bug数量.苹果要求开发者在将应用提交给App Store之前彻查自己的应用,以尽量避免Bug的存在. 2.链或错误的链接.应用中所有的链接必须是真实且有 ...
- 获取APP应用的包名信息
语言: python 3.7 需求:获取APP的包名和程序入口信息,以便在 Appium 脚本中配置 appPackage 和 appActivity 参数. 场景一 资源:已有APP应用的apk安装 ...
- Appium+Python自动化 3 -获取 app 包名和 activity
方法一: ①手机通过USB连接电脑 ②打开手机上被测app ③在电脑上 dos命令窗口,输入命令 adb shell dumpsys window w | findstr \/ | findstr n ...
随机推荐
- SQLSERVER 性能优化之Perfmon指标
Perfmon是Windows系统性能监视程序.用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等. Processor/%Privileged Time阀值:如果数值持续大于75%就表示存在 ...
- shc/unshc加/解密shell脚本
一.加密软件shcshc是linux的一款加密脚本的插件东西比较安全我们可以利用wget将文件放在root目录下也可以通过sftp放在root目录也可以直接利用cd命令选择目录一切随意shc官网:ht ...
- c# https请求
遇到Https网站,c# http请求的时候,总是报SSL连接错误.后来经搜索,发现有解决方案: .net 2.0 需要引入一个第三方组件:BouncyCastle.dll,这是我写的一个例子: p ...
- Mysql创建索引
1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...
- javascript初学者必须注意的7个细节
[IT168 技术]每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文列举Java ...
- 使用 Babylon.js 在 HTML 页面加载 3D 对象
五一 Windwos Blogs 推了一篇博客, Babylon.js v3.2 发布了.因为一直有想要在自己博客上加载 3D 对象的冲动,这两天正好看到了,就动手研究研究.本人之前也并没有接触过 W ...
- 面试(三)---volatile
一.前言 最近去成都玩了一圈,整体感觉还不错,辞职以后工作找的也很顺利,随着年龄增加自己也考虑定居和个人长期发展的问题,反正乱七八糟的事,总之需要好好屡屡思路,不能那么着急下定论,当然我对 ...
- .net捕捉全局未处理异常的3种方式
前言: 我们在实际项目开发中,经常会遇到一些不可预见的异常产生,有的异常在程序运行时就对其进行处理(try)但是,有的程序不需要每一个地方都用try进行处理,那么针对这种情况,可以参照下面的方式,实现 ...
- 关于HTTP请求、Ajax请求,请求的同步和异步
使用了很长时间的Ajax请求了,一直都是在以异步的方式在使用.昨天听了一个讲座涉及到apache server,偶然想到了这Ajax请求和HTTP请求的一些区别和联系,就在网上好好搜了一顿,把搜到的结 ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...