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

需求:


给一个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中获取资源)