亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種Android程序的執(zhí)行路徑的還原方法與流程

文檔序號:12550585閱讀:389來源:國知局

本發(fā)明涉及一種Android程序的執(zhí)行路徑的還原方法,屬于程序分析和測試領(lǐng)域。



背景技術(shù):

Android是一個以Linux為基礎(chǔ)的開源移動設(shè)備操作系統(tǒng),主要用于智能手機(jī)和平板電腦,由Google成立的Open Handset Alliance(OHA,開放手持設(shè)備聯(lián)盟)持續(xù)領(lǐng)導(dǎo)與開發(fā)中。Android以其開放性受到廣大軟件開發(fā)者的喜愛,眾多新穎別致的Android應(yīng)用紛至沓來。為了保證Android能夠?qū)τ脩舢a(chǎn)生持續(xù)的吸引力,開發(fā)者需要及時地發(fā)現(xiàn)并解決Android的性能問題。在分發(fā)測試版的Android給用戶使用的過程中,記錄詳細(xì)的程序流日志數(shù)據(jù)會影響用戶使用,阻礙應(yīng)用測試進(jìn)程;減少日志的記錄內(nèi)容又會損失必要的分析數(shù)據(jù),降低問題診斷的效率,因此如何通過制定恰當(dāng)?shù)囊?guī)則對應(yīng)用的程序流日志進(jìn)行編碼,是Android測試的重要支撐技術(shù)之一。

軟件測試主要包括4個步驟:1)選擇恰當(dāng)?shù)木幋a規(guī)則根據(jù)應(yīng)用的程序流生成日志記錄的代碼;2)在應(yīng)用程序中插入指定的日志記錄代碼;3)將插樁后的應(yīng)用分發(fā)給用戶使用;4)收集、分析應(yīng)用產(chǎn)生的程序流日志,還原出現(xiàn)性能問題的場景,找到并解決性能問題。在步驟3)中,應(yīng)用在用戶使用的過程中執(zhí)行步驟1)中制定的編碼規(guī)則,產(chǎn)生程序流的編碼結(jié)果。步驟4)根據(jù)程序流的編碼結(jié)果和程序流的結(jié)構(gòu)還原出應(yīng)用程序執(zhí)行的路徑,從而找到問題的根源所在。制定應(yīng)用的程序流編碼的方法又稱為路徑還原。

現(xiàn)有的路徑還原方法主要有B.L.(Ball和Larus)和PAP(Profiling All Path)。其中,對于n條無環(huán)路徑,B.L.的編碼范圍為整數(shù)區(qū)間[0,n-1],但在處理包含多次執(zhí)行次數(shù)的有環(huán)路徑時,該算法將有環(huán)路徑拆分成多個無環(huán)子路徑,由多個無環(huán)子路徑的編碼組成有環(huán)路徑的編碼,產(chǎn)生了巨大的存儲開銷;PAP借助乘法與加法區(qū)分同一個代碼塊的不同入邊,利用不同入邊區(qū)分不同路徑,從而還原無環(huán)路徑和包含多次執(zhí)行次數(shù)的有環(huán)路徑,但隨著被還原程序的執(zhí)行,編碼的數(shù)值不斷增大,PAP需要記錄包含編碼值和代碼塊唯一標(biāo)識的斷點(diǎn)以表示一次完整的執(zhí)行路徑,記錄代碼塊唯一標(biāo)識降低了存儲效率,產(chǎn)生了較大開銷。此外,上述兩種方案都采用了固定模式的編碼方案,沒有根據(jù)不同路徑執(zhí)行的概率調(diào)整編碼方案,造成執(zhí)行概率高的路徑使用較長的編碼,執(zhí)行概率低的路徑使用較短的編碼。



技術(shù)實現(xiàn)要素:

本發(fā)明的目的是提供一種Android程序的執(zhí)行路徑的還原方法,以降低日志存儲開銷、減少對程序功能的影響以及提高程序測試效率。

