需求:
給一個(gè)apk或者ipa,通過Java代碼獲取該包的圖片、版本號、包名、大小等信息
知識儲備:
?Java:File文件讀寫操作、ZipFile文件讀寫操作、IO輸入輸出流、調(diào)用shell命令...
?Android:aapt查看apk內(nèi)容,對其內(nèi)容的了解。
?iOS:info.plist文件的結(jié)構(gòu)。
使用GetApkInfo.jar:
1、配置工程的build path,將apptool.jar、ipa-parse.jar兩個(gè)文件導(dǎo)入工程中。
2、將mac版和windows版的的aapt文件均放在工程中的/bin目錄里。
獲取apk資源原理:(一般有兩種方式)
1、獲取AndroidManifest.xml文件,解析.xml后獲取相應(yīng)版本號、包名等信息。使用apktool工具,apk進(jìn)行反編譯后獲取破解的.xml文件,如果不反編譯,直接將.apk改為.zip文件,得到的.xml文件是被加密,打不開的。
2、直接使用Android SDK中build-tools目錄下的appt文件,在shell里面調(diào)用aapt命令對apk進(jìn)行編譯。命令如下:aapt dump badging xxx.apk
常用的為第二種方法,需要處理的數(shù)據(jù)比較簡單,第一種方法由于apktool工具有版本限制,如果使用舊版本可能反編譯不了最新的apk,而且.xml的信息需要額外到res資源下去獲取,例如應(yīng)用程序的名字,在.xml里面保存的僅是ID號,得另外在res/里面找到String.xml,根據(jù)ID號去獲取真正的名字,較為麻煩。而且不是每個(gè)apk都能用apktool反編譯,很多apk經(jīng)過處理就不行了。
圖片的獲取:使用第二種方法已經(jīng)能獲取大部分資源,不過都是以字符串形式,所以想要獲取圖片的話,得額外處理。利用ZipFile根據(jù)apk生成zip格式的文件,然后解壓zip,取得file。根據(jù)圖片的路徑(名字)來到file里面找到相應(yīng)圖片。(iOS系統(tǒng)獲取圖片通用)
獲取ipa資源原理:
ipa資源的獲取相對于apk來說較為簡單,因?yàn)閕OS把很多信息都直接保存在info.plist文件里面,利用ZipFile根據(jù)ipa生成zip格式的文件后解壓,直接找到info.plist即可。注意,iOS系統(tǒng)有分iPhone和iPad兩種設(shè)備,其在.plist的字段名也不一樣??梢愿鶕?jù).plist里面的deviceFamily字段來判斷是什么設(shè)備,1為iphone,2為ipad,數(shù)組1,2則為通用。常用字段如下:
應(yīng)用名稱:CFBundleDisplayName,如果沒有則為CFBundleName
版本號:CFBundleVersion
包名:CFBundleIdentifier
最小系統(tǒng):MinimumOSVersion
iPhone圖標(biāo)的字段:
CFBundleIcons ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dic字段
? ? ? ? ?CFBundlePrimaryIcon ? ? ? ? ? ? ? ? dic字段
? ? ? ? ? ? ? ? ? ?CFBundleIconFiles ? ? ? ? ? ?array字段
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr[0]
iPad圖標(biāo)的字段:
CFBundleIcons~ipad
? ? ? ? ? CFBundlePrimaryIcon
? ? ? ? ? ? ? ? ? ?CFBundleIconFiles
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arr[0]
解析.plist時(shí)由于字段用的是iOS的方法, 因此我們需要導(dǎo)入能使用iOS方法的.jar包,在configure build path里面配置。鏈接在后面,使用方法如下:
// xxx表示要解析的plist文件
NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(xxx);
// CFBundleIdentifier表示要獲取的字段,
NSString parameters=(NSString) rootDict.objectForKey("CFBundleIdentifier");
// 還要將獲取到的字段轉(zhuǎn)化成Java語法
String str = parameters.toString()
ipa文件中獲取圖片資源的方法同apk一樣。
API說明:
初始化apk / ipa的信息
功能描述:初始化apk/ipa的信息
函數(shù)原型:
newGetAppInfo(String appPath) ;
參數(shù)說明:
apk或者ipa的絕對路徑
返回結(jié)果:
無
獲取apk/ipa的信息
功能描述:記錄apk/ipa的信息
函數(shù)原型:
ApkInfo.getInstance().getXXX() ;
參數(shù)說明:
ApkInfo為單例,getInstance()為實(shí)例化
返回結(jié)果:
getXXX()表示返回的的版本號、應(yīng)用名字、包名等信息(String格式)
注意:只有照片是byte[]格式,其它都是String格式
記錄apk/ipa的信息
功能描述:獲取apk/ipa的信息
函數(shù)原型:
ApkInfo.getInstance().setXXX(String str) ;
(ApkInfo為單例,getInstance()為實(shí)例化)
參數(shù)說明:
str表示需要記錄的版本號、應(yīng)用名字、包名等信息(String格式)
注意:只有照片是byte[]格式,其它都是String格式
返回結(jié)果:
無
將圖片從byte[]格式轉(zhuǎn)化為.png格式
功能描述:將圖片從byte[]格式轉(zhuǎn)化為.png格式
函數(shù)原型:
ImageUtil.byte2image(byte[] data,String path)
參數(shù)說明:
byte[] data:表示需要轉(zhuǎn)化的圖片byte[]
path:表示轉(zhuǎn)化后圖片的路徑