序被卸載,由于第一進程位于應用層,第一進程會隨著該應用 程序被卸載而被釋放掉,所以在操作系統(tǒng)層對第一進程復制得到位于操作系統(tǒng)層的第二進 程,并在后續(xù)將第二進程配置成為監(jiān)控進程,如此監(jiān)控進程在應用程序被卸載后仍可以獲 取該應用程序的卸載信息并將卸載信息發(fā)送給服務器。
[0055] 具體地,通過第一進程從終端的操作系統(tǒng)層調(diào)用fork方法。設置第一進程在終端 的操作系統(tǒng)層通過fork方法對第一進程進行復制得到第二進程。
[0056] 其中,fork方法,又稱分叉函數(shù),一個現(xiàn)有進程可以調(diào)用fork方法創(chuàng)建一個新進 程。由fork創(chuàng)建的新進程被稱為子進程。子進程是父進程的副本,子進程與父進程占用的 內(nèi)存空間大小相同。在本發(fā)明實施例中,第二進程是第一進程的子進程,第二進程所占的內(nèi) 存空間與第一進程所占的內(nèi)存空間大小相同。由于第一進程的內(nèi)存空間較大,所以第二進 程的內(nèi)存空間也較大。
[0057] 例如,通過第一進程Pl從終端的操作系統(tǒng)層調(diào)用fork方法。設置第一進程Pl在 終端的操作系統(tǒng)層通過fork方法對第一進程Pl進行復制得到第二進程P2。
[0058] 其中,在通過上述步驟202的操作在終端的操作系統(tǒng)層創(chuàng)建第二進程之后,通過 如下步驟203的操作將第二進程轉(zhuǎn)變?yōu)楸O(jiān)控進程。
[0059] 步驟203 :設置第二進程運行卸載監(jiān)控程序,以將第二進程轉(zhuǎn)變?yōu)楸O(jiān)控進程;
[0060] 具體地,通過第二進程從終端的操作系統(tǒng)層調(diào)用exec方法??刂频诙M程通過 exec方法運行卸載監(jiān)控程序,以將第二進程轉(zhuǎn)變?yōu)楸O(jiān)控進程。
[0061] 其中,exec方法將當前進程的正文、數(shù)據(jù)和存儲空間等替換成新的程序文件。如 果當前進程的邏輯復雜且內(nèi)存空間很大時,可以通過exec方法將當前進程的正文、數(shù)據(jù)和 存儲空間等替換為邏輯簡單且內(nèi)存空間較小的可執(zhí)行程序。
[0062] 例如,通過第二進程P2從終端的操作系統(tǒng)層調(diào)用exec方法??刂频诙M程P2通 過exec方法運行卸載監(jiān)控程序,以將第二進程P2轉(zhuǎn)變?yōu)楸O(jiān)控進程P"。
[0063] 其中,由于應用層的進程包含系統(tǒng)資源和虛擬機環(huán)境,導致應用層的進程所占的 內(nèi)存空間較大,一般為幾十兆字節(jié)。所以第一進程所占的內(nèi)存空間較大。導致通過fork 方法對第一進程進行復制得到的第二進程所占的內(nèi)存空間也較大。為了節(jié)省內(nèi)存空間,控 制第二進程通過exec方法運行一個內(nèi)存空間較小的可執(zhí)行程序,即卸載監(jiān)控程序,該卸載 監(jiān)控程序為一個含有卸載監(jiān)控邏輯的二進制程序,由于該卸載監(jiān)控程序所占的內(nèi)存空間很 小,所以大大節(jié)省了內(nèi)存空間。例如,假設第一進程的內(nèi)存空間為20MB,卸載監(jiān)控程序的內(nèi) 存空間為100KB,則第二進程的內(nèi)存空間也為20MB??刂频诙M程通過exec方法運行卸載 監(jiān)控程序,如此將內(nèi)存空間20MB的第二進程轉(zhuǎn)變?yōu)閮?nèi)存空間為100KB的監(jiān)控進程,大大節(jié) 省了內(nèi)存空間。
[0064] 其中,由于第一進程是由該應用程序創(chuàng)建的,所以第一進程中包含與該應用程序 進行通信的接口。通過fork方法對第一進程進行復制時也對該接口進行了復制,所以復制 得到的第二進程中也包含與該應用程序進行通信的接口。所以通過exec方法將第二進程 轉(zhuǎn)變?yōu)楸O(jiān)控進程后,該監(jiān)控進程可以建立與該應用程序之間的套接字連接,并通過該套接 字連接與該應用程序進行通信。
[0065] 其中,通過上述步驟203的操作得到監(jiān)控進程之后,按照如下步驟204和205的操 作通過該監(jiān)控進程實時監(jiān)控該應用程序以及獲取該應用程序的狀態(tài)數(shù)據(jù)。
[0066] 步驟204 :通過該監(jiān)控進程監(jiān)控該應用程序;
[0067] 具體地,根據(jù)該應用程序的名稱,從文件目錄中獲取該應用程序?qū)奈募夸?項,通過該監(jiān)控進程對文件目錄中該應用程序?qū)奈募夸涰椷M行實時監(jiān)控,以實現(xiàn)通 過監(jiān)控進程監(jiān)控該應用程序。
[0068] 其中,文件目錄中記錄了終端上的每個應用程序?qū)奈募夸涰?。文件目錄?至少包括該應用程序的名稱,文件目錄項可以為應用程序的存儲路徑等。當某個應用程序 被卸載時,該應用程序?qū)奈募夸涰棇奈募夸浿袆h除。所以如果監(jiān)控進程監(jiān)控 到該應用程序?qū)奈募夸涰棻粍h除,則可以確定出該應用程序被卸載。
[0069] 例如,假設應用程序A的文件目錄項為C:\Programe Files\A。根據(jù)該應用程序的 名稱A,從文件目錄中獲取該應用程序A對應的文件目錄項C: \Programe Files\A,通過該 監(jiān)控進程Pm對文件目錄中該應用程序A對應的存儲路徑C: \Programe Files\A進行實時 監(jiān)控,以實現(xiàn)通過監(jiān)控進程Pni監(jiān)控該應用程序A。
[0070] 步驟205 :通過該監(jiān)控進程獲取該應用程序在運行過程中產(chǎn)生的狀態(tài)數(shù)據(jù);
[0071] 其中,狀態(tài)數(shù)據(jù)包括應用程序在運行過程中產(chǎn)生的所有數(shù)據(jù)。例如,應用程序在運 行過程中打開一個網(wǎng)頁頁面,該網(wǎng)頁頁面包括文本輸入框,用戶向該網(wǎng)頁頁面包括的文本 輸入框中輸入文本信息,此時該應用程序發(fā)生了閃退。則在此過程中打開的網(wǎng)頁頁面以及 該網(wǎng)頁頁面的打開時間、用戶輸入的文本信息和應用程序的閃退信息都是該應用程序的狀 態(tài)數(shù)據(jù)。
[0072] 本步驟具體為,在監(jiān)控進程與該應用程序之間建立套接字連接??刂圃摫O(jiān)控進程 通過該套接字連接實時獲取該應用程序在運行過程中產(chǎn)生的狀態(tài)數(shù)據(jù),將該應用程序的應 用標識和獲取的狀態(tài)數(shù)據(jù)存儲在應用標識和狀態(tài)數(shù)據(jù)的對應關(guān)系中。
[0073] 其中,在應用程序運行過程中,應用程序?qū)崟r記錄產(chǎn)生的狀態(tài)數(shù)據(jù),然后通過監(jiān)控 進程與該應用程序之間的套接字連接將產(chǎn)生的狀態(tài)數(shù)據(jù)發(fā)送給監(jiān)控進程。
[0074] 例如,在監(jiān)控進程Pni與該應用程序A之間建立套接字連接??刂圃摫O(jiān)控進程P ni通 過該套接字連接實時獲取該應用程序A在運行過程中產(chǎn)生的狀態(tài)數(shù)據(jù),將應用程序A的應 用標識Appl和獲取的狀態(tài)數(shù)據(jù)Sl存儲在如表1所示的應用標識和狀態(tài)數(shù)據(jù)的對應關(guān)系 中。
[0077] 進一步地,除了通過監(jiān)控進程與該應用程序之間的套接字連接來直接獲取該應用 程序的狀態(tài)數(shù)據(jù)外,還可以通過如下方式來獲取該應用程序的狀態(tài)數(shù)據(jù),具體為:通過該應 用程序記錄運行過程中產(chǎn)生的狀態(tài)數(shù)據(jù)并將狀態(tài)數(shù)據(jù)存儲在終端的安全卡中。在監(jiān)控進程 與該應用程序之間建立套接字連接。控制該監(jiān)控進程通過該套接字連接從該應用程序獲取 狀態(tài)數(shù)據(jù)的存儲位置。當應用程序被卸載時,該監(jiān)控進程可以根據(jù)獲取的狀態(tài)數(shù)據(jù)的存儲 位置,從該存儲位置處獲取該應用程序的狀態(tài)數(shù)據(jù)。
[0078] 其中,將狀態(tài)數(shù)據(jù)存儲在終端的安全卡中,在應用程序被卸載之后,安全卡中的狀 態(tài)數(shù)據(jù)不會被刪除。
[0079] 步驟206 :當監(jiān)控出該應用程序被卸載時,通過該監(jiān)控進程獲取該應用程序的卸 載信息,該卸載信息包括終端標識、該應用程序的應用標識和狀態(tài)數(shù)據(jù);
[0080] 具體地,通過該監(jiān)控進程對該應用程序進行實時監(jiān)控,如果通過該監(jiān)控進程監(jiān)控 到該應用程序?qū)奈募夸涰棌奈募夸浿袆h除,則判斷出該應用程序被卸載。獲取終 端標識和該應用程序的應用標識。根據(jù)該應用程序的應用標識,通過該監(jiān)控進程從已存儲 的應用標識和狀態(tài)數(shù)據(jù)的對應關(guān)系中獲取該應用程序的狀態(tài)數(shù)據(jù)。將獲取的終端標識、該 應用程序的應用標識和狀態(tài)數(shù)據(jù)組成該應用程序的卸載信息。
[0081] 其中,當應用程序被卸載后,該應用程序的所有文件都被刪除,且該應用程序在應 用層創(chuàng)建的所有進程都被釋放掉,即第一進程也被釋放掉。而位于操作系統(tǒng)層的第二進程 仍被保留,即監(jiān)控進程仍保留。
[0082] 例如,通過該監(jiān)控進程Pni對該應用程序A進行實時監(jiān)控,如果通過監(jiān)控進程P ni監(jiān) 控到該應用程序A對應的文件目錄項C: \Programe Files\A從文件目錄中刪除,貝U判斷出 該應用程序A被卸載。獲取終端標識M和該應用程序A的應用標識Appl。根據(jù)該應用程序 A的應用標識Appl,通過該監(jiān)控進程Pni從已存儲的如表1所示的應用標識和狀態(tài)數(shù)據(jù)的對 應關(guān)系中獲取應用程序A的狀態(tài)數(shù)據(jù)S1。將獲取的終端標識M、該應用程序A的應用標識 Appl和狀態(tài)數(shù)據(jù)Sl組成該應用程序A的卸載信息。
[00