為實現(xiàn)上述目的,本發(fā)明所采取的技術(shù)方案是:

本發(fā)明的Android程序的執(zhí)行路徑的還原方法包括以下步驟:

(1)對Android程序進(jìn)行分析與插樁,包括:

1)將Android程序包轉(zhuǎn)化成Android虛擬機(jī)字節(jié)碼文件;

2)從Android虛擬機(jī)字節(jié)碼文件中得到Android程序組件的字節(jié)碼文件;

3)根據(jù)Android生命周期函數(shù)對Android程序組件的字節(jié)碼文件分塊,生成Android程序的生命周期控制流文件;

4)從Android程序的生命周期控制流文件中得到用戶自定義函數(shù),并根據(jù)Android虛擬機(jī)字節(jié)碼語法對用戶自定義函數(shù)分塊,生成用戶自定義函數(shù)的控制流文件;

5)從Android程序的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中得到Android程序的初始代碼塊、Android程序的終止代碼塊、所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊,從當(dāng)前出邊概率模型文件中得到所有多出邊起點(diǎn)代碼塊的各條出邊的執(zhí)行概率;

6)若當(dāng)前出邊概率模型文件為初始時的出邊概率模型文件,則先將當(dāng)前出邊概率模型文件中的所有多出邊起點(diǎn)代碼塊的各條出邊的概率設(shè)定為相等后再執(zhí)行步驟7),否則,直接執(zhí)行步驟7);

7)利用編碼算法得到所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊、Android程序的初始代碼塊以及Android程序的終止代碼塊的插樁內(nèi)容;

8)依據(jù)所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊、Android程序的初始代碼塊以及Android程序的終止代碼塊的插樁內(nèi)容,對Android虛擬機(jī)字節(jié)碼文件進(jìn)行插樁;

9)將插樁后的Android虛擬機(jī)字節(jié)碼文件打包成Android程序包;

(2)用戶安裝Android程序包;

(3)依據(jù)用戶使用Android程序產(chǎn)生的程序控制流日志文件,還原Android程序的執(zhí)行路徑,包括以下步驟:

(i)從程序控制流日志文件中得到Android程序的執(zhí)行路徑編碼數(shù)組;

(ii)根據(jù)Android程序的執(zhí)行路徑編碼數(shù)組、Android程序的生命周期控制流文件、以及用戶自定義函數(shù)的控制流文件,利用解碼算法還原Android程序的執(zhí)行路徑;

(iii)根據(jù)還原的Android程序的執(zhí)行路徑,統(tǒng)計執(zhí)行路徑中所有多出邊起點(diǎn)代碼塊的出邊的執(zhí)行頻率,從而計算出每條出邊的執(zhí)行概率,更新當(dāng)前出邊概率模型文件。

進(jìn)一步地,本發(fā)明所述步驟7)執(zhí)行有以下內(nèi)容:

在Android程序的初始代碼塊中最后一句代碼之后,生成插樁內(nèi)容,該插樁內(nèi)容按先后順序含有第一代碼、第二代碼,所述第一代碼用于輸出表示當(dāng)前Android程序開始執(zhí)行的信號,所述第二代碼用于將當(dāng)前編碼區(qū)間初始化;

在Android程序中的所有多出邊起點(diǎn)代碼塊中的最后一句代碼之后,分別生成同樣的插樁內(nèi)容,各插樁內(nèi)容含有第三代碼,各所述第三代碼用于將其所在的多出邊起點(diǎn)代碼塊配置為該多出邊起點(diǎn)代碼塊的所有出邊的起點(diǎn);

在Android程序中的所有多出邊終點(diǎn)代碼塊中的第一句代碼之前,分別生成同樣的插樁內(nèi)容,各插樁內(nèi)容按先后順序依次包含以下代碼:

