Java程序從apk和ipa中獲取資源

需求:


給一個(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)化后圖片的路徑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容