本發(fā)明涉及Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集系統(tǒng)及方法。
背景技術(shù):
Android應(yīng)用程序網(wǎng)絡(luò)流量數(shù)據(jù)集是目前很多安全研究人員研究的對象。惡意Android應(yīng)用程序會(huì)在運(yùn)行時(shí)與惡意目標(biāo)建立網(wǎng)絡(luò)連接,因此從網(wǎng)絡(luò)流量的角度上也可以防范Android惡意應(yīng)用程序。
但目前Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量在收集過程中有以下問題:
(1)大規(guī)模流量的獲取途徑單一,即研究人員只能從網(wǎng)絡(luò)運(yùn)營商處獲取網(wǎng)絡(luò)流量,這樣做無法區(qū)分單個(gè)應(yīng)用程序的網(wǎng)絡(luò)流量,給后續(xù)研究帶來問題;
(2)手動(dòng)的采集網(wǎng)絡(luò)流量,即在Android終端或者Android模擬器上人工的運(yùn)行Android應(yīng)用程序,然后通過代理或者網(wǎng)關(guān)收集的方式獲取應(yīng)用程序的網(wǎng)絡(luò)流量,這樣收集的網(wǎng)絡(luò)流量數(shù)據(jù)集很小,不適合做大規(guī)模的機(jī)器學(xué)習(xí)實(shí)驗(yàn);
(3)進(jìn)行自動(dòng)化的移動(dòng)終端網(wǎng)絡(luò)流量采集過程中,沒有對應(yīng)用程序的運(yùn)行產(chǎn)生觸發(fā)事件,即無法模擬人在使用應(yīng)用程序時(shí)的操作。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的就是為了解決上述問題,提供Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集系統(tǒng)及方法,它具有批量式的獲取Android終端應(yīng)用程序產(chǎn)生的流量的優(yōu)點(diǎn)。
為了實(shí)現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集方法,包括如下步驟:
步驟(1):判斷設(shè)定目錄下是否有Android應(yīng)用程序;如果沒有Android應(yīng)用程序,則記錄本次操作的日志,然后結(jié)束;若有Android應(yīng)用程序則進(jìn)入步驟(2);
步驟(2):根據(jù)設(shè)定的線程數(shù)量或者根據(jù)計(jì)算機(jī)內(nèi)存資源空閑情況,確定啟動(dòng)的線程數(shù)量;
步驟(3):提取Android應(yīng)用程序的基本信息,檢測基本信息中的SDK版本,將提取出的基本信息與Android應(yīng)用程序的存放路徑對應(yīng)存儲在應(yīng)用程序信息隊(duì)列的應(yīng)用程序數(shù)組鏈表中;
步驟(4):接收數(shù)組鏈表,根據(jù)步驟(2)中得到的線程數(shù)量,控制全部的子線程啟動(dòng);
步驟(5):根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);安裝Android應(yīng)用程序;每一個(gè)子線程對應(yīng)用程序數(shù)組鏈表中的Android應(yīng)用程序進(jìn)行網(wǎng)絡(luò)流量采集。
優(yōu)選的,所述步驟(3)通過Android AssetPackaging工具提取出應(yīng)用程序的MainActivity、packetname和minSDKVersion信息。
所述步驟(2)包括如下步驟:
判斷輸入?yún)?shù)是設(shè)定的線程數(shù)量還是Android應(yīng)用程序的數(shù)量;若是設(shè)定的線程數(shù)量,則直接輸出線程數(shù)量;若是Android應(yīng)用程序的數(shù)量,則檢測計(jì)算機(jī)的剩余資源,根據(jù)單個(gè)Android虛擬機(jī)運(yùn)行所消耗資源和計(jì)算機(jī)的剩余資源,通過計(jì)算得出當(dāng)前計(jì)算機(jī)能夠容納的線程數(shù)量;將計(jì)算得出的線程數(shù)量輸出。
優(yōu)選的,所述步驟(2)中計(jì)算機(jī)的剩余資源是指計(jì)算機(jī)內(nèi)存剩余量和CPU剩余量。
所述步驟(3)包括如下步驟:
步驟(31):對AndroidManifest文件進(jìn)行反編譯操作;檢測反編譯是否成功,反編譯如果失敗,則記錄錯(cuò)誤信息后結(jié)束;反編譯如果成功,則在反編譯后的AndroidManifest文件中提取應(yīng)用程序的基本信息;
步驟(32):檢測基本信息中的SDK版本,判斷是否存在minSDKVersion信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
步驟(33):將提取出來的應(yīng)用程序的信息打包成信息數(shù)組,存入數(shù)組鏈表中。
優(yōu)選的,所述步驟(31)中調(diào)用Android Asset Packaging工具中的aapt dump badging命令對AndroidManifest文件進(jìn)行反編譯操作。
優(yōu)選的,所述步驟(31)中應(yīng)用程序的基本信息包括:MainActivity,packet name和minSDKVersion信息。
優(yōu)選的,步驟(32):檢測基本信息中的SDK版本(software development kit即軟件開發(fā)工具包,SDK版本可以理解為android系統(tǒng)的版本),是否存在minSDKVersion(應(yīng)用程序可以運(yùn)行的最低的SDK版本)信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
所述步驟(4)包括如下步驟:
步驟(41):創(chuàng)建一個(gè)子線程,并將啟動(dòng)參數(shù)傳入;所述啟動(dòng)參數(shù)包括子線程需要檢測的應(yīng)用程序數(shù)組鏈表和SDK版本。
步驟(42):判斷創(chuàng)建的子線程數(shù)量是否達(dá)到設(shè)定數(shù)量,如果未達(dá)到設(shè)定的子線程數(shù)量,則返回步驟(41)繼續(xù)創(chuàng)建子線程;如果創(chuàng)建的子線程數(shù)量達(dá)到設(shè)定的數(shù)量,則啟動(dòng)全部子線程;
步驟(43):主程序阻塞,等待子線程全部執(zhí)行完畢。
所述步驟(5)包括如下步驟:
步驟(5-1):在數(shù)組鏈表中提取一組數(shù)據(jù),檢測數(shù)據(jù)是否完整有效;如果數(shù)據(jù)不完整或者存在無效字符,則說明Android應(yīng)用程序提取的信息有誤,跳轉(zhuǎn)至步驟(5-7)跳過該應(yīng)用程序;如果數(shù)據(jù)是完整并且有效的,則根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);
步驟(5-2):安裝Android應(yīng)用程序;檢測該應(yīng)用程序是否安裝成功;如果應(yīng)用程序安裝成功,則進(jìn)入步驟(5-4);如果應(yīng)用程序沒有安全成功,則進(jìn)入步驟(5-3);
步驟(5-3):判斷是否是首次安裝失敗,如果是就返回步驟(5-2);若否則跳轉(zhuǎn)至步驟(5-6);
步驟(5-4):重啟Android虛擬機(jī),啟動(dòng)采集網(wǎng)絡(luò)流量的tcpdump工具以及重啟前安裝的Android應(yīng)用程序;
步驟(5-5):判斷應(yīng)用程序是否啟動(dòng)成功,如果啟動(dòng)失敗,則跳轉(zhuǎn)至步驟(5-6);如果應(yīng)用程序啟動(dòng)成功,則啟動(dòng)Android應(yīng)用程序自動(dòng)化遍歷腳本,模擬人工操作環(huán)境;待Android應(yīng)用程序自動(dòng)化遍歷腳本執(zhí)行完畢后,保存采集的網(wǎng)絡(luò)流量,跳轉(zhuǎn)至步驟(5-6)。
步驟(5-6):關(guān)閉并刪除Android虛擬機(jī);進(jìn)入步驟(5-7);
步驟(5-7):檢測Android應(yīng)用程序信息數(shù)組鏈表中是否還有Android應(yīng)用程序;如果有,則提取一組待采集網(wǎng)絡(luò)流量的應(yīng)用程序后跳轉(zhuǎn)至步驟(5-1),如果沒有,則結(jié)束。
Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集系統(tǒng),包括:
Android應(yīng)用程序是否存在判斷模塊:判斷設(shè)定目錄下是否有Android應(yīng)用程序;如果沒有Android應(yīng)用程序,則記錄本次操作的日志,然后結(jié)束;若有Android應(yīng)用程序則進(jìn)入線程數(shù)量配置模塊;
線程數(shù)量配置模塊:根據(jù)設(shè)定的線程數(shù)量或者根據(jù)計(jì)算機(jī)內(nèi)存資源空閑情況,確定啟動(dòng)的線程數(shù)量;
Android應(yīng)用程序的基本信息提取模塊:提取Android應(yīng)用程序的基本信息,檢測基本信息中的SDK版本,將提取出的基本信息與Android應(yīng)用程序的存放路徑對應(yīng)存儲在應(yīng)用程序信息隊(duì)列的應(yīng)用程序數(shù)組鏈表中;
子線程啟動(dòng)模塊:接收數(shù)組鏈表;根據(jù)線程數(shù)量配置模塊中得到的線程數(shù)量,控制全部的子線程啟動(dòng);
網(wǎng)絡(luò)流量采集模塊:根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);安裝Android應(yīng)用程序;每一個(gè)子線程對應(yīng)用程序數(shù)組鏈表中的Android應(yīng)用程序進(jìn)行網(wǎng)絡(luò)流量采集。
優(yōu)選的,所述Android應(yīng)用程序的基本信息提取模塊通過Android AssetPackaging工具提取出應(yīng)用程序的MainActivity、packetname和minSDKVersion信息。
所述線程數(shù)量配置模塊包括:
判斷輸入?yún)?shù)是設(shè)定的線程數(shù)量還是Android應(yīng)用程序的數(shù)量;若是設(shè)定的線程數(shù)量,則直接輸出線程數(shù)量;若是Android應(yīng)用程序的數(shù)量,則檢測計(jì)算機(jī)的剩余資源,根據(jù)單個(gè)Android虛擬機(jī)運(yùn)行所消耗資源和計(jì)算機(jī)的剩余資源,通過計(jì)算得出當(dāng)前計(jì)算機(jī)能夠容納的線程數(shù)量;將計(jì)算得出的線程數(shù)量輸出。
優(yōu)選的,所述線程數(shù)量配置模塊中計(jì)算機(jī)內(nèi)存資源空閑情況是指計(jì)算機(jī)內(nèi)存剩余量和CPU剩余量。
所述Android應(yīng)用程序的基本信息提取模塊包括:
反編譯子模塊:對AndroidManifest文件進(jìn)行反編譯操作;檢測反編譯是否成功,反編譯如果失敗,則記錄錯(cuò)誤信息后結(jié)束;反編譯如果成功,則進(jìn)入信息獲取子模塊;
信息獲取子模塊,在反編譯后的AndroidManifest文件中提取應(yīng)用程序的基本信息;
SDK版本檢測子模塊:檢測基本信息中的SDK版本,判斷是否存在minSDKVersion信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
打包子模塊:將提取出來的應(yīng)用程序的信息打包成信息數(shù)組,存入數(shù)組鏈表中。
優(yōu)選的,所述反編譯子模塊中調(diào)用Android Asset Packaging工具中的aapt dump badging命令對AndroidManifest文件進(jìn)行反編譯操作。
優(yōu)選的,所述反編譯子模塊中應(yīng)用程序的基本信息包括:MainActivity,packet name和minSDKVersion信息。
優(yōu)選的,SDK版本檢測子模塊:檢測基本信息中的SDK版本(software development kit即軟件開發(fā)工具包,SDK版本可以理解為android系統(tǒng)的版本),是否存在minSDKVersion(應(yīng)用程序可以運(yùn)行的最低的SDK版本)信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
所述子線程啟動(dòng)模塊包括如下步驟:
子線程創(chuàng)建子模塊:創(chuàng)建一個(gè)子線程,并將啟動(dòng)參數(shù)傳入;所述啟動(dòng)參數(shù)包括子線程需要檢測的應(yīng)用程序數(shù)組鏈表和SDK版本。
子線程數(shù)量檢測子模塊:判斷創(chuàng)建的子線程數(shù)量是否達(dá)到設(shè)定數(shù)量,如果未達(dá)到設(shè)定的子線程數(shù)量,則返回子線程創(chuàng)建子模塊繼續(xù)創(chuàng)建子線程;如果創(chuàng)建的子線程數(shù)量達(dá)到設(shè)定的數(shù)量,則啟動(dòng)全部子線程;
子線程執(zhí)行等待子模塊:主程序阻塞,等待子線程全部執(zhí)行完畢。
所述網(wǎng)絡(luò)流量采集模塊包括如下步驟:
數(shù)據(jù)檢測子模塊:在數(shù)組鏈表中提取一組數(shù)據(jù),檢測數(shù)據(jù)是否完整有效;如果數(shù)據(jù)不完整或者存在無效字符,則說明Android應(yīng)用程序提取的信息有誤,跳轉(zhuǎn)至Android應(yīng)用程序剩余檢測子模塊,跳過Android應(yīng)用程序;如果數(shù)據(jù)是完整并且有效的,則根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);
Android應(yīng)用程序安裝子模塊:安裝Android應(yīng)用程序;檢測該應(yīng)用程序是否安裝成功;如果應(yīng)用程序安裝成功,則進(jìn)入Android虛擬機(jī)重啟子模塊;如果應(yīng)用程序沒有安全成功,則進(jìn)入首次安裝失敗與否檢測子模塊;
首次安裝失敗與否檢測子模塊:判斷是否是首次安裝失敗,如果是就返回Android應(yīng)用程序安裝子模塊;若否則跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊;
Android虛擬機(jī)重啟子模塊:重啟Android虛擬機(jī),啟動(dòng)采集網(wǎng)絡(luò)流量的tcpdump工具以及重啟前安裝的Android應(yīng)用程序;
應(yīng)用程序啟動(dòng)成功檢測子模塊:判斷應(yīng)用程序是否啟動(dòng)成功,如果啟動(dòng)失敗,則跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊;如果應(yīng)用程序啟動(dòng)成功,則啟動(dòng)Android應(yīng)用程序自動(dòng)化遍歷腳本,模擬人工操作環(huán)境;待Android應(yīng)用程序自動(dòng)化遍歷腳本執(zhí)行完畢后,保存采集的網(wǎng)絡(luò)流量,跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊。
Android虛擬機(jī)刪除子模塊:關(guān)閉并刪除Android虛擬機(jī);進(jìn)入Android應(yīng)用程序剩余檢測子模塊;
Android應(yīng)用程序剩余檢測子模塊:檢測Android應(yīng)用程序信息數(shù)組鏈表中是否還有Android應(yīng)用程序;如果有,則提取一組待采集網(wǎng)絡(luò)流量的應(yīng)用程序后跳轉(zhuǎn)至數(shù)據(jù)檢測子模塊,如果沒有,則結(jié)束。
本發(fā)明的有益效果:
(1)充分考慮到了在大量采集Android終端應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量時(shí)的效率問題,采用多線程的方式,每條線程控制一臺Android虛擬機(jī)進(jìn)行網(wǎng)絡(luò)流量采集,使得一臺PC機(jī)可以同時(shí)采集多個(gè)Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量。
(2)Android終端的創(chuàng)建、應(yīng)用程序的安裝運(yùn)行、網(wǎng)絡(luò)流量的收集等工作可以自動(dòng)化的完成;Android應(yīng)用程序網(wǎng)絡(luò)流量采集過程是自動(dòng)化進(jìn)行的,并在自動(dòng)化過程中加入編寫的操作腳本,模擬人在使用Android應(yīng)用程序時(shí)的操作,使產(chǎn)生的網(wǎng)絡(luò)流量更加接近Android手機(jī)用戶在現(xiàn)實(shí)中使用Android手機(jī)所產(chǎn)生的網(wǎng)絡(luò)流量。
附圖說明
圖1為本發(fā)明的總體結(jié)構(gòu)圖;
圖2為本發(fā)明的總體流程圖;
圖3為本發(fā)明實(shí)現(xiàn)配置線程數(shù)量子模塊的流程圖;
圖4為本發(fā)明實(shí)現(xiàn)獲取應(yīng)用程序基本信息子模塊的流程圖;
圖5為本發(fā)明實(shí)現(xiàn)線程控制器控制子線程啟動(dòng)模塊的流程圖;
圖6為本發(fā)明實(shí)現(xiàn)每一線程采集應(yīng)用程序網(wǎng)絡(luò)流量子模塊的流程圖;
圖7為本發(fā)明Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集系統(tǒng)功能模塊圖;
圖8為本發(fā)明Android應(yīng)用程序的基本信息提取模塊的內(nèi)部子模塊結(jié)構(gòu)圖;
圖9為本發(fā)明子線程啟動(dòng)模塊的內(nèi)部子模塊結(jié)構(gòu)圖
圖10為本發(fā)明網(wǎng)絡(luò)流量采集模塊的內(nèi)部子模塊結(jié)構(gòu)圖。
具體實(shí)施方式
下面結(jié)合附圖與實(shí)施例對本發(fā)明作進(jìn)一步說明。
一種多線程的Android應(yīng)用程序網(wǎng)絡(luò)流量自動(dòng)化采集方法具體工作過程為:
1)檢測Android應(yīng)用程序的數(shù)量并配置線程數(shù)量。掃描指定路徑下Android應(yīng)用程序的數(shù)量如果數(shù)量小于1,則記錄運(yùn)行日志后退出程序,如果數(shù)量大于1則查詢用戶是否指定線程數(shù),如果用戶指定了啟動(dòng)的線程數(shù)則按照要求初始化線程數(shù)量,如果沒有指定則程序根據(jù)當(dāng)然計(jì)算機(jī)的內(nèi)存資源和Android應(yīng)用程序的數(shù)量初始化線程。
2)提取Android應(yīng)用程序的基本信息。需要采集網(wǎng)絡(luò)流量的應(yīng)用程序存放在計(jì)算機(jī)本地的硬盤中,首先系統(tǒng)調(diào)用aapt dump badging命令提取應(yīng)用程序的packetname、mainactivity和minSDKVersion信息;然后將提取的信息和Android應(yīng)用程序的本地硬盤存放路徑一同存儲到數(shù)組中并將整個(gè)數(shù)組存入到數(shù)組鏈表中;最后重復(fù)前面兩步將全部的應(yīng)用程序信息存入到數(shù)組鏈表中,將鏈表返回給主程序。
3)啟動(dòng)線程控制器。線程控制器將存儲Android應(yīng)用程序信息的數(shù)組鏈表中的數(shù)據(jù)平分給每一個(gè)線程,并且每隔30秒啟動(dòng)一個(gè)線程,然后主線程阻塞等待全部線程執(zhí)行完畢。
4)子線程做采集Android應(yīng)用程序網(wǎng)絡(luò)流量的準(zhǔn)備工作。首先從傳入的參數(shù)中提取一條數(shù)組數(shù)據(jù),檢測數(shù)據(jù)的有效性,即Android應(yīng)用程序的安裝包是否存在,數(shù)組中數(shù)據(jù)數(shù)量是否正確;然后,根據(jù)minSDKVersion創(chuàng)建Android虛擬機(jī),啟動(dòng)虛擬機(jī);最后,等待虛擬機(jī)啟動(dòng)完畢后開始安裝Android應(yīng)用程序,檢測應(yīng)用程序是否安裝成功如果安裝成功則重啟Android虛擬機(jī),如果是首次安裝失敗,則再次嘗試安裝,如果非首次安裝失敗,則跳過這個(gè)Android應(yīng)用程序,直接安裝應(yīng)用程序數(shù)組鏈表中的下一個(gè)Android應(yīng)用程序。
5)子線程開始采集Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量。首先,待Android虛擬機(jī)重啟完畢后,啟動(dòng)Android虛擬機(jī)中的Tcpdump程序開始采集Android虛擬機(jī)的網(wǎng)絡(luò)流量;然后,運(yùn)行重啟前安裝的Android應(yīng)用程序并檢測Android應(yīng)用程序是否啟動(dòng)成功,如果啟動(dòng)失敗則關(guān)閉并刪除創(chuàng)建的Android模擬機(jī),記錄失敗日志然后循環(huán)回4)開始采集下一個(gè)Android應(yīng)該程序產(chǎn)生的網(wǎng)絡(luò)流量,如果啟動(dòng)成功則運(yùn)行Android應(yīng)用程序自動(dòng)化遍歷腳本,模擬人在使用Android應(yīng)用程序時(shí)的操作。
6)保存Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量。首先,待Android應(yīng)用程序自動(dòng)化遍歷腳本執(zhí)行完畢設(shè)定的動(dòng)作次數(shù)后,停止Android模擬機(jī)中的Tcpdump進(jìn)程;然后,通過pull命令將Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量文件拷貝回計(jì)算機(jī)本地硬盤中;最后關(guān)閉、刪除Android虛擬機(jī),記錄日志文件后檢測Android應(yīng)用程序信息數(shù)組鏈表中是否還有數(shù)據(jù),如果還有數(shù)據(jù)則循環(huán)會(huì)4)開始采集下一個(gè)Android應(yīng)用程序產(chǎn)生的網(wǎng)絡(luò)流量,如果沒有數(shù)據(jù)則結(jié)束線程,返回主線程。
為了更好的理解本發(fā)明,以下給出了本發(fā)明更為詳細(xì)的說明:
圖1為本發(fā)明實(shí)現(xiàn)多線程Android應(yīng)用程序網(wǎng)絡(luò)流量自動(dòng)化采集方法的總體結(jié)構(gòu)圖,如圖1所示。信息源層、管控層和采集層;
信息源層,用于從Android應(yīng)用程序中提取必要信息,并將信息傳遞給管控層;所述必要信息包括MainActivity、packetname和minSDKVersion;
管控層負(fù)責(zé)多線程的調(diào)度工作,提取信息后的Android應(yīng)用程序隨提取的信息一同進(jìn)入到應(yīng)用程序信息隊(duì)列,等待提取執(zhí)行,該層包括線程控制器、臨界資源鎖和應(yīng)用程序信息隊(duì)列。
線程控制器用于控制系統(tǒng)線程,包括線程創(chuàng)建、初始化、監(jiān)控線程運(yùn)行情況以及銷毀線程等。
臨界資源鎖在每一個(gè)線程調(diào)用臨界資源時(shí)用到,包括請求臨界資源,加鎖,讀取寫入臨界資源,解鎖,等待等操作。
應(yīng)用程序信息隊(duì)列用戶存儲信息源層傳來的信息,以及應(yīng)用程序安裝包的名稱和存放路徑,用于線程在隊(duì)列中獲取應(yīng)用程序的信息;
所述臨界資源鎖用于控制多線程任務(wù)執(zhí)行時(shí)的資源爭搶問題,加入了臨界資源鎖,保證信息不被死鎖。即一旦臨界資源被使用,則其他線程無法在請求使用臨界資源,只有等待其他線程使用臨界資源完畢后,臨界資源鎖被打開才能請求使用臨界資源。
所述采集層包括Android虛擬機(jī)控制模塊、流量獲取模塊、異常處理模塊和虛擬操作模塊;
所述Android虛擬機(jī)控制模塊,用于控制Android虛擬機(jī)創(chuàng)建、Android虛擬機(jī)開啟、將指定應(yīng)用程序安裝到Android虛擬機(jī)中、運(yùn)行安裝的應(yīng)用程序、啟動(dòng)流量獲取模塊、啟動(dòng)虛擬操作模塊、將產(chǎn)生的異常事件發(fā)送給異常處理模塊和Android虛擬機(jī)關(guān)閉刪除;
所述流量獲取模塊,用于采集應(yīng)用程序的網(wǎng)絡(luò)流量;
所述異常處理模塊,用于對線程運(yùn)行過程中遇到的異常情況進(jìn)行處理;
所述虛擬操作模塊,用于在應(yīng)用程序運(yùn)行期間,模擬人工操作。
圖2為本發(fā)明實(shí)現(xiàn)多線程Android應(yīng)用程序網(wǎng)絡(luò)流量自動(dòng)化采集方法的總體流程圖,如圖2所示。該方法包括:
步驟110,檢測指定目錄下是否有Android應(yīng)用程序。
步驟111,如果沒有Android應(yīng)用程序,則說明沒有待提取網(wǎng)絡(luò)流量的Android應(yīng)用程序。記錄本次操作的日志,然后退出。即當(dāng)前系統(tǒng)內(nèi)存剩余數(shù)量除以一個(gè)線程所需的內(nèi)存數(shù)量,對結(jié)果取整數(shù),該整數(shù)即為可以啟動(dòng)的線程數(shù)量;
步驟112,根據(jù)用戶設(shè)定的線程數(shù)量或者根據(jù)計(jì)算機(jī)內(nèi)存等資源空閑情況,自動(dòng)確定啟動(dòng)的線程數(shù)量。
步驟113,通過Android AssetPackaging工具提取出應(yīng)用程序的MainActivity,packetname,minSDKVersion等信息,再將這些信息與Android應(yīng)用程序的存放路徑存儲在數(shù)組鏈表中。
步驟114,線程控制器控制子線程啟動(dòng)。
步驟115,線程控制器控制每一個(gè)線程進(jìn)行網(wǎng)絡(luò)流量采集工作。
圖3為本發(fā)明實(shí)現(xiàn)配置線程數(shù)量子模塊的流程圖,如圖3所示。該方法包括:
步驟120,步驟112需要輸入?yún)?shù),輸入?yún)?shù)要么為Android應(yīng)用程序的數(shù)量,要么為用戶在程序開始前輸入的設(shè)定的線程數(shù)量。
步驟121,檢測輸入的參數(shù)是否為用戶輸入的線程數(shù)量,如果是則直接輸出線程數(shù)量。
步驟122,如果輸入的參數(shù)是Android應(yīng)用程序的數(shù)量,則檢測計(jì)算機(jī)的內(nèi)存剩余量,CPU使用率等現(xiàn)象。
步驟123,根據(jù)單個(gè)Android虛擬機(jī)運(yùn)行所消耗的內(nèi)存和CPU以及步驟122中檢測到當(dāng)前計(jì)算機(jī)剩余資源情況,計(jì)算得出當(dāng)前計(jì)算機(jī)可以容納的最多線程數(shù)量。
步驟124,將計(jì)算得出的線程數(shù)量或者用戶設(shè)定的線程數(shù)量輸出。
圖4為本發(fā)明實(shí)現(xiàn)獲取應(yīng)用程序基本信息子模塊的流程圖,如圖4所示,該方法包括:
步驟130,調(diào)用Android Asset Packaging工具中的aapt dump badging命令反編譯AndroidManifest文件。
步驟131,檢測反編譯是否成功。
步驟132,反編譯如果失敗,則記錄錯(cuò)誤信息后結(jié)束。
步驟133,反編譯如果成功,則在反編譯后的AndroidManifest文件中提取該應(yīng)用程序的MainActivity,packet name和minSDKVersion信息。其中只有minSDKVersion是需要進(jìn)行一步檢測的,MainActivity信息和packet name信息是無需檢測,直接等待minSDKVersion的檢測結(jié)果后,一同存儲到數(shù)組鏈表中的;
步驟134,檢測minSDKVersion信息是否存在。
步驟135,如果沒設(shè)定minSDKVersion信息,則使用最高版本的SDK。
步驟136,如果存在則使用設(shè)定的SDK版本。
步驟137,將以上提取的信息打包成信息數(shù)組,存入數(shù)組鏈表中,并返回主程序。
圖5為本發(fā)明實(shí)現(xiàn)線程控制器控制子線程啟動(dòng)模塊的流程圖,如圖5所示,該方法包括:
步驟140,創(chuàng)建一個(gè)子線程,并將啟動(dòng)參數(shù)傳入。啟動(dòng)參數(shù)包括該線程需要檢測的應(yīng)用程序信息數(shù)組鏈表,SDK版本。
步驟141,檢測創(chuàng)建的線程數(shù)量是否達(dá)到了設(shè)定的數(shù)量。如果未達(dá)到設(shè)定的線程數(shù)量,則返回步驟140繼續(xù)創(chuàng)建線程。
步驟142,如果創(chuàng)建的線程數(shù)量達(dá)到設(shè)定的數(shù)量,則啟動(dòng)全部線程。
步驟143,主程序阻塞,等待子線程全部執(zhí)行完畢。
圖6為本發(fā)明實(shí)現(xiàn)每一線程采集應(yīng)用程序網(wǎng)絡(luò)流量子模塊的流程圖,如圖6所示,該方法包括:
步驟150,在數(shù)組鏈表中提取一組數(shù)據(jù),檢測數(shù)據(jù)完整性,有效性。
步驟151,數(shù)據(jù)是否完整有效,如果數(shù)據(jù)不完整或者存在無效字符,則說明該應(yīng)用程序提取的信息有誤,跳轉(zhuǎn)至步驟162跳過該應(yīng)用程序。
步驟152,如果數(shù)據(jù)是完整并且有效的,則根據(jù)SDK信息創(chuàng)建Android虛擬機(jī)。
步驟153,等待Android虛擬機(jī)啟動(dòng)完畢后,開始安裝應(yīng)用程序。
步驟154,檢測該應(yīng)用程序是否安裝成功。
步驟155,如果應(yīng)用程序沒有安全成功,并且是首次安裝失敗,則返回步驟153再次安裝。如果非首次安裝失敗,則說明該應(yīng)用程序安裝出現(xiàn)問題,跳轉(zhuǎn)至步驟161。
步驟156,如果應(yīng)用程序安裝成功,則重啟Android虛擬機(jī)。
步驟157,啟動(dòng)采集網(wǎng)絡(luò)流量的tcpdump工具程序以及重啟前安裝的應(yīng)用程序。
步驟158,檢測應(yīng)用程序是否啟動(dòng)成功。如果啟動(dòng)失敗,則跳轉(zhuǎn)至步驟161。
步驟159,如果應(yīng)用程序啟動(dòng)成功,則啟動(dòng)Android應(yīng)用程序自動(dòng)化遍歷腳本,模擬人工操作環(huán)境。
步驟160,待Android應(yīng)用程序自動(dòng)化遍歷腳本執(zhí)行完畢后,保存采集的網(wǎng)絡(luò)流量,并拷貝到計(jì)算機(jī)本地硬盤中。
步驟161,關(guān)閉并刪除Android虛擬機(jī)。
步驟162,檢測Android應(yīng)用程序信息數(shù)組鏈表中是否還有數(shù)據(jù)。如果還有數(shù)據(jù)則說明還有待采集網(wǎng)絡(luò)流量的應(yīng)用程序,提取一組數(shù)據(jù)后跳轉(zhuǎn)至步驟150,如果沒有數(shù)據(jù),則說明本線程的Android應(yīng)用程序網(wǎng)絡(luò)流量采集工作以及完成,結(jié)束并返回主程序。
如圖7所示,Android應(yīng)用程序網(wǎng)絡(luò)流量多線程采集系統(tǒng),包括:
Android應(yīng)用程序是否存在判斷模塊:判斷設(shè)定目錄下是否有Android應(yīng)用程序;如果沒有Android應(yīng)用程序,則記錄本次操作的日志,然后結(jié)束;若有Android應(yīng)用程序則進(jìn)入線程數(shù)量配置模塊;
線程數(shù)量配置模塊:根據(jù)設(shè)定的線程數(shù)量或者根據(jù)計(jì)算機(jī)內(nèi)存資源空閑情況,確定啟動(dòng)的線程數(shù)量;
Android應(yīng)用程序的基本信息提取模塊:提取Android應(yīng)用程序的基本信息,檢測基本信息中的SDK版本,將提取出的基本信息與Android應(yīng)用程序的存放路徑對應(yīng)存儲在應(yīng)用程序信息隊(duì)列的應(yīng)用程序數(shù)組鏈表中;
子線程啟動(dòng)模塊:接收數(shù)組鏈表;根據(jù)線程數(shù)量配置模塊中得到的線程數(shù)量,控制全部的子線程啟動(dòng);
網(wǎng)絡(luò)流量采集模塊:根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);安裝Android應(yīng)用程序;每一個(gè)子線程對應(yīng)用程序數(shù)組鏈表中的Android應(yīng)用程序進(jìn)行網(wǎng)絡(luò)流量采集。
優(yōu)選的,所述Android應(yīng)用程序的基本信息提取模塊通過Android AssetPackaging工具提取出應(yīng)用程序的MainActivity、packetname和minSDKVersion信息。
所述線程數(shù)量配置模塊包括:
判斷輸入?yún)?shù)是設(shè)定的線程數(shù)量還是Android應(yīng)用程序的數(shù)量;若是設(shè)定的線程數(shù)量,則直接輸出線程數(shù)量;若是Android應(yīng)用程序的數(shù)量,則檢測計(jì)算機(jī)的剩余資源,根據(jù)單個(gè)Android虛擬機(jī)運(yùn)行所消耗資源和計(jì)算機(jī)的剩余資源,通過計(jì)算得出當(dāng)前計(jì)算機(jī)能夠容納的線程數(shù)量;將計(jì)算得出的線程數(shù)量輸出。
優(yōu)選的,所述線程數(shù)量配置模塊中計(jì)算機(jī)內(nèi)存資源空閑情況是指計(jì)算機(jī)內(nèi)存剩余量和CPU剩余量。
如圖8所示,所述Android應(yīng)用程序的基本信息提取模塊包括:
反編譯子模塊:對AndroidManifest文件進(jìn)行反編譯操作;檢測反編譯是否成功,反編譯如果失敗,則記錄錯(cuò)誤信息后結(jié)束;反編譯如果成功,則進(jìn)入信息獲取子模塊;
信息獲取子模塊,在反編譯后的AndroidManifest文件中提取應(yīng)用程序的基本信息;
SDK版本檢測子模塊:檢測基本信息中的SDK版本,判斷是否存在minSDKVersion信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
打包子模塊:將提取出來的應(yīng)用程序的信息打包成信息數(shù)組,存入數(shù)組鏈表中。
優(yōu)選的,所述反編譯子模塊中調(diào)用Android Asset Packaging工具中的aapt dump badging命令對AndroidManifest文件進(jìn)行反編譯操作。
優(yōu)選的,所述反編譯子模塊中應(yīng)用程序的基本信息包括:MainActivity,packet name和minSDKVersion信息。
優(yōu)選的,SDK版本檢測子模塊:檢測基本信息中的SDK版本(software development kit即軟件開發(fā)工具包,SDK版本可以理解為android系統(tǒng)的版本),是否存在minSDKVersion(應(yīng)用程序可以運(yùn)行的最低的SDK版本)信息,若不存在,則使用最高版本的SDK;若存在,則使用設(shè)定版本的SDK;
如圖9所示,所述子線程啟動(dòng)模塊包括如下步驟:
子線程創(chuàng)建子模塊:創(chuàng)建一個(gè)子線程,并將啟動(dòng)參數(shù)傳入;所述啟動(dòng)參數(shù)包括子線程需要檢測的應(yīng)用程序數(shù)組鏈表和SDK版本。
子線程數(shù)量檢測子模塊:判斷創(chuàng)建的子線程數(shù)量是否達(dá)到設(shè)定數(shù)量,如果未達(dá)到設(shè)定的子線程數(shù)量,則返回子線程創(chuàng)建子模塊繼續(xù)創(chuàng)建子線程;如果創(chuàng)建的子線程數(shù)量達(dá)到設(shè)定的數(shù)量,則啟動(dòng)全部子線程;
子線程執(zhí)行等待子模塊:主程序阻塞,等待子線程全部執(zhí)行完畢。
如圖10所示,所述網(wǎng)絡(luò)流量采集模塊包括如下步驟:
數(shù)據(jù)檢測子模塊:在數(shù)組鏈表中提取一組數(shù)據(jù),檢測數(shù)據(jù)是否完整有效;如果數(shù)據(jù)不完整或者存在無效字符,則說明Android應(yīng)用程序提取的信息有誤,跳轉(zhuǎn)至Android應(yīng)用程序剩余檢測子模塊,跳過Android應(yīng)用程序;如果數(shù)據(jù)是完整并且有效的,則根據(jù)SDK版本創(chuàng)建Android虛擬機(jī);啟動(dòng)Android虛擬機(jī);
Android應(yīng)用程序安裝子模塊:安裝Android應(yīng)用程序;檢測該應(yīng)用程序是否安裝成功;如果應(yīng)用程序安裝成功,則進(jìn)入Android虛擬機(jī)重啟子模塊;如果應(yīng)用程序沒有安全成功,則進(jìn)入首次安裝失敗與否檢測子模塊;
首次安裝失敗與否檢測子模塊:判斷是否是首次安裝失敗,如果是就返回Android應(yīng)用程序安裝子模塊;若否則跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊;
Android虛擬機(jī)重啟子模塊:重啟Android虛擬機(jī),啟動(dòng)采集網(wǎng)絡(luò)流量的tcpdump工具以及重啟前安裝的Android應(yīng)用程序;
應(yīng)用程序啟動(dòng)成功檢測子模塊:判斷應(yīng)用程序是否啟動(dòng)成功,如果啟動(dòng)失敗,則跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊;如果應(yīng)用程序啟動(dòng)成功,則啟動(dòng)Android應(yīng)用程序自動(dòng)化遍歷腳本,模擬人工操作環(huán)境;待Android應(yīng)用程序自動(dòng)化遍歷腳本執(zhí)行完畢后,保存采集的網(wǎng)絡(luò)流量,跳轉(zhuǎn)至Android虛擬機(jī)刪除子模塊。
Android虛擬機(jī)刪除子模塊:關(guān)閉并刪除Android虛擬機(jī);進(jìn)入Android應(yīng)用程序剩余檢測子模塊;
Android應(yīng)用程序剩余檢測子模塊:檢測Android應(yīng)用程序信息數(shù)組鏈表中是否還有Android應(yīng)用程序;如果有,則提取一組待采集網(wǎng)絡(luò)流量的應(yīng)用程序后跳轉(zhuǎn)至數(shù)據(jù)檢測子模塊,如果沒有,則結(jié)束。
上述雖然結(jié)合附圖對本發(fā)明的具體實(shí)施方式進(jìn)行了描述,但并非對本發(fā)明保護(hù)范圍的限制,所屬領(lǐng)域技術(shù)人員應(yīng)該明白,在本發(fā)明的技術(shù)方案的基礎(chǔ)上,本領(lǐng)域技術(shù)人員不需要付出創(chuàng)造性勞動(dòng)即可做出的各種修改或變形仍在本發(fā)明的保護(hù)范圍以內(nèi)。