a)第四代碼,所述第四代碼用于將其所在的多出邊終點(diǎn)代碼塊配置為該多出邊終點(diǎn)代碼塊的所有入邊的終點(diǎn);

b)第五代碼,所述第五代碼用于將其所在的多出邊終點(diǎn)代碼塊的Android程序執(zhí)行時經(jīng)過的入邊配置為該多出邊終點(diǎn)代碼塊的當(dāng)前邊;

c)第六代碼,所述第六代碼用于從當(dāng)前出邊概率模型文件中檢索出該第六代碼所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊的執(zhí)行概率;

d)第七代碼,所述第七代碼用于將當(dāng)前編碼區(qū)間更新為從當(dāng)前出邊概率模型文件中檢索出的該第七代碼所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊所對應(yīng)的編碼子區(qū)間;

e)第八代碼,所述第八代碼用于在當(dāng)前編碼區(qū)間的小數(shù)位數(shù)大于寄存器的容量時,記錄當(dāng)前編碼區(qū)間內(nèi)二進(jìn)制形式下的最小值、并按比例逐步擴(kuò)大該當(dāng)前編碼區(qū)間至其滿足以下公式(3):

公式(1)中,beg_bin表示當(dāng)前編碼區(qū)間[beg,end)擴(kuò)大后的beg的小數(shù)位數(shù),end_bin表示當(dāng)前編碼區(qū)間[beg,end)擴(kuò)大后的end的小數(shù)位數(shù),L表示寄存器的容量,max(x)表示x的最大小數(shù)位數(shù),sub.(x)表示beg_bin或end_bin滿足條件x的所有小數(shù)位數(shù);

f)第九代碼,所述第九代碼用于將其所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊在當(dāng)前出邊概率模型文件中的執(zhí)行概率增加;

g)第十代碼,所述第十代碼用于將其所在的多出邊終點(diǎn)代碼塊的當(dāng)前邊的起點(diǎn)代碼塊的所有非當(dāng)前邊在當(dāng)前出邊概率模型文件中的執(zhí)行概率減少;

在Android程序的終止代碼塊中的最后一句代碼塊之前,生成插樁內(nèi)容,該插樁內(nèi)容含有第十一代碼,所述第十一代碼用于記錄當(dāng)前編碼區(qū)間內(nèi)二進(jìn)制形式下的最小值。

進(jìn)一步地,在本發(fā)明所述步驟(ii)中,“利用解碼算法還原Android程序的執(zhí)行路徑”包括以下步驟:

①進(jìn)行Android程序的執(zhí)行路徑還原的初始化操作,包含以下內(nèi)容:

初始化當(dāng)前編碼區(qū)間;

從Android程序的執(zhí)行路徑編碼數(shù)組中取出第一個元素作為當(dāng)前執(zhí)行路徑編碼值;

從Android程序的生命周期控制流文件中得到Android程序啟動時執(zhí)行的初始函數(shù),并以該初始函數(shù)為當(dāng)前函數(shù);

②從Android程序的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中提取當(dāng)前函數(shù)中的初始代碼塊,并以該初始代碼塊為當(dāng)前代碼塊;

③查找當(dāng)前代碼塊是否含有調(diào)用函數(shù)的代碼,若有,則記錄調(diào)用函數(shù)的代碼所在文件名及其在該文件中所在的行數(shù),找到被調(diào)用函數(shù)所在的文件,將記錄的調(diào)用函數(shù)的代碼所在文件名及其該文件中所在的行數(shù)添加到被調(diào)用函數(shù)的所有終止代碼塊中,以該被調(diào)用函數(shù)作為當(dāng)前函數(shù),返回執(zhí)行步驟②;否則,執(zhí)行步驟④;

④判斷當(dāng)前代碼塊的類別是屬于僅有一條出邊的代碼塊、多出邊起點(diǎn)代碼塊、當(dāng)前函數(shù)的終止代碼塊中的哪一種,并執(zhí)行步驟⑤:

