美文网首页iOS|Android.全球
Java程序从apk和ipa中获取资源

Java程序从apk和ipa中获取资源

作者: ihuangyg | 来源:发表于2016-03-17 11:34 被阅读0次

    需求:


    给一个apk或者ipa,通过Java代码获取该包的图片、版本号、包名、大小等信息

    知识储备:


     Java:File文件读写操作、ZipFile文件读写操作、IO输入输出流、调用shell命令...

     Android:aapt查看apk内容,对其内容的了解。

     iOS:info.plist文件的结构。

    使用GetApkInfo.jar


    1、配置工程的build path,将apptool.jar、ipa-parse.jar两个文件导入工程中。

    2、将mac版和windows版的的aapt文件均放在工程中的/bin目录里。

    获取apk资源原理:(一般有两种方式)


    1、获取AndroidManifest.xml文件,解析.xml后获取相应版本号、包名等信息。使用apktool工具,apk进行反编译后获取破解的.xml文件,如果不反编译,直接将.apk改为.zip文件,得到的.xml文件是被加密,打不开的。

    2、直接使用Android SDK中build-tools目录下的appt文件,在shell里面调用aapt命令对apk进行编译。命令如下:aapt dump badging xxx.apk

    常用的为第二种方法,需要处理的数据比较简单,第一种方法由于apktool工具有版本限制,如果使用旧版本可能反编译不了最新的apk,而且.xml的信息需要额外到res资源下去获取,例如应用程序的名字,在.xml里面保存的仅是ID号,得另外在res/里面找到String.xml,根据ID号去获取真正的名字,较为麻烦。而且不是每个apk都能用apktool反编译,很多apk经过处理就不行了。

    图片的获取:使用第二种方法已经能获取大部分资源,不过都是以字符串形式,所以想要获取图片的话,得额外处理。利用ZipFile根据apk生成zip格式的文件,然后解压zip,取得file。根据图片的路径(名字)来到file里面找到相应图片。(iOS系统获取图片通用)

    获取ipa资源原理:


    ipa资源的获取相对于apk来说较为简单,因为iOS把很多信息都直接保存在info.plist文件里面,利用ZipFile根据ipa生成zip格式的文件后解压,直接找到info.plist即可。注意,iOS系统有分iPhone和iPad两种设备,其在.plist的字段名也不一样。可以根据.plist里面的deviceFamily字段来判断是什么设备,1为iphone,2为ipad,数组1,2则为通用。常用字段如下:

    应用名称:CFBundleDisplayName,如果没有则为CFBundleName

    版本号:CFBundleVersion

    包名:CFBundleIdentifier

    最小系统:MinimumOSVersion

    iPhone图标的字段:

    CFBundleIcons                                    dic字段

             CFBundlePrimaryIcon                 dic字段

                       CFBundleIconFiles            array字段

                                 arr[0]

    iPad图标的字段:

    CFBundleIcons~ipad

              CFBundlePrimaryIcon

                       CFBundleIconFiles

                                 arr[0]

    解析.plist时由于字段用的是iOS的方法, 因此我们需要导入能使用iOS方法的.jar包,在configure build path里面配置。链接在后面,使用方法如下:

    // xxx表示要解析的plist文件

    NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(xxx);

    // CFBundleIdentifier表示要获取的字段,

    NSString parameters=(NSString) rootDict.objectForKey("CFBundleIdentifier");

    // 还要将获取到的字段转化成Java语法

    String str = parameters.toString()

    ipa文件中获取图片资源的方法同apk一样。

    API说明:


    初始化apk / ipa的信息

    功能描述:初始化apk/ipa的信息

    函数原型:

    newGetAppInfo(String appPath) ;

    参数说明:

    apk或者ipa的绝对路径

    返回结果:

    获取apk/ipa的信息

    功能描述:记录apk/ipa的信息

    函数原型:

    ApkInfo.getInstance().getXXX() ;

    参数说明:

    ApkInfo为单例,getInstance()为实例化

    返回结果:

    getXXX()表示返回的的版本号、应用名字、包名等信息(String格式)

    注意:只有照片是byte[]格式,其它都是String格式

    记录apk/ipa的信息

    功能描述:获取apk/ipa的信息

    函数原型:

    ApkInfo.getInstance().setXXX(String str) ;

    (ApkInfo为单例,getInstance()为实例化)

    参数说明:

    str表示需要记录的版本号、应用名字、包名等信息(String格式)

    注意:只有照片是byte[]格式,其它都是String格式

    返回结果:

    将图片从byte[]格式转化为.png格式

    功能描述:将图片从byte[]格式转化为.png格式

    函数原型:

    ImageUtil.byte2image(byte[] data,String path)

    参数说明:

    byte[] data:表示需要转化的图片byte[]

    path:表示转化后图片的路径

    相关文章

      网友评论

        本文标题:Java程序从apk和ipa中获取资源

        本文链接:https://www.haomeiwen.com/subject/jzkclttx.html