需求:
给一个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:表示转化后图片的路径