⑤如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論系首次得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中;

如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論并非首先得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中前一次記錄的出邊之后,并以該出邊直接指向的代碼塊作為當(dāng)前代碼塊,返回執(zhí)行步驟③;

如果判斷當(dāng)前代碼塊為多出邊起點(diǎn)代碼塊,則執(zhí)行有以下步驟:

i)從當(dāng)前出邊概率模型文件中選擇與當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間對應(yīng)的出邊;

ii)將當(dāng)前編碼區(qū)間更新為當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間;

iii)如果當(dāng)前編碼區(qū)間的小數(shù)位數(shù)大于寄存器的容量,則從執(zhí)行路徑編碼數(shù)組中取出下一個路徑編碼值作為當(dāng)前執(zhí)行路徑編碼值,且按所述步驟e)所述的比例逐步擴(kuò)大當(dāng)前編碼區(qū)間至其滿足所述公式(1);

iv)以步驟i)中所選擇的出邊直接指向的代碼塊為當(dāng)前代碼塊,返回執(zhí)行步驟③;

如果判斷當(dāng)前代碼塊為當(dāng)前函數(shù)的終止代碼塊,則進(jìn)一步判斷當(dāng)前代碼塊是否記錄有調(diào)用函數(shù)的代碼所在文件名及其在該文件中所在的行數(shù),若有,則根據(jù)該記錄找到調(diào)用函數(shù)的代碼,以該調(diào)用函數(shù)的代碼作為當(dāng)前代碼塊,返回執(zhí)行步驟④;若沒有,則執(zhí)行步驟(iii)。

進(jìn)一步地,本發(fā)明所述“按比例逐步擴(kuò)大當(dāng)前編碼區(qū)間”中的“比例”滿足以下公式(4):

公式(4)中,scale表示當(dāng)前編碼區(qū)間擴(kuò)大的比例;Bin(x)表示得到數(shù)值x的小數(shù)位數(shù);beg_bin表示當(dāng)前編碼區(qū)間擴(kuò)大后的beg的小數(shù)位數(shù);end_bin表示當(dāng)前編碼區(qū)間擴(kuò)大后的end的小數(shù)位數(shù);L表示寄存器的容量;表示按照比例scale擴(kuò)大編碼區(qū)間一次以上后,能令和同時成立。

進(jìn)一步地,在本發(fā)明所述步驟7)中,所述編碼算法為基于熵編碼的編碼算法。

進(jìn)一步地,本發(fā)明所述編碼算法為算術(shù)編碼的編碼算法或哈夫曼編碼的編碼算法。

進(jìn)一步地,在本發(fā)明所述步驟(ii)中,所述解碼算法為基于熵編碼的解碼算法。

進(jìn)一步地,本發(fā)明所述解碼算法為算術(shù)編碼的解碼算法或哈夫曼編碼的解碼算法。

與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果為:(1)本發(fā)明通過向Android應(yīng)用程序插樁并還原執(zhí)行路徑的方式,實現(xiàn)了半自動化的Android應(yīng)用程序測試,相比于開發(fā)者手動測試程序的方式,減少了需要測試的程序路徑空間,從而降低日志存儲開銷、減少對程序功能的影響并提高了程序測試的效率。(2)本發(fā)明在還原執(zhí)行路徑時,能夠通過編碼區(qū)間的小數(shù)位數(shù)大于寄存器的最大容量這一條件來推測斷點(diǎn),去除了利用PAP(Profiling All Path)算法時記錄斷點(diǎn)的開銷。(3)本發(fā)明根據(jù)Android程序不同路徑的執(zhí)行概率調(diào)整多出邊起點(diǎn)代碼塊每條出邊的概率,使得執(zhí)行概率高的路徑使用占用存儲空間少的編碼,與B.L.(Ball和Larus)和PAP算法對所有執(zhí)行路徑使用固定編碼相比,減少了日志的期望存儲開銷。(4)本發(fā)明僅在編碼區(qū)間的小數(shù)位數(shù)大于寄存器的最大容量以及Android程序終止時記錄編碼數(shù)據(jù),與B.L算法在每個循環(huán)結(jié)束以及Android程序終止時記錄編碼數(shù)據(jù)相比,特別是在處理循環(huán)次數(shù)多的Android程序時,降低了寄存器的訪問次數(shù),減少了對Android程序功能的影響,提高了程序測試的效率。

