一種安卓Android平臺(tái)異常處理的方法和裝置制造方法
【專利摘要】本發(fā)明實(shí)施例提供了一種安卓Android平臺(tái)異常處理的方法和裝置,所述安卓Android平臺(tái)包括JAVA層及C++層,所述方法包括:在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù)時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù);在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);中止所述程序的運(yùn)行。本發(fā)明實(shí)施例用以在安卓Android平臺(tái)檢測到C++層出現(xiàn)異常時(shí),將C++層的異常轉(zhuǎn)換為JAVA層的異常后進(jìn)行收集。
【專利說明】-種安卓Android平臺(tái)異常處理的方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及異常處理【技術(shù)領(lǐng)域】,特別是涉及一種安卓Android平臺(tái)異常處理的方 法和一種安卓Android平臺(tái)異常處理的裝置。
【背景技術(shù)】
[0002] 大多數(shù)終端都具有檢測程序運(yùn)行時(shí)錯(cuò)誤情況的能力,使程序能夠按照一種標(biāo)準(zhǔn)的 方式,在檢測出某種事件的發(fā)生時(shí),通知程序以便能夠做出必要地反應(yīng)。簡而言之,當(dāng)程序 出現(xiàn)異常后,程序?qū)⑨槍Ξ惓_M(jìn)行相應(yīng)的處理。這種機(jī)制被統(tǒng)稱為異常機(jī)制。
[0003] 異常機(jī)制的處理流程可以包括:1、遇到程序出現(xiàn)異常,立即結(jié)束該程序調(diào)用的方 法,并不返回一個(gè)值;同時(shí),拋出一個(gè)異常對象;2、搜索可以處理該異常的異常處理器進(jìn)行 異常捕獲,停止調(diào)用該方法的程序的繼續(xù)執(zhí)行。
[0004] 在具體實(shí)現(xiàn)中,安卓Android平臺(tái)中一般包括JAVA層和C++層,在程序運(yùn)行的過 程中,如果在JAVA層出現(xiàn)異常時(shí),JAVA層可以直接根據(jù)異常打印調(diào)用堆棧信息,從而根據(jù) 調(diào)用棧信息獲得JAVA層的異常信息,但是如果在C++層出現(xiàn)異常時(shí),由于在安卓Android 平臺(tái)中C++層不支持直接打印調(diào)用棧信息,故無法獲取到C++層的異常信息。因此,由于無 法收集到C++層的異常信息,對于程序故障bug的修復(fù)毫無幫助。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明實(shí)施例所要解決的技術(shù)問題是提供一種安卓Android平臺(tái)異常處理的方 法,用以在安卓Android平臺(tái)檢測到C++層出現(xiàn)異常時(shí),將C++層的異常轉(zhuǎn)換為JAVA層的 異常后進(jìn)行收集。
[0006] 相應(yīng)的,本發(fā)明實(shí)施例還提供了一種安卓Android平臺(tái)異常處理的裝置,用以保 證上述方法的實(shí)現(xiàn)及應(yīng)用。
[0007] 為了解決上述問題,本發(fā)明公開了一種安卓Android平臺(tái)異常處理的方法,所述 安卓Android平臺(tái)包括JAVA層及C++層,所述方法包括:
[0008] 在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù)時(shí),將所述 C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);
[0009] 收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù);
[0010] 在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);
[0011] 中止所述程序的運(yùn)行。
[0012] 優(yōu)選地,在所述安卓Android平臺(tái)中注冊有針對C++層的各類異常數(shù)據(jù)對應(yīng)的各 種異常處理函數(shù);所述將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù)的步驟包括:
[0013] 調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)Sigaction獲取所述C++層的異常數(shù)據(jù);
[0014] 采用所述異常數(shù)據(jù)獲取所述對應(yīng)的異常處理函數(shù);
[0015] 采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ;
[0016] 采用所述JAVA本地接口 JNI調(diào)用預(yù)置的JAVA層信號(hào)捕獲函數(shù);所述預(yù)置的JAVA 層信號(hào)捕獲函數(shù)用于依據(jù)所述C++層的異常數(shù)據(jù)生成JAVA層的異常數(shù)據(jù)。
[0017] 優(yōu)選地,在安卓Android平臺(tái)包括日志LOG信息;所述收集轉(zhuǎn)換后的JAVA層的異 常數(shù)據(jù)的步驟包括:
[0018] 調(diào)用預(yù)置的未捕獲異常處理函數(shù)UncaughtExceptionHandler獲取所述調(diào)用棧信 息;所述調(diào)用棧信息包括所述JAVA層的異常的函數(shù)調(diào)用關(guān)系;
[0019] 從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
[0020] 優(yōu)選地,所述方法還包括:
[0021] 若檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異常的 函數(shù)調(diào)用關(guān)系;
[0022] 從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
[0023] 優(yōu)選地,所述在安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù)的步驟包括:
[0024] 獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng)前時(shí)間;
[0025] 將所述異常數(shù)據(jù)保存于采用程序名以及當(dāng)前時(shí)間命名的文件中;
[0026] 對所述文件進(jìn)行壓縮。
[0027] 優(yōu)選地,在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù)的步驟之后,還 包括:查詢是否上傳所述JAVA層的異常數(shù)據(jù)至預(yù)置的服務(wù)器;
[0028] 若是,則上傳所述JAVA層的異常數(shù)據(jù)至所述預(yù)置的服務(wù)器。
[0029] 本發(fā)明實(shí)施例還公開了一種安卓Android平臺(tái)異常處理的裝置,所述安卓 Android平臺(tái)包括JAVA層及C++層,所述裝置包括:
[0030] 轉(zhuǎn)換模塊,用于在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常 數(shù)據(jù)時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);
[0031] 收集模塊,用于收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù);
[0032] 保存模塊,用于在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);
[0033] 中止模塊,用于中止所述程序的運(yùn)行。
[0034] 優(yōu)選地,在所述安卓Android平臺(tái)中注冊有針對C++層的各類異常對應(yīng)的各種異 常處理函數(shù);所述轉(zhuǎn)換模塊包括:
[0035] 函數(shù)調(diào)用單元,用于調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)sigaction獲取所述 C++層的異常信號(hào);
[0036] 函數(shù)獲取單元,用于采用所述異常數(shù)據(jù)獲取所述對應(yīng)的異常處理函數(shù);
[0037] 接口調(diào)用子模塊,用于采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ;
[0038] 異常生成子模塊,用于采用所述異常處理函數(shù)通過JAVA本地接口 JNI調(diào)用預(yù)置的 JAVA層信號(hào)捕獲函數(shù);所述預(yù)置的JAVA層信號(hào)捕獲函數(shù)用于依據(jù)所述C++層的異常數(shù)據(jù) 生成JAVA層的異常數(shù)據(jù)。
[0039] 優(yōu)選地,所述收集模塊包括:
[0040] 調(diào)用棧信息獲取子模塊,用于調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取所述調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異 常的函數(shù)調(diào)用關(guān)系;
[0041] 第一異常信息獲取子模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對 應(yīng)的異常數(shù)據(jù)。
[0042] 優(yōu)選地,所述裝置還包括:
[0043] JAVA層檢測模塊,用于若檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處 理函數(shù)UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的 異常的函數(shù)調(diào)用關(guān)系;
[0044] 第二異常信息獲取模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng) 的異常數(shù)據(jù)。
[0045] 優(yōu)選地,所述保存模塊包括:
[0046] 程序名獲取子模塊,用于獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng) 前時(shí)間;
[0047] 異常信息存入子模塊,用于將所述異常數(shù)據(jù)保存于采用程序名以及當(dāng)前時(shí)間命名 的文件中;
[0048] 文件壓縮子模塊,用于對所述文件進(jìn)行壓縮。
[0049] 優(yōu)選地,所述裝置還包括:
[0050] 查詢子模塊,用于查詢是否上傳所述JAVA層的異常數(shù)據(jù)至預(yù)置的服務(wù)器;若是, 則調(diào)用上傳子模塊;
[0051] 上傳子模塊,用于上傳所述JAVA層的異常數(shù)據(jù)至所述預(yù)置的服務(wù)器。
[0052] 與現(xiàn)有技術(shù)相比,本發(fā)明實(shí)施例包括以下優(yōu)點(diǎn):
[0053] 在本發(fā)明實(shí)施例中,在安卓Android平臺(tái)檢測到C++層出現(xiàn)異常數(shù)據(jù)時(shí),將C++層 的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),并收集轉(zhuǎn)換后JAVA層的異常數(shù)據(jù)上傳至服務(wù)器。本 發(fā)明實(shí)施例將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),并交由JAVA層進(jìn)行收集操作, 無論JAVA層發(fā)生異常還是C++層發(fā)生異常,JAVA層都能捕獲到,實(shí)現(xiàn)異常數(shù)據(jù)收集的統(tǒng)一 處理,提高安卓Android平臺(tái)處理性能。
【專利附圖】
【附圖說明】
[0054] 圖1是本發(fā)明的一種安卓Android平臺(tái)異常處理方法實(shí)施例一的步驟流程圖;
[0055] 圖2是本發(fā)明的一種安卓Android平臺(tái)異常處理方法實(shí)施例二的步驟流程圖;
[0056] 圖3是本發(fā)明的一種安卓Android平臺(tái)異常捕獲和收集的流程示意圖;
[0057] 圖4是本發(fā)明的一種安卓Android平臺(tái)異常處理裝置實(shí)施例的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0058] 為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí) 施方式對本發(fā)明作進(jìn)一步詳細(xì)的說明。
[0059] 實(shí)施例一:
[0060] 參照圖1,示出了本發(fā)明的一種安卓Android平臺(tái)異常處理方法實(shí)施例一的步驟 流程圖,所述安卓Android平臺(tái)可以包括JAVA層及C++層,具體可以包括如下步驟:
[0061] 步驟101,在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù) 時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);
[0062] 在具體實(shí)現(xiàn)中,安裝有安卓Android系統(tǒng)的平臺(tái)可以為手機(jī),計(jì)算機(jī)等等其他設(shè) 備。
[0063] 在安卓Android平臺(tái)中,可以分為采用JAVA代碼編寫的應(yīng)用程序的JAVA層,如 Framework層,以及采用C++代碼編寫的虛擬機(jī)的C++層,如Native層。JAVA編寫的應(yīng)用 程序的運(yùn)行依賴JAVA虛擬機(jī),JAVA的虛擬機(jī)可以方便JAVA應(yīng)用程序在不同系統(tǒng)和型號(hào)機(jī) 器上運(yùn)行,出于效率考慮,JAVA的虛擬機(jī)一般采用C++語言來編寫的。當(dāng)然,也可以采用C 語言或者其他語言進(jìn)行編寫,本發(fā)明實(shí)施例對此并不加以限制
[0064] 目前基于JAVA層異常捕獲的實(shí)現(xiàn)原理,在安卓Android平臺(tái)集成了完善的異常捕 獲功能,通過JAVA層異常捕獲的實(shí)現(xiàn)原理,能將程序運(yùn)行時(shí)出現(xiàn)異常數(shù)據(jù)的獲取。
[0065] 需要說明的是,C++層不能直接獲取異常數(shù)據(jù)息,故在本發(fā)明實(shí)施例中,可以將 C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),然后再交由JAVA層去獲取異常數(shù)據(jù)。
[0066] 步驟102,收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù);
[0067] 在本發(fā)明實(shí)施例中,對于從C++層的異常數(shù)據(jù)轉(zhuǎn)換后JAVA層的異常數(shù)據(jù),在JAVA 層中進(jìn)行收集。
[0068] 步驟103,在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);
[0069] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟103可以包括如下子步驟:
[0070] 子步驟S11,獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng)前時(shí)間;
[0071] 子步驟S12,將所述異常信息保存于采用程序名以及當(dāng)前時(shí)間命名的文件中;
[0072] 子步驟S13,對所述文件進(jìn)行壓縮。
[0073] 在具體實(shí)現(xiàn)中,將獲取到的異常信息存入到采用當(dāng)前程序的程序名,以及,當(dāng)前時(shí) 間命名的文件中,同時(shí)還可以對該文件進(jìn)行壓縮,以便于在本地安卓Android平臺(tái)中進(jìn)行 保存。
[0074] 當(dāng)然,在實(shí)際應(yīng)用中還可以采用其他規(guī)則對于異常信息進(jìn)行保存,本發(fā)明實(shí)施例 對此并不加以限制。
[0075] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述方法還可以包括如下步驟:
[0076] 步驟S21,查詢是否上傳所述JAVA層的異常數(shù)據(jù)至所述異常信息文件服務(wù)器;若 是,則執(zhí)行子步驟S42;
[0077] 步驟S22,上傳所述JAVA層的異常數(shù)據(jù)至所述異常信息文件服務(wù)器。
[0078] 在本發(fā)明實(shí)施例中,收集到異常數(shù)據(jù)后,可以提示用戶是否上傳異常信息至服務(wù) 器,若用戶同意上傳,則將該異常數(shù)據(jù)上傳至異常信息文件服務(wù)器中,以供給開發(fā)者進(jìn)行分 析。在具體實(shí)現(xiàn)中,還可以將出現(xiàn)異常數(shù)據(jù)的終端的參數(shù)信息,比如終端型號(hào),版本號(hào)、系統(tǒng) 信息等一起上傳至服務(wù)器。
[0079] 當(dāng)然,在具體實(shí)現(xiàn)中,還可以在收集到的異常數(shù)據(jù)就上傳至服務(wù)器,或者,隔一段 時(shí)間上傳收集到的異常數(shù)據(jù),本發(fā)明實(shí)施例對此并不加以限制。
[0080] 步驟104,中止所述程序的運(yùn)行。
[0081] 當(dāng)程序出現(xiàn)異常時(shí),可以中止該程序的運(yùn)行,若用戶需要再次運(yùn)行該程序,則可以 對該程序進(jìn)行刷新,以重新啟動(dòng)。或者,當(dāng)程序出現(xiàn)異常時(shí),也可以直接退出該程序,并彈出 對話框提示用戶程序退出。
[0082] 在具體實(shí)現(xiàn)中,C++層不能直接獲取異常數(shù)據(jù)息,而目前在安卓Android平臺(tái)集成 了完善的JAVA層的異常捕獲功能,通過JAVA層異常捕獲的實(shí)現(xiàn)原理,能將程序運(yùn)行時(shí)出現(xiàn) JAVA層異常數(shù)據(jù)的獲取。故在本發(fā)明實(shí)施例中,可以將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的 異常數(shù)據(jù),然后再交由可以直接通過異常獲取異常數(shù)據(jù),實(shí)現(xiàn)JAVA層的異常數(shù)據(jù)與C++層 的異常數(shù)據(jù)的統(tǒng)一處理,提高安卓Android平臺(tái)的系統(tǒng)處理性能。
[0083] 實(shí)施例二:
[0084] 參照圖2,示出了本發(fā)明的一種安卓Android平臺(tái)異常處理方法實(shí)施例二的步驟 流程圖,所述安卓Android平臺(tái)可以包括JAVA層及C++層,具體可以包括如下步驟:
[0085] 步驟201,在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù) 時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);
[0086] 在本發(fā)明的一種優(yōu)選實(shí)施例中,在所述安卓Android平臺(tái)中可以注冊有針對C++ 層的異常數(shù)據(jù)對應(yīng)的異常處理函數(shù);所述步驟201可以包括如下子步驟:
[0087] 子步驟S31,調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)sigaction獲取所述C++層的異 常數(shù)據(jù);
[0088] 子步驟S32,采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ;
[0089] 子步驟S33,采用所述異常處理函數(shù)通過JAVA本地接口 JNI調(diào)用預(yù)置的JAVA層信 號(hào)捕獲函數(shù);所述預(yù)置的JAVA層信號(hào)捕獲函數(shù)可以用于生成JAVA層的異常數(shù)據(jù)。
[0090] 在本發(fā)明實(shí)施例中,對于程序在運(yùn)行過程中可能出現(xiàn)的C++層的異常數(shù)據(jù),在安 卓Android平臺(tái)注冊有相應(yīng)的異常處理函數(shù)。
[0091] 當(dāng)C++層出現(xiàn)異常時(shí),獲取該C++層的異常在安卓Android平臺(tái)注冊的異常處理 函數(shù),并采用異常處理函數(shù)調(diào)用JAVA層的JNI (Java Native Interface, JAVA本地接口), 調(diào)用JAVA層的信號(hào)捕獲函數(shù),將該C++層轉(zhuǎn)換為JAVA層的異常數(shù)據(jù)。
[0092] 在本發(fā)明實(shí)施例中,利用LINUX的信號(hào)機(jī)制進(jìn)行異常數(shù)據(jù)的獲取及傳遞。在LINUX 的信號(hào)機(jī)制中,信號(hào)用來通知程序發(fā)生了異步事件。需要說明的是,信號(hào)是用來通知某程序 發(fā)生了什么事件,并不需要給該程序傳遞任何數(shù)據(jù)。收到信號(hào)的程序?qū)Ω鞣N信號(hào)可以有不 同的處理方法。在本發(fā)明實(shí)施例中,對于需要處理的信號(hào),程序可以指定處理函數(shù),并由該 函數(shù)來進(jìn)行處理。
[0093] 具體而言,首先通過查詢或設(shè)置信號(hào)處理sigaction ()函數(shù),發(fā)送捕獲到C++層的 異常數(shù)據(jù)至當(dāng)前程序中,程序根據(jù)C++層的異常數(shù)據(jù)查找到對應(yīng)的異常處理函數(shù),采用所 述異常處理函數(shù)通過JAVA本地接口 JNI調(diào)用預(yù)置的JAVA層信號(hào)捕獲函數(shù),運(yùn)行C++層的 異常數(shù)據(jù)生成JAVA層的異常數(shù)據(jù)。
[0094] 需要說明的是,在本發(fā)明實(shí)施例中也可以采用其他方式將所述C++層的異常數(shù)據(jù) 轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),本發(fā)明實(shí)施例對此并不加以限制。
[0095] 步驟202,收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù);
[0096] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟202可以包括如下子步驟:
[0097] 子步驟S41,調(diào)用預(yù)置的未捕獲異常處理函數(shù)UncaughtExceptionHandler獲取所 述調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異常的函數(shù)調(diào)用關(guān)系;
[0098] 子步驟S42,從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
[0099] 在具體實(shí)現(xiàn)中,安卓Android平臺(tái)中的日志LOG信息存儲(chǔ)有程序運(yùn)行時(shí)的函數(shù)調(diào) 用關(guān)系。調(diào)用棧信息可以記錄程序在運(yùn)行中的函數(shù)調(diào)用關(guān)系(也叫做函數(shù)執(zhí)行順序),每個(gè) 程序的線程都有其獨(dú)自的調(diào)用棧信息,調(diào)用棧信息記錄了程序運(yùn)行順序,同時(shí)也記錄程序 異常時(shí)的運(yùn)行順序,故在本發(fā)明實(shí)施例中可以通過獲取調(diào)用棧信息,從安卓Android平臺(tái) 中的日志LOG信息中獲取對應(yīng)的異常的函數(shù)調(diào)用關(guān)系。
[0100] 調(diào)用棧信息在程序中有很重要的作用。通常對程序調(diào)試時(shí),需要查看當(dāng)前函數(shù)的 調(diào)用棧信息,調(diào)用棧信息一個(gè)體現(xiàn)函數(shù)調(diào)用關(guān)系的函數(shù)調(diào)用鏈,比如,函數(shù)Π 調(diào)用函數(shù)f2, 函數(shù)f2調(diào)用函數(shù)f3,則Π - f2 - f3就是一個(gè)調(diào)用棧信息。具體地,一個(gè)函數(shù)到另一個(gè)函 數(shù)之間可能存在多種調(diào)用情況,例如,函數(shù)Π 到函數(shù)f3的調(diào)用??梢允铅?- f2 - f3,也 可以是Π - f4 - f5 - f3,因此,當(dāng)程序出現(xiàn)異常、檢測到錯(cuò)誤或被斷點(diǎn)斷住時(shí),可以查看 當(dāng)前程序的當(dāng)前調(diào)用棧信息。
[0101] 在本發(fā)明實(shí)施例中,將C++層異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù)后,調(diào)用JAVA層 的未捕獲異常處理函數(shù)UncaughtExceptionHandler去獲取所述調(diào)用棧信息,并根據(jù)調(diào)用 棧信息中JAVA層的異常的函數(shù)調(diào)用關(guān)系從日志LOG信息中獲取對應(yīng)的異常數(shù)據(jù)。
[0102] 需要說明的是,在本發(fā)明實(shí)施例中也可以采用其他方式獲取到JAVA層的異常數(shù) 據(jù),本發(fā)明實(shí)施例對此并不加以限制。
[0103] 步驟203,若檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異常的 函數(shù)調(diào)用關(guān)系;
[0104] 在JAVA層中編寫應(yīng)用程序Application,安卓Android提供給開發(fā)者的概念空間 中應(yīng)用程序Application是松散的表征概念,沒有多少實(shí)質(zhì)上的表征。在安卓An droid實(shí)際 空間中看不到實(shí)際意義上的應(yīng)用程序的概念,雖然存在應(yīng)用程序Application的類,但其 指的是應(yīng)用程序上下文狀態(tài),是極度弱化的概念。在應(yīng)用程序Application的onCreateO 函數(shù)中將異常處理類設(shè)置為默認(rèn)異常處理句柄。
[0105] 具體地,JAVA層中編寫異常處理類,用以實(shí)現(xiàn)onCreateO函數(shù)中的未捕獲異常處 理函數(shù) UncaughtExceptionHandler 的 public void uncaughtException (Thread thread, Throwable exception),在未捕獲異常處理函數(shù)uncaughtException中打印出現(xiàn)異常數(shù)據(jù) 的調(diào)用棧信息并存儲(chǔ)到本地。
[0106] 步驟204,從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
[0107] 當(dāng)應(yīng)用程序在運(yùn)行的過程中在JAVA層出現(xiàn)異常數(shù)據(jù)時(shí),會(huì)觸發(fā)默認(rèn)異常處理類 的uncaughtException函數(shù),此函數(shù)可以實(shí)現(xiàn)異常數(shù)據(jù)打印和存儲(chǔ)功能。
[0108] 步驟205,在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);
[0109] 步驟206,中止所述程序的運(yùn)行。
[0110] 應(yīng)用本發(fā)明實(shí)施例,可以在安卓Android平臺(tái)的C++層出現(xiàn)異常數(shù)據(jù)時(shí),利用 LINUX信號(hào)機(jī)制利用Android平臺(tái)的JAVA本地接口 JNI,將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA 層的異常數(shù)據(jù),從而可以打印C++層的異常數(shù)據(jù)的調(diào)用棧信息,進(jìn)而打印出日志LOG信息中 的異常信息,將C++層和JAVA層的異常數(shù)據(jù)收集處理統(tǒng)一起來,提高安卓Android平臺(tái)的 系統(tǒng)處理性能。
[0111] 需要說明的是,本發(fā)明實(shí)施例除可以對終端中的JAVA應(yīng)用程序進(jìn)行異常捕獲外, 也可以其他的C++層和JAVA層結(jié)合的場合中進(jìn)行應(yīng)用。
[0112] 為了使本領(lǐng)域技術(shù)人員進(jìn)一步理解本發(fā)明實(shí)施例,以下采用具體的實(shí)例進(jìn)行說 明。
[0113] 參照圖3所示的本發(fā)明的一種安卓Android平臺(tái)異常捕獲和收集的流程示意圖, 具體可以包括如下步驟:
[0114] 1、檢測到JAVA層出現(xiàn)異常數(shù)據(jù);
[0115] 2、檢測到C++層出現(xiàn)異常數(shù)據(jù);
[0116] 3、根據(jù)所述C++層的異常數(shù)據(jù)獲取在安卓Android異常中已注冊,該C++層的異 常數(shù)據(jù)對應(yīng)的異常處理函數(shù);
[0117] 4、采用異常處理數(shù)函調(diào)用JAVA本地接口 JNI ;
[0118] 5、異常處理數(shù)函采用JAVA本地接口 JNI調(diào)用JAVA層信號(hào)捕獲函數(shù);
[0119] 6、JAVA層信號(hào)捕獲函數(shù)根據(jù)C++層的異常運(yùn)行并轉(zhuǎn)換成JAVA層的異常數(shù)據(jù);
[0120] 7、調(diào)用JAVA層的異常處理函數(shù);
[0121] 8、采用JAVA層的異常處理函數(shù)打印JAVA層的異常的調(diào)用棧信息;
[0122] 9、根據(jù)異常的調(diào)用棧信息打印日志LOG信息;
[0123] 10、讀取日志LOG信息獲得JAVA層和C++層的異常數(shù)據(jù),存儲(chǔ)到相應(yīng)的文件中進(jìn) 行壓縮處理;
[0124] 11、詢問是否上傳異常信息至異常信息文件服務(wù)器;若是,則執(zhí)行步驟12 ;若否, 則執(zhí)行步驟13 ;
[0125] 12、上傳異常數(shù)據(jù)至異常信息文件服務(wù)器;
[0126] 13、退出程序。
[0127] 在本發(fā)明實(shí)施例中,安卓Andorid平臺(tái)異常捕獲和收集的原理綜合如下:
[0128] 一、針對JAVA層的異常數(shù)據(jù)捕獲;
[0129] 1、在JAVA層編寫異常處理類,實(shí)現(xiàn)未捕獲處理函數(shù)UncaughtExceptionHandler 的 public void uncaughtException(Thread thread, Throwable exception)函數(shù),在 uncaughtException函數(shù)中打印出現(xiàn)異常的調(diào)用棧信息并存儲(chǔ)到本地,并殺死出現(xiàn)異常數(shù) 據(jù)的應(yīng)用。在應(yīng)用程序Application的onCreateO函數(shù)中將異常處理類設(shè)置為默認(rèn)異常 處理句柄。
[0130] 2、當(dāng)應(yīng)用程序運(yùn)行過程中在JAVA層出現(xiàn)異常數(shù)據(jù)時(shí),會(huì)觸發(fā)默認(rèn)異常處理類的 uncaughtException函數(shù),此函數(shù)實(shí)現(xiàn)異常數(shù)據(jù)打印和存儲(chǔ)功能。
[0131] 二、針對C++層的異常數(shù)據(jù)捕獲;
[0132] 1、利用LINUX的信號(hào)機(jī)制,首先采用LINUX機(jī)制中查詢或設(shè)置信號(hào)處理函數(shù) sigactionO函數(shù),指定需要捕獲的異常信號(hào)來設(shè)置該異常數(shù)據(jù)的異常處理函數(shù)。主要完成 異常數(shù)據(jù)的對應(yīng)處理的注冊過程。
[0133] 2、在實(shí)際中,由于JAVA語法可以直接通過異常數(shù)據(jù)(exc印tion)獲取調(diào)用堆棧信 息,即JAVA層可以直接通過異常數(shù)據(jù)獲取調(diào)用堆棧信息,但是C++層則不支持直接打印調(diào) 用棧信息。
[0134] 3、采用JAVA本地接口 JNI的調(diào)用解決C++層不支持直接打印調(diào)用棧信息的問題, 當(dāng)C++層出現(xiàn)異常數(shù)據(jù)時(shí),LINUX信號(hào)機(jī)制,會(huì)發(fā)送信號(hào)到當(dāng)前進(jìn)程,如果此信號(hào)在步驟1中 已注冊,會(huì)調(diào)用注冊的異常處理函數(shù),異常處理函數(shù)中采用本地接口 JNI,通過C++層的異 常代碼調(diào)用JAVA層信號(hào)捕獲函數(shù),JAVA層信號(hào)捕獲處理函數(shù),產(chǎn)生運(yùn)行時(shí)異常,提供給針 對JAVA層異常捕獲使用。
[0135] 4、C++層異常數(shù)據(jù)的捕獲利用LINUX信號(hào)機(jī)制和安卓Android平臺(tái)的JNI,將C++ 異常數(shù)據(jù)轉(zhuǎn)換為JAVA層異常數(shù)據(jù),從而將C++和JAVA層異常數(shù)據(jù)收集處理統(tǒng)一起來。
[0136] 三、異常收集;
[0137] 1、首先、打印調(diào)用JAVA層調(diào)用棧信息,此調(diào)用棧信息包括有JAVA層的異常數(shù)據(jù), 以及,C++層的異常數(shù)據(jù)轉(zhuǎn)換的JAVA層的異常數(shù)據(jù);其次、打印系統(tǒng)的日志LOG信息中異常 的函數(shù)調(diào)用關(guān)系;最后、讀取安卓Android平臺(tái)的日志LOG信息,將日志LOG信息存儲(chǔ)到按 照程序名+時(shí)間的命名規(guī)則文件中,并進(jìn)行壓縮處理。
[0138] 2、詢問用戶是否同意將存儲(chǔ)異常數(shù)據(jù)的文件上傳指定的服務(wù)器,當(dāng)用戶同意上傳 到指定的服務(wù)器中,上傳所述異常數(shù)據(jù)的文件。
[0139] 應(yīng)用本發(fā)明實(shí)施例,在安卓Android平臺(tái)檢測到C++層出現(xiàn)異常數(shù)據(jù)時(shí),將C++層 的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),并收集轉(zhuǎn)換后JAVA層的異常數(shù)據(jù)上傳至服務(wù)器。本 發(fā)明實(shí)施例將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù),并交由JAVA層進(jìn)行統(tǒng)一的收 集,故無論JAVA層發(fā)生異常還是C++層發(fā)生異常,JAVA層都能收到捕獲到異常數(shù)據(jù),實(shí)現(xiàn) 異常數(shù)據(jù)收集的統(tǒng)一處理,提高安卓Android平臺(tái)處理性能。
[0140] 需要說明的是,對于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動(dòng)作組 合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐?據(jù)本發(fā)明實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該 知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本發(fā)明實(shí)施 例所必須的。
[0141] 實(shí)施例三:
[0142] 參照圖4,示出了本發(fā)明一種安卓Android平臺(tái)異常處理的裝置實(shí)施例的結(jié)構(gòu)框 圖,所述安卓Android平臺(tái)可以包括JAVA層及C++層,具體可以包括如下模塊:
[0143] 轉(zhuǎn)換模塊401,用于在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異 常數(shù)據(jù)時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù);
[0144] 在本發(fā)明的一種優(yōu)選實(shí)施例中,在所述安卓Android平臺(tái)中可以注冊有針對C++ 層的各類異常數(shù)據(jù)對應(yīng)的各種異常處理函數(shù);所述轉(zhuǎn)換模塊401可以包括如下子模塊:
[0145] 函數(shù)調(diào)用單元,用于調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)sigaction獲取所述 C++層的異常數(shù)據(jù);
[0146] 函數(shù)獲取單元,用于采用所述異常數(shù)據(jù)獲取所述對應(yīng)的異常處理函數(shù);
[0147] 接口調(diào)用子模塊,用于采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ;
[0148] 異常生成子模塊,用于采用所述異常處理函數(shù)通過JAVA本地接口 JNI調(diào)用預(yù)置的 JAVA層信號(hào)捕獲函數(shù);所述預(yù)置的JAVA層信號(hào)捕獲函數(shù)用于依據(jù)所述C++層的異常數(shù)據(jù) 生成JAVA層的異常數(shù)據(jù)。
[0149] 收集模塊402,用于收集轉(zhuǎn)換后的JAVA層的異常信息;
[0150] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述收集模塊402可以包括如下子模塊:
[0151] 調(diào)用棧信息獲取子模塊,用于調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取所述調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異 常的函數(shù)調(diào)用關(guān)系;
[0152] 第一異常信息獲取子模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對 應(yīng)的異常數(shù)據(jù)。
[0153] 保存模塊403,用于在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù);
[0154] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述保存模塊403可以包括如下子模塊:
[0155] 程序名獲取子模塊,用于獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng) 前時(shí)間;
[0156] 異常信息存入子模塊,用于將所述異常信息保存于采用程序名以及當(dāng)前時(shí)間命名 的文件中;
[0157] 文件壓縮子模塊,用于對所述文件進(jìn)行壓縮。
[0158] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述裝置還可以包括如下模塊:
[0159] JAVA層檢測模塊,用于當(dāng)檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處 理函數(shù)UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的 異常的函數(shù)調(diào)用關(guān)系;
[0160] 第二異常信息獲取模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng) 的異常數(shù)據(jù)。
[0161] 在本發(fā)明的一種優(yōu)選實(shí)施例中,所述裝置還可以包括如下模塊:
[0162] 查詢子模塊,用于查詢是否上傳所述文件至預(yù)置的服務(wù)器;若是,則調(diào)用上傳子模 塊;
[0163] 上傳子模塊,用于上傳所述文件至所述預(yù)置的服務(wù)器。
[0164] 中止模塊405,用于中止所述程序的運(yùn)行。
[0165] 對于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān) 之處參見方法實(shí)施例的部分說明即可。
[0166] 本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與 其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
[0167] 本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明實(shí)施例的實(shí)施例可提供為方法、裝置、或計(jì)算 機(jī)程序產(chǎn)品。因此,本發(fā)明實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和 硬件方面的實(shí)施例的形式。而且,本發(fā)明實(shí)施例可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可 用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上 實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
[0168] 本發(fā)明實(shí)施例是參照根據(jù)本發(fā)明實(shí)施例的方法、終端設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序 產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框 圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商?供這些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理 終端設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處 理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多 個(gè)方框中指定的功能的裝置。
[0169] 這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備 以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包 括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方 框或多個(gè)方框中指定的功能。
[0170] 這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備上,使得 在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在 計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程 和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
[0171] 盡管已描述了本發(fā)明實(shí)施例的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基 本創(chuàng)造性概念,則可對這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為 包括優(yōu)選實(shí)施例以及落入本發(fā)明實(shí)施例范圍的所有變更和修改。
[0172] 最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將 一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作 之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語"包括"、"包含"或者其任何其他變體意 在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包 括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品 或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句"包括一個(gè)……"限定的要 素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的相同要素。
[0173] 以上對本發(fā)明所提供的一種安卓Android平臺(tái)異常處理的方法和一種安卓 Android平臺(tái)異常處理的裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對本發(fā)明的原理及 實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想; 同時(shí),對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在【具體實(shí)施方式】及應(yīng)用范圍上均會(huì) 有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
【權(quán)利要求】
1. 一種安卓Android平臺(tái)異常處理的方法,其特征在于,所述安卓Android平臺(tái)包括 JAVA層及C++層,所述方法包括: 在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù)時(shí),將所述C++ 層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù); 收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù); 在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù); 中止所述程序的運(yùn)行。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述安卓Android平臺(tái)中注冊有針對 C++層的各類異常數(shù)據(jù)對應(yīng)的各種異常處理函數(shù);所述將C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層 的異常數(shù)據(jù)的步驟包括: 調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)sigaction獲取所述C++層的異常數(shù)據(jù); 采用所述異常數(shù)據(jù)獲取所述對應(yīng)的異常處理函數(shù); 采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ; 采用所述JAVA本地接口 JNI調(diào)用預(yù)置的JAVA層信號(hào)捕獲函數(shù);所述預(yù)置的JAVA層信 號(hào)捕獲函數(shù)用于依據(jù)所述C++層的異常數(shù)據(jù)生成JAVA層的異常數(shù)據(jù)。
3. 根據(jù)權(quán)利要求1或2所述的方法,其特征在于,在安卓Android平臺(tái)包括日志LOG信 息;所述收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù)的步驟包括: 調(diào)用預(yù)置的未捕獲異常處理函數(shù)UncaughtExceptionHandler獲取所述調(diào)用棧信息; 所述調(diào)用棧信息包括所述JAVA層的異常的函數(shù)調(diào)用關(guān)系; 從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
4. 根據(jù)權(quán)利要求1所述的方法,其特征在于,還包括: 若檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異常的 函數(shù)調(diào)用關(guān)系; 從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異常數(shù)據(jù)。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,所述在安卓Android平臺(tái)中保存所述 JAVA層的異常數(shù)據(jù)的步驟包括: 獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng)前時(shí)間; 將所述異常數(shù)據(jù)保存于采用程序名以及當(dāng)前時(shí)間命名的文件中; 對所述文件進(jìn)行壓縮。
6. 根據(jù)權(quán)利要求1或5所述的方法,其特征在于,在所述安卓Android平臺(tái)中保存所述 JAVA層的異常數(shù)據(jù)的步驟之后,還包括:查詢是否上傳所述JAVA層的異常數(shù)據(jù)至預(yù)置的服 務(wù)器; 若是,則上傳所述JAVA層的異常數(shù)據(jù)至所述預(yù)置的服務(wù)器。
7. -種安卓Android平臺(tái)異常處理的裝置,其特征在于,所述安卓Android平臺(tái)包括 JAVA層及C++層,所述裝置包括: 轉(zhuǎn)換模塊,用于在所述JAVA層中某一程序的運(yùn)行過程中,當(dāng)檢測到C++層的異常數(shù)據(jù) 時(shí),將所述C++層的異常數(shù)據(jù)轉(zhuǎn)換為JAVA層的異常數(shù)據(jù); 收集模塊,用于收集轉(zhuǎn)換后的JAVA層的異常數(shù)據(jù); 保存模塊,用于在所述安卓Android平臺(tái)中保存所述JAVA層的異常數(shù)據(jù); 中止模塊,用于中止所述程序的運(yùn)行。
8. 根據(jù)權(quán)利要求7所述的裝置,其特征在于,在所述安卓Android平臺(tái)中注冊有針對 C++層的各類異常對應(yīng)的各種異常處理函數(shù);所述轉(zhuǎn)換模塊包括: 函數(shù)調(diào)用單元,用于調(diào)用預(yù)置的查詢或設(shè)置信號(hào)處理函數(shù)sigaction獲取所述C++層 的異常信號(hào); 函數(shù)獲取單元,用于采用所述異常數(shù)據(jù)獲取所述對應(yīng)的異常處理函數(shù); 接口調(diào)用子模塊,用于采用所述異常處理函數(shù)調(diào)用JAVA本地接口 JNI ; 異常生成子模塊,用于采用所述異常處理函數(shù)通過JAVA本地接口 JNI調(diào)用預(yù)置的JAVA 層信號(hào)捕獲函數(shù);所述預(yù)置的JAVA層信號(hào)捕獲函數(shù)用于依據(jù)所述C++層的異常數(shù)據(jù)生成 JAVA層的異常數(shù)據(jù)。
9. 根據(jù)權(quán)利要求7或8所述的裝置,其特征在于,所述收集模塊包括: 調(diào)用棧信息獲取子模塊,用于調(diào)用預(yù)置的未捕獲異常處理函數(shù) UncaughtExceptionHandler獲取所述調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異 常的函數(shù)調(diào)用關(guān)系; 第一異常信息獲取子模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的 異常數(shù)據(jù)。
10. 根據(jù)權(quán)利要求7所述的裝置,其特征在于,還包括: JAVA層檢測模塊,用于若檢測到JAVA層的異常數(shù)據(jù)時(shí),調(diào)用預(yù)置的未捕獲異常處理函 數(shù)UncaughtExceptionHandler獲取調(diào)用棧信息;所述調(diào)用棧信息包括所述JAVA層的異常 的函數(shù)調(diào)用關(guān)系; 第二異常信息獲取模塊,用于從所述日志LOG信息中提取所述函數(shù)調(diào)用關(guān)系對應(yīng)的異 常數(shù)據(jù)。
11. 根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述保存模塊包括: 程序名獲取子模塊,用于獲取在所述安卓Android平臺(tái)中運(yùn)行程序的程序名及當(dāng)前時(shí) 間; 異常信息存入子模塊,用于將所述異常數(shù)據(jù)保存于采用程序名以及當(dāng)前時(shí)間命名的文 件中; 文件壓縮子模塊,用于對所述文件進(jìn)行壓縮。
12. 根據(jù)權(quán)利要求1或11所述的裝置,其特征在于,還包括: 查詢子模塊,用于查詢是否上傳所述JAVA層的異常數(shù)據(jù)至預(yù)置的服務(wù)器;若是,則調(diào) 用上傳子模塊; 上傳子模塊,用于上傳所述JAVA層的異常數(shù)據(jù)至所述預(yù)置的服務(wù)器。
【文檔編號(hào)】G06F9/44GK104156275SQ201410308634
【公開日】2014年11月19日 申請日期:2014年6月30日 優(yōu)先權(quán)日:2014年6月30日
【發(fā)明者】王磊 申請人:青島海信移動(dòng)通信技術(shù)股份有限公司