zoukankan      html  css  js  c++  java
  • 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 


    如果您觉得文章对你有所帮助,欢迎打赏。


    微信打赏:



    支付宝打赏:

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Vue数组循环
    vue使用swiper6分页器踩坑
    Vue基础语法(四)
    Vue安装jquery
    Vue基础语法(三)
    Too Rich(贪心加搜索)
    ZOJ Anagrams by Stack(堆栈中的搜索)
    最长子序列和(分治法实现)
    幸运数字(数位dp)
    蜥蜴和地下室(深搜)
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926719.html
Copyright © 2011-2022 走看看