附圖說明

圖1是本發(fā)明Android程序的執(zhí)行路徑的還原方法的流程圖。

具體實施方式

以下以搭載了Android 4.4的Nexus 5智能手機(jī)為測試平臺,以測試一款在GooglePlay上下載了超過一百萬次的開源項目Android Wifi Tether為例詳細(xì)說明本發(fā)明,具體如下:

(1)對Android Wifi Tether進(jìn)行分析和插樁,包括以下步驟:

(1.1)使用Apktool工具將Android Wifi Tether轉(zhuǎn)化成Android虛擬機(jī)(即,Dalvik)字節(jié)碼文件。

(1.2)從Android虛擬機(jī)字節(jié)碼文件中得到Android程序組件的字節(jié)碼文件(Android程序組件包括:Activity、Service、Broadcast Receiver和Content Provider)。

(1.3)根據(jù)Android生命周期函數(shù)(如,“onCreate()”、“onStop()”等)之間的控制流關(guān)系,對Android程序組件的字節(jié)碼文件進(jìn)行分塊,生成Android生命周期控制流文件。如,當(dāng)Android程序啟動之后,將依次運(yùn)行Android生命周期函數(shù)“onCreate()”和“onStart()”,則這兩個Android生命周期函數(shù)之間存在一條由“onCreate()”直接指向“onStart()”的邊。

(1.4)從Android程序的生命周期控制流文件中得到用戶自定義函數(shù),并根據(jù)Android虛擬機(jī)字節(jié)碼語法(如“:cond_0”、“:goto_0”等)對用戶自定義函數(shù)分塊,生成用戶自定義函數(shù)的控制流文件。其中,每個代碼塊中記錄與程序控制流相關(guān)的信息(如出邊數(shù)、入邊數(shù)、可插樁代碼的地址等),每個代碼塊之間依據(jù)代碼塊中的第一句代碼和最后一句代碼塊的關(guān)鍵字進(jìn)行連接。如,代碼塊C1最后一句代碼為“goto:goto_0”,代碼塊C2第一句代碼為“:goto_0”,則將代碼塊C1和代碼塊C2連接。

(1.5)從Android程序的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中得到Android程序的初始代碼塊、Android程序的終止代碼塊、所有多出邊起點(diǎn)代碼塊、所有多出邊終點(diǎn)代碼塊。其中,Android程序的初始代碼塊指Android程序啟動時執(zhí)行的第一個函數(shù)的第一個代碼塊,Android程序的終止代碼塊指Android程序結(jié)束時執(zhí)行的最后一個函數(shù)的最后一個代碼塊,多出邊起點(diǎn)代碼塊指含有兩條以上出邊的代碼塊,多出邊終點(diǎn)代碼塊指多出邊起點(diǎn)代碼塊直接指向的代碼塊。

(1.6)從Android Wifi Tether的/data/目錄下的當(dāng)前出邊概率模型中得到所有多出邊起點(diǎn)代碼塊的各條出邊的執(zhí)行概率,若當(dāng)前出邊概率模型文件為初始時的出邊概率模型文件,則先將當(dāng)前出邊概率模型文件中的所有多出邊起點(diǎn)代碼塊的各條出邊的概率設(shè)定為相等后再執(zhí)行步驟(1.7),否則,直接執(zhí)行步驟(1.7)。

