可遷移函數(shù)執(zhí)行時間的獲得方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供了一種可遷移函數(shù)執(zhí)行時間的獲得方法及系統(tǒng),其中,該可遷移函數(shù)執(zhí)行時間的獲得方法包括:對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系;根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù);加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。本發(fā)明實施例,不需要應(yīng)用程序源代碼,也不需要修改dex文件即可實現(xiàn)對Android可執(zhí)行程序中函數(shù)調(diào)用關(guān)系的分析,從而根據(jù)限制條件得到可遷移到云端執(zhí)行的可遷移函數(shù),再分析這些遷移函數(shù)的執(zhí)行時間,相比于現(xiàn)有的方法,有更強的適用性。
【專利說明】可遷移函數(shù)執(zhí)行時間的獲得方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及在計算機技術(shù),尤其涉及一種可遷移函數(shù)執(zhí)行時間的獲得方法及系統(tǒng)。
【背景技術(shù)】
[0002]相對于其它的移動設(shè)備,手機的可攜帶性和通信性更強,可以提供7X24小時的網(wǎng)絡(luò)接入。但受制于硬件的限制,手機的計算能力和存儲能力都很有限,而云計算卻擁有超強的計算能力和存儲能力以及諸多的優(yōu)勢,如果將二者結(jié)合起來,即分析應(yīng)用程序的哪些部分在手機上運行比較耗時,將耗時的部分放到云端執(zhí)行,從而加快應(yīng)用程序的執(zhí)行速度,提供更好的用戶體驗。在當(dāng)前的手機操作系統(tǒng)中,安卓(Android)是主流手機操作系統(tǒng),因此我們主要分析Android應(yīng)用程序的兩個關(guān)鍵問題:第一個問題是分析Android應(yīng)用程序中滿足遷移條件的函數(shù),即這些函數(shù)沒有涉及本地資源,比如用戶界面(UI)、硬件資源等;第二個問題是在第一個問題的基礎(chǔ)上分析在手機上運行比較耗時的函數(shù)。
[0003]針對第一個問題:如何分析Android應(yīng)用程序中哪些函數(shù)可以遷移到云端執(zhí)行?這個問題的解決辦法是過濾掉那些涉及本地資源的函數(shù)(比如:與U1、硬件、網(wǎng)絡(luò)相關(guān)的函數(shù)和本地(NATIVE)函數(shù))以及直接和間接調(diào)用這些涉及本地資源的函數(shù),過濾前者的原因是這些函數(shù)需要手機端的本地資源,云端無法提供,過濾后者的原因是,C調(diào)用B,B調(diào)用A (A — B — C),如果A函數(shù)涉及本地資源,則B、C函數(shù)也涉及本地資源,因此B、C函數(shù)也不能遷移到云端執(zhí)行。綜上解決此問題需要分析Android應(yīng)用程序中函數(shù)的調(diào)用關(guān)系,具體實現(xiàn)方法如下:
[0004]方法l、Android提供了一個工具Dmtracedump可以利用跟蹤視圖(Traceview)分析的結(jié)果來分析函數(shù)調(diào)用關(guān)系,但是目前Dmtracedump使用需要有一個面向?qū)ο蟆⒅弊g式計算機程序設(shè)計語言python腳本支持,而且它包含所有的庫函數(shù)(因為Traceview分析了所有的庫函數(shù)),同時,Traceview需要改動應(yīng)用程序源碼才能實現(xiàn);
[0005]TraceView 的使用:
[0006]修改代碼(code),在需要調(diào)試的起始和結(jié)束位置加入Android API的調(diào)試函數(shù)(即 Debug.StartMethodTracing(" calc" ) ,Debug.stopMethodTracing()) “calc”獲得調(diào)試信息的文本文件,即程序運行之后會在SD的根目錄下產(chǎn)生calc, trace文件來保存運行時的數(shù)據(jù)。
[0007]把calc, trace 文件通過命令 adb pull/sdcard/calc, trace/tmp 拷貝 pc 機的temp目錄下,通過命令traceview calc, trace對calc, trace文件進行分析。
[0008]方法2、利用反匯編工具,目前Android提供的反匯編工具是Dexdump,這個工具只能得到Android可執(zhí)行程序的類和函數(shù)的相關(guān)信息。
[0009]上述兩種方法中,第一種需要源碼,在沒有源碼的情況下,不能實現(xiàn)且里面包含的函數(shù)太多,對分析也會有很大的影響;第二種無法得到函數(shù)調(diào)用關(guān)系。
[0010]針對第二個問題:如何分析可以遷移到云端執(zhí)行函數(shù)中那些函數(shù)在手機上運行比較耗時,具體可采用如下方法:
[0011]方法1、Android提供了一個自帶分析工具:Traceview,它是一個圖形化的工具,最終它會產(chǎn)生一個圖表,用于對性能分析進行說明。這種工具需要應(yīng)用程序的源代碼且需要修改源碼才能完成,它可以跟蹤全部的方法,即包括庫函數(shù),底層虛擬機運行的函數(shù)以及程序中的所有函數(shù),具體修改方法可參見針對第一問題所采用的方法I。
[0012]方法2、在應(yīng)用程序源代碼的函數(shù)的起始位置加入獲得的函數(shù),在函數(shù)的結(jié)束位置也加入獲得時間函數(shù),將得到的兩個函數(shù)相減,從而得到函數(shù)的運行時間。
[0013]方法3、對應(yīng)用程序的目標(biāo)代碼(即可執(zhí)行程序)進行插樁,在目標(biāo)代碼中插入上述兩種方法的函數(shù)的指令。
[0014]上述三種方法中,前兩種需要有應(yīng)用程序的源代碼,在沒有源代碼的情況下就無能為力了,而第三種方法,由于Android的可執(zhí)行程序(dex)文件內(nèi)部非常的緊湊,它把一個應(yīng)用程序的所有類(class)文件都打包在一個dex文件中,所以實現(xiàn)dex文件的插樁難度很大。
【發(fā)明內(nèi)容】
[0015]本發(fā)明實施例提供了一種可遷移函數(shù)執(zhí)行時間的獲得方法及系統(tǒng),以克服現(xiàn)有技術(shù)必須獲得應(yīng)用程序源代碼或修改dex文件才可以獲得函數(shù)調(diào)用關(guān)系和執(zhí)行時間的缺陷。
[0016]本發(fā)明實施例提供了一種可遷移函數(shù)執(zhí)行時間的獲得方法,該方法包括:
[0017]對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系;
[0018]根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù);
[0019]加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。
[0020]優(yōu)選地,所述對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系,包括:
[0021]將可執(zhí)行程序(.dex)文件映射到內(nèi)存,調(diào)用文件解析(dexFileParse)函數(shù)對其進行分析,將分析的結(jié)果存放于第一數(shù)據(jù)結(jié)構(gòu)中;根據(jù)所述第一數(shù)據(jù)結(jié)構(gòu)分析所述.dex文件,將所有類數(shù)據(jù)存入第二數(shù)據(jù)結(jié)構(gòu)中;分析類中每個直接函數(shù)和虛函數(shù),然后通過指令分析獲得所述可執(zhí)行程序的函數(shù)調(diào)用關(guān)系。
[0022]優(yōu)選地,所述可遷移函數(shù)是指與用戶界面(Π)、硬件資源以及網(wǎng)絡(luò)不相關(guān)的非本地(NATIVE)函數(shù);和/或
[0023]所述限制條件包括以下條件中的一種或幾種:
[0024]應(yīng)用程序中的函數(shù)與本地設(shè)備有交互;
[0025]應(yīng)用程序中的函數(shù)與輸入輸出(IO)有交互;
[0026]應(yīng)用程序中的函數(shù)與網(wǎng)絡(luò)有交互;以及
[0027]應(yīng)用程序中的函數(shù)為NATIVE函數(shù)。
[0028]優(yōu)選地,所述根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù),包括:
[0029]將所述函數(shù)調(diào)用關(guān)系讀入鄰接表,標(biāo)記滿足所述限制條件的函數(shù)節(jié)點及其父節(jié)點和祖先節(jié)點,標(biāo)記完后再從頭掃描并標(biāo)記未被標(biāo)記的庫函數(shù)節(jié)點;然后清除已被標(biāo)記的節(jié)點,輸出未被標(biāo)記的節(jié)點,所述未被標(biāo)記的節(jié)點為可遷移函數(shù)。
[0030]優(yōu)選地,所述加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間,包括:
[0031]當(dāng)虛擬機啟動時,將包含所述可遷移函數(shù)的文本文件讀入哈希表中;所述虛擬機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間。
[0032]優(yōu)選地,所述虛擬機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間,包括:
[0033]在所述虛擬機解釋當(dāng)前函數(shù)壓棧處,添加獲得函數(shù)運行開始時間的函數(shù),同時建立一個自己的鏈棧,將所述獲得函數(shù)運行開始時間的函數(shù)和當(dāng)前函數(shù)運行的開始時間壓棧;在所述虛擬機解釋當(dāng)前函數(shù)彈棧處,添加獲得函數(shù)運行結(jié)束時間的函數(shù),將得到的當(dāng)前函數(shù)運行的結(jié)束時間做彈棧操作,從而計算出所述當(dāng)前函數(shù)的運行時間。
[0034]本發(fā)明實施例還提供了一種可遷移函數(shù)執(zhí)行時間的獲得系統(tǒng),該系統(tǒng)包括:
[0035]靜態(tài)分析模塊,用于對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系,根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù);
[0036]動態(tài)分析模塊,用于加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。
[0037]優(yōu)選地,所述可遷移函數(shù)是指與用戶界面(Π)、硬件資源以及網(wǎng)絡(luò)不相關(guān)的非本地(NATIVE)函數(shù);和/或
[0038]所述限制條件包括以下條件中的一種或幾種:
[0039]應(yīng)用程序中的函數(shù)與本地設(shè)備有交互;
[0040]應(yīng)用程序中的函數(shù)與輸入輸出(IO)有交互;
[0041]應(yīng)用程序中的函數(shù)與網(wǎng)絡(luò)有交互;以及
[0042]應(yīng)用程序中的函數(shù)為NATIVE函數(shù)。
[0043]優(yōu)選地,所述靜態(tài)分析模塊包括:
[0044]反匯編單元,用于:將可執(zhí)行程序(.dex)文件映射到內(nèi)存,調(diào)用文件解析(dexFileParse)函數(shù)對其進行分析,將分析的結(jié)果存放于第一數(shù)據(jù)結(jié)構(gòu)中;根據(jù)所述第一數(shù)據(jù)結(jié)構(gòu)分析所述.dex文件,將所有類數(shù)據(jù)存入第二數(shù)據(jù)結(jié)構(gòu)中;分析類中每個直接函數(shù)和虛函數(shù),然后通過指令分析獲得所述可執(zhí)行程序的函數(shù)調(diào)用關(guān)系;
[0045]預(yù)處理模塊,用于:將所述函數(shù)調(diào)用關(guān)系讀入鄰接表,標(biāo)記滿足所述限制條件的函數(shù)節(jié)點及其父節(jié)點和祖先節(jié)點,標(biāo)記完后再從頭掃描并標(biāo)記未被標(biāo)記的庫函數(shù)節(jié)點;然后清除已被標(biāo)記的節(jié)點,輸出未被標(biāo)記的節(jié)點,所述未被標(biāo)記的節(jié)點為可遷移函數(shù)。
[0046]優(yōu)選地,所述動態(tài)分析模塊,具體用于:當(dāng)虛擬機啟動時,將包含所述可遷移函數(shù)的文本文件讀入哈希表中;所述虛擬機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間。
[0047]優(yōu)選地,所述動態(tài)分析模塊,具體用于:在所述虛擬機解釋當(dāng)前函數(shù)壓棧處,添加獲得函數(shù)運行開始時間的函數(shù),同時建立一個自己的鏈棧,將所述獲得函數(shù)運行開始時間的函數(shù)和當(dāng)前函數(shù)運行的開始時間壓棧;在所述虛擬機解釋當(dāng)前函數(shù)彈棧處,添加獲得函數(shù)運行結(jié)束時間的函數(shù),將得到的當(dāng)前函數(shù)運行的結(jié)束時間做彈棧操作,從而計算出所述當(dāng)前函數(shù)的運行時間。
[0048]優(yōu)選地,所述系統(tǒng)位于安卓(Android)移動終端中。
[0049]本發(fā)明實施例,不需要應(yīng)用程序源代碼,也不需要修改dex文件即可實現(xiàn)對Android可執(zhí)行程序中函數(shù)調(diào)用關(guān)系的分析,從而根據(jù)限制條件得到可遷移到云端執(zhí)行的可遷移函數(shù),再分析這些遷移函數(shù)的執(zhí)行時間,相比于現(xiàn)有的方法,有更強的適用性。
【專利附圖】
【附圖說明】
[0050]圖1為本發(fā)明可遷移函數(shù)執(zhí)行時間的獲得系統(tǒng)實施例的結(jié)構(gòu)示意圖;
[0051]圖2為本發(fā)明圖1中靜態(tài)分析模塊的結(jié)構(gòu)示意圖;
[0052]圖3為本發(fā)明修改Dexdump源碼過程的流程圖;
[0053]圖4為本發(fā)明預(yù)處理過程的流程圖;
[0054]圖5為本發(fā)明動態(tài)分析過程的流程圖。
【具體實施方式】
[0055]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明白,下文中將結(jié)合附圖對本發(fā)明的實施例進行詳細說明。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。
[0056]本發(fā)明實施例通過在Linux環(huán)境中對Android可執(zhí)行程序進行分析,得到除限制條件外的函數(shù)信息,繼而在Android運行環(huán)境中,對可執(zhí)行程序的函數(shù)進行分析,計算分析得到函數(shù)的運行時間。
[0057]本發(fā)明實施例提供了一種可遷移函數(shù)執(zhí)行時間的獲得系統(tǒng),如圖1所示,該系統(tǒng)包括:靜態(tài)分析模塊11和動態(tài)分析模塊12 ;該靜態(tài)分析模塊,用于對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系,根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù);該動態(tài)分析模塊,用于加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。
[0058]該靜態(tài)分析模塊以Android可執(zhí)行程序Dex文件和限制條件(與Π、硬件、網(wǎng)絡(luò)相關(guān)的函數(shù)和NATIVE函數(shù)等函數(shù)的類名)作為輸入,分析得到滿足條件的可遷移函數(shù)以及相關(guān)信息,靜態(tài)分析模塊的輸出作為動態(tài)分析模塊的輸入,分析得到可遷移函數(shù)的運行時間。
[0059]其中,靜態(tài)分析模塊和動態(tài)模塊的實現(xiàn)方案如下:
[0060](I)靜態(tài)分析模塊
[0061]該靜態(tài)分析模塊包括反匯編單元111和預(yù)處理單元兩部分112,如圖2所示。此處的反匯編單元和傳統(tǒng)意義上反編譯的相同之處是分析的文件都是可執(zhí)行程序,而不同之處則是可以得到函數(shù)之間的調(diào)用關(guān)系。預(yù)處理單元則主要是通過限制條件對得到的調(diào)用關(guān)系進行處理。
[0062]其中,反匯編單元的實現(xiàn)主要通過分析Dexdump的源碼(Android源碼中有,詳細可見Android官網(wǎng))、Dex文件格式和Dalvik操作碼(opcodes),對Dexdump源碼進行修改,得到輸入應(yīng)用程序可執(zhí)行程序的函數(shù)調(diào)用關(guān)系。
[0063]預(yù)處理單元的實現(xiàn)以反匯編單元的輸出作為輸入,將滿足限制條件的函數(shù)進行標(biāo)記,再將此函數(shù)的父親節(jié)點以及其祖先都進行標(biāo)記,標(biāo)記完后再從頭掃描并且標(biāo)記未被標(biāo)記的庫函數(shù)節(jié)點,此時只標(biāo)記函數(shù)本身,這個過程統(tǒng)稱為標(biāo)記(Mark);再清除已被標(biāo)記的節(jié)點,即輸出未被標(biāo)記的節(jié)點到一個文本文件,此過程稱為清除(Sweep);統(tǒng)稱這兩個過程為Mark-Sweep (此思想主要是借鑒Java GC的回收機制)。
[0064](2)動態(tài)分析模塊
[0065]該模塊執(zhí)行的動態(tài)分析和傳統(tǒng)意義上在應(yīng)用程序的源碼中添加計算運行時間函數(shù)是不同的,此處的動態(tài)分析是通過在Android操作系統(tǒng)的虛擬機(Dalvik虛擬機)源碼中添加計算運行時間函數(shù)得到的,即在Dalvik虛擬機解釋應(yīng)用程序函數(shù)壓棧處,添加獲得函數(shù)運行起始時間的函數(shù),同時建立一個自己的鏈棧(棧的結(jié)構(gòu)如下),將函數(shù)和時間壓棧;在Dalvik虛擬機解釋應(yīng)用程序彈棧處,添加獲得函數(shù)運行結(jié)束時間的函數(shù),此時也做彈棧操作(此處的棧為自己建立的棧),計算函數(shù)的運行時間,將其記錄在哈希表中。
[0066]棧的結(jié)構(gòu)如下:
[0067]
【權(quán)利要求】
1.一種可遷移函數(shù)執(zhí)行時間的獲得方法,其特征在于,該方法包括: 對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系; 根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù); 加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于: 所述對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系,包括: 將可執(zhí)行程序(.dex)文件映射到內(nèi)存,調(diào)用文件解析(dexFileParse)函數(shù)對其進行分析,將分析的結(jié)果存放于第一數(shù)據(jù)結(jié)構(gòu)中;根據(jù)所述第一數(shù)據(jù)結(jié)構(gòu)分析所述.dex文件,將所有類數(shù)據(jù)存入第二數(shù)據(jù)結(jié)構(gòu)中;分析類中每個直接函數(shù)和虛函數(shù),然后通過指令分析獲得所述可執(zhí)行程序的函數(shù)調(diào)用關(guān)系。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于: 所述可遷移函數(shù)是指與用戶界面(Π)、硬件資源以及網(wǎng)絡(luò)不相關(guān)的非本地(NATIVE)函數(shù);和/或 所述限制條件包括以下條件中的一種或幾種: 應(yīng)用程序中的函數(shù)與本地設(shè)備有交互; 應(yīng)用程序中的函數(shù)與輸入輸出(IO)有交互; 應(yīng)用程序中的函數(shù)與網(wǎng)絡(luò)有交互;以及 應(yīng)用程序中的函數(shù)為NATIVE函數(shù)。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于: 所述根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù),包括: 將所述函數(shù)調(diào)用關(guān)系讀入鄰接表,標(biāo)記滿足所述限制條件的函數(shù)節(jié)點及其父節(jié)點和祖先節(jié)點,標(biāo)記完后再從頭掃描并標(biāo)記未被標(biāo)記的庫函數(shù)節(jié)點;然后清除已被標(biāo)記的節(jié)點,輸出未被標(biāo)記的節(jié)點,所述未被標(biāo)記的節(jié)點為可遷移函數(shù)。
5.根據(jù)權(quán)利要求1-4任一權(quán)利要求所述的方法,其特征在于: 所述加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間,包括: 當(dāng)虛擬機啟動時,將包含所述可遷移函數(shù)的文本文件讀入哈希表中;所述虛擬機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于: 所述虛擬 機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間,包括: 在所述虛擬機解釋當(dāng)前函數(shù)壓棧處,添加獲得函數(shù)運行開始時間的函數(shù),同時建立一個自己的鏈棧,將所述獲得函數(shù)運行開始時間的函數(shù)和當(dāng)前函數(shù)運行的開始時間壓棧;在所述虛擬機解釋當(dāng)前函數(shù)彈棧處,添加獲得函數(shù)運行結(jié)束時間的函數(shù),將得到的當(dāng)前函數(shù)運行的結(jié)束時間做彈棧操作,從而計算出所述當(dāng)前函數(shù)的運行時間。
7.一種可遷移函數(shù)執(zhí)行時間的獲得系統(tǒng),其特征在于,該系統(tǒng)包括: 靜態(tài)分析模塊,用于對反匯編工具(Dexdump)源碼進行修改,獲得應(yīng)用程序的可執(zhí)行程序的函數(shù)調(diào)用關(guān)系,根據(jù)限制條件和所述函數(shù)調(diào)用關(guān)系進行預(yù)處理,獲得需要計算運行時間的可遷移函數(shù); 動態(tài)分析模塊,用于加載計算運行時間函數(shù),獲得所述可遷移函數(shù)的運行時間。
8.根據(jù)權(quán)利要求7所述的系統(tǒng),其特征在于: 所述可遷移函數(shù)是指與用戶界面(Π)、硬件資源以及網(wǎng)絡(luò)不相關(guān)的非本地(NATIVE)函數(shù);和/或 所述限制條件包括以下條件中的一種或幾種: 應(yīng)用程序中的函數(shù)與本地設(shè)備有交互; 應(yīng)用程序中的函數(shù)與輸入輸出(IO)有交互; 應(yīng)用程序中的函數(shù)與網(wǎng)絡(luò)有交互;以及 應(yīng)用程序中的函數(shù)為NATIVE函數(shù)。
9.根據(jù)權(quán)利要求8所述的系統(tǒng),其特征在于,所述靜態(tài)分析模塊包括: 反匯編單元,用于:將可執(zhí)行程序(.dex)文件映射到內(nèi)存,調(diào)用文件解析(dexFileParse)函數(shù)對其進行分析,將分析的結(jié)果存放于第一數(shù)據(jù)結(jié)構(gòu)中;根據(jù)所述第一數(shù)據(jù)結(jié)構(gòu)分析所述.dex文件,將所有類數(shù)據(jù)存入第二數(shù)據(jù)結(jié)構(gòu)中;分析類中每個直接函數(shù)和虛函數(shù),然后通過指令分析獲得所述可執(zhí)行程序的函數(shù)調(diào)用關(guān)系; 預(yù)處理模塊,用于:將所述函數(shù)調(diào)用關(guān)系讀入鄰接表,標(biāo)記滿足所述限制條件的函數(shù)節(jié)點及其父節(jié)點和祖先節(jié)點,標(biāo)記完后再從頭掃描并標(biāo)記未被標(biāo)記的庫函數(shù)節(jié)點;然后清除已被標(biāo)記的節(jié)點,輸出未被標(biāo)記的節(jié)點,所述未被標(biāo)記的節(jié)點為可遷移函數(shù)。
10.根據(jù)權(quán)利要求7-9任一權(quán)利要求所述的系統(tǒng),其特征在于: 所述動態(tài)分析模塊,具體用于:當(dāng)虛擬機啟動時,將包含所述可遷移函數(shù)的文本文件讀入哈希表中;所述虛擬機加載計算運行時間函數(shù),判斷當(dāng)前函數(shù)是否在該哈希表中,若在,獲得所述當(dāng)前函數(shù)運行的開始時間,運行所述當(dāng)前函數(shù),獲得所述當(dāng)前函數(shù)運行的結(jié)束時間,從而獲得所述當(dāng)前函數(shù)的運行時間。
11.根據(jù)權(quán)利要求10所述的系統(tǒng),其特征在于: 所述動態(tài)分析模塊,具體用于:在所述虛擬機解釋當(dāng)前函數(shù)壓棧處,添加獲得函數(shù)運行開始時間的函數(shù),同時建立一個自己的鏈棧,將所述獲得函數(shù)運行開始時間的函數(shù)和當(dāng)前函數(shù)運行的開始時間壓棧;在所述虛擬機解釋當(dāng)前函數(shù)彈棧處,添加獲得函數(shù)運行結(jié)束時間的函數(shù),將得到的當(dāng)前函數(shù)運行的結(jié)束時間做彈棧操作,從而計算出所述當(dāng)前函數(shù)的運行時間。
12.根據(jù)權(quán)利要求11所述的系統(tǒng),其特征在于: 所述系統(tǒng)位于安卓(Android)移動終端中。
【文檔編號】G06F9/44GK103631573SQ201210305374
【公開日】2014年3月12日 申請日期:2012年8月24日 優(yōu)先權(quán)日:2012年8月24日
【發(fā)明者】鄒同亮, 劉震, 袁小燕, 董強, 羅曼 申請人:中興通訊股份有限公司