本發(fā)明涉及android系統(tǒng)和程序分析領(lǐng)域。具體地,涉及一種基于字節(jié)碼插樁技術(shù)的android程序監(jiān)控系統(tǒng)及方法。
背景技術(shù):
隨著android系統(tǒng)設(shè)備數(shù)量的增加,android應(yīng)用程序覆蓋到的用戶數(shù)量越來越大,分析android應(yīng)用程序的性能瓶頸,潛在問題,能夠提高android應(yīng)用程序的用戶體驗(yàn),定量化的進(jìn)行android程序監(jiān)控和android程序分析的需求越來越迫切。通常進(jìn)行運(yùn)行監(jiān)控和動(dòng)態(tài)分析,需要開發(fā)者在應(yīng)用程序的源代碼中插入監(jiān)控代碼,人工或使用程序?qū)ΡO(jiān)控日志進(jìn)行分析,得到程序的性能問題。
然而,在開發(fā)者真實(shí)操作android程序監(jiān)控的過程中,需要在程序的源代碼中進(jìn)行如下操作:
首先,在項(xiàng)目的依賴中,添加程序監(jiān)控庫(kù)。
然后,在需要監(jiān)控的功能點(diǎn)中,插入監(jiān)控入口代碼,通常稱為“埋點(diǎn)”。
其次,也許要注冊(cè)添加監(jiān)控程序需要的,原本的程序不包含的額外權(quán)限。
最后,對(duì)監(jiān)控日志進(jìn)行人工或者自動(dòng)化的分析,得到結(jié)果。
除此之外,當(dāng)程序業(yè)務(wù)邏輯增加或變更的時(shí)候,需要修改或再人工插入監(jiān)控代碼。
上述五點(diǎn)讓android程序監(jiān)控并不能很方便的實(shí)現(xiàn),監(jiān)控程序和分析程序也缺少可復(fù)用性。
目前沒有發(fā)現(xiàn)同本發(fā)明類似技術(shù)的說明或報(bào)道,也尚未收集到國(guó)內(nèi)外類似的資料。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的上述不足,本發(fā)明的目的是提供一種基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng)及方法,該系統(tǒng)及方法通過字節(jié)碼插樁技術(shù),從外部為android應(yīng)用程序添加多種程序性能、程序正確性的監(jiān)控模塊,使得應(yīng)用程序開發(fā)者能夠根據(jù)監(jiān)控模塊得到的數(shù)據(jù),提高android應(yīng)用程序的性能和健壯性。
本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng),包括:
-基于字節(jié)碼分析的android程序dex文件注入模塊,用于向android應(yīng)用程序中注入android程序監(jiān)控dex文件;
-android程序監(jiān)控模塊,用于存放android程序監(jiān)控dex文件。
優(yōu)選地,該監(jiān)控系統(tǒng)還包括:
-監(jiān)控日志分析模塊,用于提取和分析通過android程序監(jiān)控dex文件生成的android設(shè)備監(jiān)控日志。
優(yōu)選地,所述android程序監(jiān)控dex文件包括如下任一個(gè)或任多個(gè)監(jiān)控信息:
-android應(yīng)用程序崩潰信息;
-android應(yīng)用程序未響應(yīng)信息;
-android應(yīng)用程序內(nèi)存不足信息;
-http請(qǐng)求及請(qǐng)求響應(yīng)內(nèi)容和響應(yīng)時(shí)長(zhǎng)信息;
-網(wǎng)絡(luò)請(qǐng)求的總流量統(tǒng)計(jì)和具體耗費(fèi)流量api細(xì)分信息;
-圖片加載api耗時(shí)時(shí)間信息;
-cpu使用率和堆內(nèi)存使用大小信息。
根據(jù)本發(fā)明的另一個(gè)方面,提供了一種基于字節(jié)碼插樁的android程序監(jiān)控方法,包括如下步驟:
通過插樁的方式,在android應(yīng)用程序的文件注入入口注入android程序監(jiān)控dex文件,并通過android程序監(jiān)控dex文件生成android設(shè)備的監(jiān)控日志。
優(yōu)選地,具體包括如下子步驟:
-分析步驟:
步驟s1.1:將android應(yīng)用程序的apk文件解包,生成若干android應(yīng)用程序的程序邏輯dex文件;
步驟s1.2:使用android程序dex文件注入模塊,分析程序邏輯dex文件的文件格式,得到程序邏輯dex文件需要注入android程序監(jiān)控dex文件的入口,即android應(yīng)用程序的文件注入入口;
步驟s1.3:插樁:使用android程序dex文件注入模塊,將android程序監(jiān)控dex文件注入到相應(yīng)的android應(yīng)用程序的文件注入入口;
步驟s1.4:將被注入的android程序監(jiān)控dex文件和程序邏輯dex文件重新打包,得到插樁過的android應(yīng)用程序;
步驟s1.5:將插樁過的android應(yīng)用程序安裝在android設(shè)備中,在android應(yīng)用程序運(yùn)行時(shí),注入的android程序監(jiān)控dex文件生成多個(gè)維度的監(jiān)控日志,以日志文件形式存儲(chǔ)在android設(shè)備中。
優(yōu)選地,所述步驟s1.1中,apk文件格式與標(biāo)準(zhǔn)zip壓縮包格式相同,通過使用任意zip解包工具進(jìn)行解包。
優(yōu)選地,所述步驟s1.5中,在生成監(jiān)控日志前,還包括如下步驟:
對(duì)插樁過的android應(yīng)用程序進(jìn)行人工測(cè)試或者自動(dòng)化測(cè)試。
優(yōu)選地,該監(jiān)控方法還包括如下子步驟:
-分析步驟:
s2.1:使用監(jiān)控日志分析模塊,將若干android設(shè)備的監(jiān)控日志取出;
s2.2:使用監(jiān)控日志分析模塊,分析取出的監(jiān)控日志,得到監(jiān)控分析結(jié)果報(bào)表。
優(yōu)選地,所述步驟s2.2中,還包括如下步驟:
通過監(jiān)控分析結(jié)果對(duì)android應(yīng)用程序進(jìn)行優(yōu)化。
優(yōu)選地,所述插樁的方式,采用如下任意一種方法:
方法一,將android程序監(jiān)控dex文件的dex字節(jié)碼注入到android應(yīng)用程序文件注入入口處的指定函數(shù)的開頭或者結(jié)尾;
方法二,將android應(yīng)用程序文件注入入口處的指定函數(shù)a的調(diào)用代碼修改為android程序監(jiān)控dex文件中用來替代該指定函數(shù)a調(diào)用代碼的函數(shù)b。
本發(fā)明提供了一種基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng)及方法,該系統(tǒng)及方法是一種通用的android應(yīng)用程序監(jiān)控方案,通過使用該系統(tǒng)及方法,能夠大幅度減少開發(fā)人員對(duì)android程序監(jiān)控的工作開銷,通過字節(jié)碼插樁技術(shù),還能抓取到通過“埋點(diǎn)”方法無法抓去的程序性能、正確性信息,進(jìn)行更深層次的程序分析。除此之外,本發(fā)明還提供了監(jiān)控日志分析模塊,自動(dòng)化根據(jù)監(jiān)控日志生成android應(yīng)用程序的潛在問題。通過本發(fā)明提供的基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng)及方法,開發(fā)者能夠不用修改程序的任何源代碼,無縫將該套工具集成進(jìn)入測(cè)試流程,根據(jù)分析結(jié)果得到潛在問題。
本發(fā)明可以做到在不修改程序源代碼的情況下收集到以上信息,且不限于以上信息。
附圖說明
通過閱讀參照以下附圖對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:
圖1為本發(fā)明方法流程示意圖。
具體實(shí)施方式
下面對(duì)本發(fā)明的實(shí)施例作詳細(xì)說明:本實(shí)施例在以本發(fā)明技術(shù)方案為前提下進(jìn)行實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程。應(yīng)當(dāng)指出的是,對(duì)本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。
實(shí)施例
本實(shí)施例提供了一種基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng),包括:
-基于字節(jié)碼分析的android程序dex文件注入模塊,用于向android應(yīng)用程序中注入android程序監(jiān)控dex文件;
-android程序監(jiān)控模塊,用于存放android程序監(jiān)控dex文件。
進(jìn)一步地,該監(jiān)控系統(tǒng)還包括:
-監(jiān)控日志分析模塊,用于提取和分析通過android程序監(jiān)控dex文件生成的android設(shè)備監(jiān)控日志。
進(jìn)一步地,所述android程序監(jiān)控dex文件包括如下任一個(gè)或任多個(gè)監(jiān)控信息:
-android應(yīng)用程序崩潰信息;
-android應(yīng)用程序未響應(yīng)信息;
-android應(yīng)用程序內(nèi)存不足信息;
-http請(qǐng)求及請(qǐng)求響應(yīng)內(nèi)容和響應(yīng)時(shí)長(zhǎng)信息;
-網(wǎng)絡(luò)請(qǐng)求的總流量統(tǒng)計(jì)和具體耗費(fèi)流量api細(xì)分信息;
-圖片加載api耗時(shí)時(shí)間信息;
-cpu使用率和堆內(nèi)存使用大小信息。
本實(shí)施例基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng),其監(jiān)控方法,包括如下步驟:
通過插樁的方式,在android應(yīng)用程序的文件注入入口注入android程序監(jiān)控dex文件,并通過android程序監(jiān)控dex文件生成android設(shè)備的監(jiān)控日志。
進(jìn)一步地,具體包括如下子步驟:
-分析步驟:
步驟s1.1:將android應(yīng)用程序的apk文件解包,生成若干android應(yīng)用程序的程序邏輯dex文件。
步驟s1.2:使用android程序dex文件注入模塊,分析程序邏輯dex文件的文件格式,得到程序邏輯dex文件需要注入android程序監(jiān)控dex文件的入口(android應(yīng)用程序的文件注入入口)。
步驟s1.3:插樁:使用android程序dex文件注入模塊,將android程序監(jiān)控dex文件注入到相應(yīng)的android應(yīng)用程序的文件注入入口。
具體注入方法有兩種:一是注入dex字節(jié)碼到被注入dex文件具體某個(gè)函數(shù)的開頭或者結(jié)尾,這樣才能保證不會(huì)破壞原dex文件的正常結(jié)構(gòu);二是修改被注入的dex文件具體某個(gè)函數(shù)的調(diào)用代碼為注入的dex文件的具體某個(gè)函數(shù),類似于重定向技術(shù)。
要保證android應(yīng)用程序的程序邏輯dex文件在插樁后依然能夠運(yùn)行,就不能破壞其格式,因此具體的android程序監(jiān)控dex文件插樁方法對(duì)本實(shí)施例的實(shí)施非常關(guān)鍵。
本實(shí)施例的具體插樁方法有兩種:
一是插樁dex字節(jié)碼,將android程序監(jiān)控dex文件的dex字節(jié)碼注入到待插樁dex文件(android應(yīng)用程序文件注入入口處)具體某個(gè)函數(shù)(指定函數(shù))的開頭或者結(jié)尾,這樣保證不會(huì)破壞原dex文件的正常結(jié)構(gòu);
二是修改待插樁的dex文件具體某個(gè)函數(shù)a的調(diào)用代碼,將待插樁的dex文件(android應(yīng)用程序文件注入入口處)的某個(gè)函數(shù)a(指定函數(shù)a)的調(diào)用代碼修改為插樁的dex文件(android程序監(jiān)控dex文件)中的某個(gè)用來替代原函數(shù)a調(diào)用代碼的函數(shù)b,類似于重定向技術(shù)。
在上述插樁方法中,對(duì)于待插樁dex文件的具體某個(gè)函數(shù)(指定函數(shù))的確定,通常采用如下方式:
第a步:使用反編譯工具(例如smali,android領(lǐng)域內(nèi)的知名反編譯工具)反編譯待插樁dex文件。
第b步:使用android程序dex文件注入模塊,讀取android程序監(jiān)控dex文件(監(jiān)控程序),android程序監(jiān)控dex文件(監(jiān)控程序)中指定了具體要被插樁的庫(kù)和函數(shù)(即指定函數(shù))。
第c步:從反編譯的待插樁dex文件中,匹配android程序監(jiān)控dex文件(監(jiān)控程序)指定的要被插樁的函數(shù)(指定函數(shù)),得到文件注入入口。
步驟s1.4:將被注入的android程序監(jiān)控dex文件和程序邏輯dex文件重新打包,得到插樁過的android應(yīng)用程序。
步驟s1.5:將插樁過的android應(yīng)用程序安裝在android設(shè)備中,在android應(yīng)用程序運(yùn)行時(shí),注入的android程序監(jiān)控dex文件生成多個(gè)維度的監(jiān)控日志,,并以日志文件形式存儲(chǔ)在android設(shè)備中。
通過分析監(jiān)控日志,得到android程序多個(gè)維度的監(jiān)控分析報(bào)表。
進(jìn)一步地,所述步驟s1.1中,apk文件格式與標(biāo)準(zhǔn)zip壓縮包格式相同,通過使用任意zip解包工具進(jìn)行解包。
進(jìn)一步地,所述步驟s1.5中,在生成監(jiān)控日志前,還包括如下步驟:
對(duì)插樁過的android應(yīng)用程序進(jìn)行人工測(cè)試或者自動(dòng)化測(cè)試。
進(jìn)一步地,該監(jiān)控方法還包括如下子步驟:
-分析步驟:
s2.1:使用監(jiān)控日志分析模塊,將若干android設(shè)備的監(jiān)控日志取出;
s2.2:使用監(jiān)控日志分析模塊,分析取出的監(jiān)控日志,得到監(jiān)控分析結(jié)果報(bào)表。
優(yōu)選地,所述步驟s2.2中,還包括如下步驟:
通過監(jiān)控分析結(jié)果對(duì)android應(yīng)用程序進(jìn)行優(yōu)化。
在本實(shí)施例中:
分析程序邏輯dex文件的文件格式,使用smali工具將dex文件進(jìn)行反編譯。
android程序監(jiān)控dex文件通過調(diào)用android系統(tǒng)api并寫入文件,生成android設(shè)備的監(jiān)控日志。
下面結(jié)合附圖對(duì)本實(shí)施例進(jìn)一步描述。
本實(shí)施例提供的基于字節(jié)碼插樁的android程序監(jiān)控系統(tǒng),通過各模塊提供如下工具:
基于字節(jié)碼分析的android程序dex文件注入模塊,提供了基于字節(jié)碼分析的android程序dex文件注入工具。
android程序監(jiān)控模塊,用于存放被注入的android程序監(jiān)控程序(即,android程序監(jiān)控dex文件)。
監(jiān)控日志分析模塊,提供了監(jiān)控日志分析工具。
如圖1所示,本實(shí)施例提供的的基于字節(jié)碼插樁的android程序監(jiān)控方法,主要包括兩個(gè)步驟,注入步驟和分析步驟。
其中注入步驟的具體執(zhí)行步驟如下:
步驟s1.1:將android應(yīng)用程序的apk文件解包,該apk文件格式與標(biāo)準(zhǔn)的zip壓縮包格式相同,使用任意zip解包工具即可解包;生成若干android應(yīng)用程序的程序邏輯dex文件;
步驟s1.2:解包后有若干android應(yīng)用程序的程序邏輯代碼,以dex文件格式的形式存在,通常稱為“字節(jié)碼”(即,程序邏輯dex文件),使用android程序dex文件注入工具(即,android程序dex文件注入模塊),分析程序邏輯dex文件的文件格式,得到需要注入android程序監(jiān)控dex文件的入口;
步驟s1.3:使用android程序dex文件注入工具(即,android程序dex文件注入模塊),將android程序監(jiān)控dex文件注入到相應(yīng)的入口,這一步稱為插樁;
步驟s1.4:將被注入的android程序監(jiān)控dex文件和其他解包文件(程序邏輯dex文件)重新打包,得到插樁過的android應(yīng)用程序;
步驟s1.5:使用者將插樁過的android應(yīng)用程序安裝到android設(shè)備上,進(jìn)行人工測(cè)試或者自動(dòng)化測(cè)試,注入的監(jiān)控程序(即,android程序監(jiān)控dex文件)會(huì)將監(jiān)控日志寫入到android設(shè)備文件中。
分析步驟的具體執(zhí)行步驟如下:
步驟s2.1:使用監(jiān)控日志分析工具(即,監(jiān)控日志分析模塊),將若干android設(shè)備的監(jiān)控日志取出;
步驟s2.2:使用監(jiān)控日志分析工具(即,監(jiān)控日志分析模塊),分析取出的監(jiān)控日志,得到監(jiān)控分析結(jié)果報(bào)表。
通過監(jiān)控分析結(jié)果實(shí)現(xiàn)對(duì)android應(yīng)用程序的優(yōu)化。
本實(shí)施例實(shí)現(xiàn)android程序監(jiān)控功能的核心是被注入的android程序監(jiān)控程序(即,android程序監(jiān)控dex文件),具體包含的監(jiān)控功能和監(jiān)控信息都在該文件中實(shí)現(xiàn),包括如下任意一項(xiàng)或任意多項(xiàng):
android應(yīng)用程序崩潰的信息收集。
android應(yīng)用程序未響應(yīng)(anr)的信息收集。
android應(yīng)用程序內(nèi)存不足的信息收集。
http請(qǐng)求及請(qǐng)求響應(yīng)內(nèi)容和響應(yīng)時(shí)長(zhǎng)。
網(wǎng)絡(luò)請(qǐng)求的總流量統(tǒng)計(jì)和具體耗費(fèi)流量的api細(xì)分。
圖片加載api耗時(shí)時(shí)間。
cpu使用率和堆內(nèi)存使用大小。
通過本實(shí)施例的系統(tǒng)及方法,可以做到在不修改程序源代碼的情況下收集到以上信息,且不限于以上信息。
以上對(duì)本發(fā)明的具體實(shí)施例進(jìn)行了描述。需要理解的是,本發(fā)明并不局限于上述特定實(shí)施方式,本領(lǐng)域技術(shù)人員可以在權(quán)利要求的范圍內(nèi)做出各種變形或修改,這并不影響本發(fā)明的實(shí)質(zhì)內(nèi)容。