(1.7)在主Activity的“OnCreate()”函數(shù)的Android程序初始代碼塊中最后一句代碼之后,生成插樁內(nèi)容,該插樁內(nèi)容按先后順序含有第一代碼、第二代碼,所述第一代碼用于輸出表示當(dāng)前Android Wifi Tether開始執(zhí)行的信號(即,“Android Wifi Tether Start”),所述第二代碼用于將當(dāng)前編碼區(qū)間[beg,end)初始化為[0,1)。

在Android Wifi Tether中的所有多出邊起點(diǎn)代碼塊中最后一句代碼之后,分別生成同樣的插樁內(nèi)容,各插樁內(nèi)容第三代碼,各所述第三代碼用于將其所在多出邊起點(diǎn)代碼塊outedge_start_id配置該多出邊起點(diǎn)代碼塊的所有出邊的起點(diǎn)。

在Android Wifi Tether中的所有多出邊終點(diǎn)代碼塊中第一句代碼之前,生成插樁內(nèi)容,各插樁內(nèi)容按先后順序依次包含以下第四至第十代碼:

a)第四代碼,所述第四代碼用于將其所在的多出邊終點(diǎn)代碼塊outedge_end_id配置為該多出邊終點(diǎn)代碼塊的所有入邊的終點(diǎn)。

b)第五代碼,所述第五代碼用于將其所在的多出邊終點(diǎn)代碼塊的Android Wifi Tether執(zhí)行時經(jīng)過的入邊配置為該多出邊終點(diǎn)代碼塊的當(dāng)前邊(即,outedge_current),當(dāng)前邊outedge_current由多出邊起點(diǎn)代碼塊和多出邊終點(diǎn)代碼塊的笛卡爾積<o(jì)utedge_start_id,outedge_end_id>唯一表示。

c)第六代碼,所述第六代碼用于從當(dāng)前出邊概率模型文件中檢索出outedge_current的執(zhí)行概率。

d)第七代碼,所述第七代碼用于將當(dāng)前編碼區(qū)間[beg,end)更新為從當(dāng)前出邊概率模型文件中檢索出的outedge_current對應(yīng)的編碼子區(qū)間[beg_outedge,end_outedge),在出邊概率模型文件中,對于所有以同一個多出邊起點(diǎn)代碼塊為起點(diǎn)的出邊,滿足(5)所述條件:

其中,outedgei表示所有以同一個多出邊起點(diǎn)代碼塊為起點(diǎn)的出邊的集合outedge中的第i個出邊,Pr(outedgei)表示outedgei所對應(yīng)的執(zhí)行概率,CDF(outedgei)表示outedgei的累積分布函數(shù),且定義CDF(outedge-1)的值為0,按公式(6)所述方法計算outedge_current對應(yīng)的編碼子區(qū)間:

其中CDF(outedgei)即為outedge_current所對應(yīng)的累積分布函數(shù)。

e)第八代碼,所述第八代碼用于在beg或end的小數(shù)位數(shù)大于寄存器的容量時,記錄當(dāng)前編碼區(qū)間范圍內(nèi)二進(jìn)制形式下的最小值、并按擴(kuò)大比例scale逐步擴(kuò)大beg和end的數(shù)值至滿足公式(8)所示的條件,擴(kuò)大比例scale應(yīng)滿足條件(7):

其中,beg和end表示當(dāng)前編碼區(qū)間[beg,end),Bin(x)表示得到數(shù)值x的小數(shù)位數(shù),beg_bin和end_bin分別表示擴(kuò)大后beg和end的小數(shù)位數(shù),L表示寄存器的容量,max(x)表示x最大的小數(shù)位數(shù),sub.(x)表示beg_bin或end_bin滿足條件x的所有小數(shù)位數(shù),表示按照比例scale擴(kuò)大編碼區(qū)間一次以上后,能令和同時成立。

f)第九代碼,所述第九代碼用于將outedge_current在當(dāng)前出邊概率模型文件中的執(zhí)行概率增加。

g)第十代碼,所述第十代碼用于減少當(dāng)前出邊概率模型文件中outedge_start_id的所有非outedge_current邊的執(zhí)行概率,其中,增加與減少執(zhí)行概率的方法按照公式(9)所述方法:

其中,Pr(outedgei)表示outedgei所對應(yīng)的執(zhí)行概率,inc表示增加的執(zhí)行概率,Count(outedge)表示集合outedge的個數(shù),outedgei表示當(dāng)前出邊outedge_current,outedgej表示所有非當(dāng)前出邊。

該方法通過增加該outedge_current邊的執(zhí)行概率,減少非outedge_current邊的執(zhí)行概率,便能在Android程序執(zhí)行編碼時使用較少的編碼開銷代表執(zhí)行概率高的路徑,從而減少了期望的路徑編碼開銷。

在Android Wifi Tether中所有組件的“OnStop()”、“OnDestroy()”函數(shù)的終止代碼塊中最后一句代碼塊之前,生成插樁內(nèi)容,該插樁內(nèi)容含有第十一代碼,所述第十一代碼用于記錄當(dāng)前編碼區(qū)間中二進(jìn)制形式下的最小值。

(1.8)根據(jù)分析得到的所有代碼塊的插樁內(nèi)容,對所有Dalvik字節(jié)碼文件進(jìn)行插樁。

(1.9)使用Apktool工具將插樁后的Dalvik字節(jié)碼文件打包成Android程序包Android Wifi Tether Beta。

(2)將打包生成的Android Wifi Tether Beta裝入Nexus 5手機(jī),參與測試的用戶按照自己的習(xí)慣使用一周。

(3)在計算機(jī)端讀取收集到的程序控制流日志,還原Android Wifi Tether Beta的執(zhí)行路徑,包括以下步驟:

(3.1)從程序控制流日志文件中得到Android Wifi Tether Beta的執(zhí)行路徑編碼數(shù)組Encoded_Path。

(3.2)根據(jù)Android Wifi Tether Beta的Encoded_Path、Android程序的生命周期控制流文件、用戶自定義函數(shù)控制流文件,利用算術(shù)編碼的解碼算法還原Android程序的執(zhí)行路徑,具體的,按照以下步驟進(jìn)行:

(3.2.1)進(jìn)行Android Wifi Tether Beta的執(zhí)行路徑還原的初始化操作,包含以下內(nèi)容:

將當(dāng)前編碼區(qū)間[beg,end)初始化為[0,1)。

從Android Wifi Tether Beta的執(zhí)行路徑編碼數(shù)組Encoded_Path中取出第一個元素作為當(dāng)前執(zhí)行路徑編碼值。(其中,執(zhí)行路徑編碼數(shù)組中的第一個元素,是指當(dāng)前編碼區(qū)間的小數(shù)位數(shù)第一次大于寄存器的容量時所記錄的當(dāng)前編碼區(qū)間內(nèi)二進(jìn)制形式下的最小值);

從Android Wifi Tether Beta的生命周期控制流文件中得到Android程序啟動時執(zhí)行的主Activity的“OnCreate()”函數(shù),并以此初始函數(shù)為當(dāng)前函數(shù)。

(3.2.2)依據(jù)Android Wifi Tether Beta的生命周期控制流文件和用戶自定義函數(shù)的控制流文件中得到當(dāng)前函數(shù)中的初始代碼塊,并以此初始代碼塊為當(dāng)前代碼塊。

(3.2.3)查找當(dāng)前代碼塊是否含有調(diào)用函數(shù)的代碼(即,是否含有smali關(guān)鍵字“invoke-”),若有,則記錄調(diào)用函數(shù)的代碼所在文件名ClassPath_Activity及其在該文件中所在的行數(shù)LineNum,找到被調(diào)用函數(shù)所在的文件,將記錄的調(diào)用函數(shù)的代碼的ClassPath_Activity和LineNum添加到被調(diào)用函數(shù)的所有終止代碼塊中,以該被調(diào)用函數(shù)作為當(dāng)前函數(shù),返回執(zhí)行步驟(3.2.2);否則,執(zhí)行步驟(3.2.4);

(3.2.4)判斷當(dāng)前代碼塊的類別是屬于僅有一條出邊的代碼塊、多出邊起點(diǎn)代碼塊、當(dāng)前函數(shù)的終止代碼塊中的哪一種,并執(zhí)行步驟(3.2.5):

(3.2.5)如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論系首次得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中;

如果判斷當(dāng)前代碼塊為僅有一條出邊的代碼塊且該判斷結(jié)論并非首先得到,則將當(dāng)前代碼塊的出邊記錄在可變長的數(shù)組空間中前一次記錄的出邊之后,并以該出邊直接指向的代碼塊作為當(dāng)前代碼塊,返回執(zhí)行步驟(3.2.3);

如果判斷當(dāng)前代碼塊為多出邊起點(diǎn)代碼塊,則執(zhí)行有以下步驟:

(3.2.5.1)從當(dāng)前出邊概率模型文件中選擇與當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間[beg,end)對應(yīng)的出邊outedge_current;

(3.2.5.2)令outedgei為出邊outedge_current,按照公式(6)所述方法,將當(dāng)前編碼區(qū)間更新為當(dāng)前執(zhí)行路徑編碼值所在的編碼子區(qū)間;

(3.2.5.3)如果當(dāng)前編碼區(qū)間的小數(shù)位數(shù)大于寄存器的容量,則從執(zhí)行路徑編碼數(shù)組中Encoded_Path取出下一個路徑編碼值作為當(dāng)前執(zhí)行路徑編碼值,且按所述步驟e)所述的擴(kuò)大比例scale逐步擴(kuò)大當(dāng)前編碼區(qū)間至其滿足公式(8)所述條件,借助這種方式,本發(fā)明能夠在每次beg或者end的小數(shù)位數(shù)大于寄存器的容量時,觸發(fā)路徑編碼值取出的操作,從而去除了記錄表明路徑編碼值取出操作的斷點(diǎn)的開銷;

(3.5.2.4)以步驟(3.2.5.1)中所選擇的出邊直接指向的代碼塊為當(dāng)前代碼塊,返回執(zhí)行步驟(3.2.3);

如果判斷當(dāng)前代碼塊為當(dāng)前函數(shù)的終止代碼塊,則進(jìn)一步判斷當(dāng)前代碼塊是否記錄有調(diào)用函數(shù)的代碼所在文件名ClassPath_Activity及其在該文件中所在的行數(shù)LineNum,若有,則根據(jù)該記錄找到調(diào)用函數(shù)的代碼,以該調(diào)用函數(shù)的代碼作為當(dāng)前代碼塊,返回執(zhí)行步驟(3.2.4);若沒有,則執(zhí)行步驟(3.3)。

(3.3)根據(jù)還原的Android Wifi Tether Beta的執(zhí)行路徑,統(tǒng)計路徑中所有多出邊起點(diǎn)代碼塊的出邊的執(zhí)行頻率,從而計算出每條出邊的執(zhí)行概率,更新當(dāng)前出邊概率模型文件。

在本發(fā)明中,編碼算法優(yōu)選基于熵編碼的編碼算法,解碼算法優(yōu)選基于熵編碼的解碼算法。其中,編碼算法除了上述實施例中的算術(shù)編碼的編碼算法,還可使用哈夫曼編碼的編碼算法、PAP(Profiling All Path)的編碼算法和B.L(Ball和Larus)的編碼算法等;解碼算法除了上述實施例中的算術(shù)編碼的解碼算法外,還可使用哈夫曼編碼的解碼算法、PAP的解碼算法和B.L的解碼算法等。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1