本發(fā)明涉及Android開發(fā)領(lǐng)域,尤其涉及一種基于Git的Android崩潰日志優(yōu)化方法及系統(tǒng)。
背景技術(shù):
在當(dāng)前Android應(yīng)用快速更新的時(shí)代,對于Android開發(fā)來說,在極短的時(shí)間里發(fā)布很多次版本的應(yīng)用給用戶是平常的事情。但是如果用戶反饋Android應(yīng)用在使用時(shí)出現(xiàn)崩潰的情況,而程序員發(fā)現(xiàn)在已經(jīng)發(fā)出了很多版本才出現(xiàn)該問題,無法判斷該問題是由哪一個(gè)版本的代碼提交引起的。此時(shí)如果要修改此錯(cuò)誤就需要查看所有已經(jīng)提交的版本。這樣查下去既浪費(fèi)時(shí)間,又極大的降低了工作效率。如果有一種方案可以讓程序員在查詢問題時(shí)可以快速定位到哪一次提交代碼,那么對于定位問題的時(shí)間及修改問題所需要的時(shí)間都將極大的節(jié)省。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題在于針對現(xiàn)有技術(shù)中Android應(yīng)用在使用時(shí)出現(xiàn)崩潰的情況下,不容易找到是哪個(gè)版本出現(xiàn)問題的缺陷,提供一種可以快速定位到哪一次提交代碼出現(xiàn)問題的基于Git的Android崩潰日志優(yōu)化方法及系統(tǒng)。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
提供一種基于Git的Android崩潰日志優(yōu)化方法,包括以下步驟:
通過Android項(xiàng)目的自動(dòng)化構(gòu)建工具Gradle運(yùn)行編譯腳本;
獲取當(dāng)前編譯的代碼所在的目錄;
判斷當(dāng)前目錄是否存在Git;
若存在,則獲取該Git的SHA值;
判斷SHA值是否為空,若否,則將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的代碼;
當(dāng)Android系統(tǒng)運(yùn)行出現(xiàn)異常時(shí),進(jìn)行日志收集,并加入經(jīng)過代碼轉(zhuǎn)換的SHA值;
將收集的日志上傳給服務(wù)器。
本發(fā)明所述的方法中,若SHA值為空,則將SHA值變?yōu)轭A(yù)設(shè)值。
本發(fā)明所述的方法中,所述預(yù)設(shè)值為-1。
本發(fā)明所述的方法中,具體使用Android系統(tǒng)自帶的異常捕獲控制器進(jìn)行日志收集。
本發(fā)明所述的方法中,若SHA值不為空,則將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的java代碼。
本發(fā)明還提供了一種基于Git的Android崩潰日志優(yōu)化系統(tǒng),包括:
編譯腳本運(yùn)行模塊,用于通過Android項(xiàng)目的自動(dòng)化構(gòu)建工具Gradle運(yùn)行編譯腳本;
目錄獲取模塊,用于獲取當(dāng)前編譯的代碼所在的目錄;
Git判斷模塊,用于判斷當(dāng)前目錄是否存在Git;
SHA值獲取模塊,用于在當(dāng)前目錄存在Git時(shí),獲取該Git的SHA值;
SHA值判斷模塊,用于判斷SHA值是否為空;
代碼轉(zhuǎn)換模塊,用于在SHA值不為空時(shí),將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的代碼;
日志收集模塊,用于當(dāng)Android系統(tǒng)運(yùn)行出現(xiàn)異常時(shí),進(jìn)行日志收集,并加入經(jīng)過代碼轉(zhuǎn)換的SHA值;
日志上傳模塊,用于將收集的日志上傳給服務(wù)器。
本發(fā)明所述的系統(tǒng)中,該系統(tǒng)還包括賦值模塊,用于在SHA值為空時(shí),將SHA值變?yōu)轭A(yù)設(shè)值。
本發(fā)明所述的系統(tǒng)中,該系統(tǒng)還包括賦值模塊,用于在SHA值為空時(shí),將SHA值變?yōu)?1。
本發(fā)明所述的系統(tǒng)中,所述日志收集模塊具體使用Android系統(tǒng)自帶的異常捕獲控制器進(jìn)行日志收集。
本發(fā)明所述的系統(tǒng)中,所述日志收集模塊在SHA值不為空時(shí),將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的java代碼。
本發(fā)明產(chǎn)生的有益效果是:本發(fā)明使用Git工具來實(shí)現(xiàn)快速定位出問題的代碼是哪一次提交的,極大地減少了因?yàn)檎也坏匠鰡栴}的版本而導(dǎo)致過多的時(shí)間放在問題的查找上面。同時(shí)可以優(yōu)化出現(xiàn)崩潰時(shí)日志返回的信息,提高程序員查找及修改問題的效率,節(jié)省問題查找修改時(shí)間。
附圖說明
下面將結(jié)合附圖及實(shí)施例對本發(fā)明作進(jìn)一步說明,附圖中:
圖1是本發(fā)明實(shí)施例基于Git的Android崩潰日志優(yōu)化方法的流程圖;
圖2是本發(fā)明另一實(shí)施例基于Git的Android崩潰日志優(yōu)化方法的流程圖;
圖3是本發(fā)明實(shí)施例基于Git的Android崩潰日志優(yōu)化系統(tǒng)的結(jié)構(gòu)示意圖;
圖4是本發(fā)明另一實(shí)施例基于Git的Android崩潰日志優(yōu)化系統(tǒng)的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
對本發(fā)明涉及的名詞進(jìn)行解釋:
GIT:分布式版本控制系統(tǒng)。是一款免費(fèi)、開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目。
SHA:安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字簽名標(biāo)準(zhǔn)(Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)。在Git中,每個(gè)commit ID的信息就是一個(gè)SHA Hash值,它是對那個(gè)commit是Git倉庫中內(nèi)容和頭信息(Header)的一個(gè)校驗(yàn)和(checksum)。
GRADLE:一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化建構(gòu)工具。它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項(xiàng)目設(shè)置,拋棄了基于XML的各種繁瑣配置。
在Android開發(fā)中,越來越多會(huì)用到Gradle來作為Android項(xiàng)目的自動(dòng)化建構(gòu)工具。其好處是可以自定義構(gòu)建過程中的參數(shù)。本發(fā)明中就是需要在使用Gradle進(jìn)行編譯時(shí)將git版本參數(shù)加入。并在返回日志時(shí),將本參數(shù)加到返回日志中,方便程序員快速定位問題所在提交日志。
本發(fā)明中,首先會(huì)在編譯文件時(shí),從編譯文件中獲取當(dāng)前編譯文件的Git的SHA值。該值使用git命令獲取。由于編譯Android代碼時(shí),可以獲取到Android代碼的具體位置,而Git的版本信息只要是知道具體的代碼文件位置就可以獲取,因此只需要獲取當(dāng)前需要編譯的代碼文件所在,獲取方法使用當(dāng)前編譯的系統(tǒng)自帶的git命令工具來實(shí)現(xiàn)。
本發(fā)明的一個(gè)實(shí)施例中,如圖1所示,基于Git的Android崩潰日志優(yōu)化方法包括以下步驟:
S1、通過Android項(xiàng)目的自動(dòng)化構(gòu)建工具Gradle運(yùn)行編譯腳本;
S2、獲取當(dāng)前編譯的代碼所在的目錄;
S3、判斷當(dāng)前目錄是否存在Git;
S4、若存在,則獲取該Git的SHA值;
S5、判斷SHA值是否為空,若否,則轉(zhuǎn)至S6;
S6、將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的代碼;
S7、當(dāng)Android系統(tǒng)運(yùn)行出現(xiàn)異常時(shí),進(jìn)行日志收集,并加入經(jīng)過代碼轉(zhuǎn)換的SHA值;
S8、將收集的日志上傳給服務(wù)器。
本發(fā)明的一個(gè)實(shí)施例中,若SHA值為空,則將SHA值變?yōu)轭A(yù)設(shè)值。該預(yù)設(shè)值可設(shè)為-1。若SHA值不為空,則將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的java代碼。
進(jìn)行日志收集時(shí),具體可使用Android系統(tǒng)自帶的異常捕獲控制器進(jìn)行日志收集,如具體使用UncaughtExceptionHandler這個(gè)類來實(shí)現(xiàn)。
本發(fā)明另一個(gè)較佳實(shí)施例中,如圖2所示,具體得到Git的SHA流程圖如圖2所示:
1.開始編譯腳本
在本發(fā)明中,gradle開始運(yùn)行腳本編譯的Android代碼,該編譯腳本使用的是Android官方推薦的gradle來進(jìn)行編寫,本發(fā)明中不做過多闡述。
2.獲取到當(dāng)前編譯所在的目錄
由于需要獲取到當(dāng)前編譯的android代碼的git信息,因此首先需要取得當(dāng)前編譯的Android代碼所在的代碼文件目錄,由于在android開發(fā)中,約定的gradle腳本就在Android代碼所在目錄的上級,因此只需要獲取當(dāng)前目錄下即可。
3.判斷當(dāng)前目錄是否存在git
由于某些項(xiàng)目在開發(fā)過程中沒有使用git工具,因此需要在取得git的SHA值之前要檢測當(dāng)前項(xiàng)目是否使用git,檢測方法是根據(jù)使用在android所在目錄中執(zhí)行命令“git log”來得到返回字符串,并根據(jù)返回的字符串來判斷當(dāng)前項(xiàng)目是否使用git。
執(zhí)行命令使用如下代碼來是實(shí)現(xiàn),該命令同樣也是在gradle腳本文件中,并在執(zhí)行編譯時(shí)運(yùn)行:
def isusegit='git log'.execute([],project.rootDir).text.trim()
當(dāng)在沒有使用git工具的項(xiàng)目中執(zhí)行上述命令時(shí),系統(tǒng)會(huì)返回如下字符串:
fatal:Not a git repository(or any of the parent directories):.git
該字符串代表本目錄沒有使用git,而使用過git的則返回的是每次提交的日志,因此可以通過返回字符串的特征值來判斷是否使用了git,在本發(fā)明中該特征值為“fatal:Not a git”也就是沒有使用git返回的字符串的前面一段,如果返回的字符串的包含該字符串,則斷定為項(xiàng)目沒有使用git,反之則使用了。
4.獲取git的SHA值
如果判斷成功則會(huì)開始獲取git的SHA值,如果判斷不存在git,則返回空。
在gradle的編譯腳本中加入如下代碼來獲取git的SHA值:
def gitSha='git rev-parse--short HEAD'.execute([],project.rootDir).text.trim()//獲取當(dāng)前編譯項(xiàng)目的SHA值
當(dāng)gralde編譯時(shí)會(huì)運(yùn)行上述代碼,并得到當(dāng)前正在編譯中的代碼所在git的SHA值,拿到這個(gè)值后,我們需要將該值在編譯時(shí)傳遞給Android代碼中去。
5.判斷SHA是否為空
這里需要判斷該獲取的SHA值是否為空,這里為空有兩種可能。第一,該項(xiàng)目沒有使用git,因此在獲取時(shí)返回的空;第二,該項(xiàng)目在獲取git的SHA時(shí)獲取不到SHA的值,因此返回為空。
當(dāng)SHA的值為空時(shí),在gradle的腳本中將該值置為-1,如果不為空,并準(zhǔn)備將其變?yōu)锳ndroid可識別的java代碼。
6.將SHA變?yōu)锳ndroid可以識別的java代碼
將SHA變?yōu)锳ndroid可識別的java代碼就是在gradle的編譯腳本中加上編譯配置文件的一個(gè)字段,該字段通過設(shè)置字段的屬性,數(shù)值后可在編譯過程中可以生產(chǎn)java代碼,由于Android代碼可以直接調(diào)用java代碼,因此Android在編譯時(shí)可以直接使用該編譯過程中生產(chǎn)的java代碼來獲取git中的SHA值。
在gradle編譯腳本中加入如下語句來實(shí)現(xiàn)上述操作:
buildConfigField"String","GIT_SHA","\"${gitSha}\""
該語句中,將之前獲取的git的SHA數(shù)值在編譯過程中變成GIT_SHA=”gitsha”這種形式的java語句,其中的gitsha則替換為之前已經(jīng)得到的git的SHA數(shù)值。變成這樣后,將在Android代碼編譯過程中,將可以直接把該值作為參數(shù)來使用。
在gradle進(jìn)行編譯時(shí),會(huì)將設(shè)置的該參數(shù)進(jìn)行編譯,變成成一個(gè)Android可識別的Java文件,名為:BuildConfig。在該文件中會(huì)有腳本中設(shè)定的buildConfigField這個(gè)屬性。本發(fā)明中該屬性的類型為String,名字為GIT_SHA,值則是獲取到的git的SHA值。
7.Android可識別該值
Android代碼中如果需要使用該值,只需要在Android代碼中使用BuildConfig.GIT_SHA則可以得到該參數(shù)。
8.上報(bào)日志中加入獲取的SHA的值
此時(shí)git的SHA值在Android代碼中已經(jīng)獲取到了,本發(fā)明中需要在程序出現(xiàn)錯(cuò)誤的時(shí)候同時(shí)將該數(shù)值與錯(cuò)誤信息一并上報(bào)給服務(wù)器,這里就需要對Android工程的異常問題進(jìn)行一些處理,使得可以上傳git的SHA數(shù)值。
本發(fā)明中使用Android自帶的異常捕獲控制器來處理該操作,具體使用UncaughtExceptionHandler這個(gè)類來實(shí)現(xiàn),該類是Android自帶的異常捕獲工具,
如果程序出現(xiàn)了未捕獲異常默認(rèn)情況下則會(huì)出現(xiàn)強(qiáng)行關(guān)閉對話框?qū)崿F(xiàn)該接口并注冊為程序中的默認(rèn)未捕獲異常處理這樣當(dāng)未捕獲異常發(fā)生時(shí),就可以做些異常處理操作例如:收集異常信息,發(fā)送錯(cuò)誤報(bào)告等。在代碼中使用該類后將可以自定義返回的錯(cuò)誤信息,增加開發(fā)人員查找問題,解決問題的效率。使用該類后,將會(huì)在應(yīng)用出現(xiàn)問題的時(shí)候首先收集應(yīng)用的錯(cuò)誤信息,然后將之前得到的git的SHA值一并通過該類返回給應(yīng)用的日志收集服務(wù)器,服務(wù)器在接收到錯(cuò)誤信息后將交由開發(fā)人員處理,開發(fā)人員拿到該SHA值后,通過git reset sha的命令將代碼回滾到出問題的地方,可以方便的判斷出問題出現(xiàn)在哪一次提交的代碼,具體服務(wù)器接收錯(cuò)誤后的操作不在本專利說明中,故在此不做過多陳述。
本發(fā)明實(shí)施例基于Git的Android崩潰日志優(yōu)化系統(tǒng),如圖3所示,包括:
編譯腳本運(yùn)行模塊,用于通過Android項(xiàng)目的自動(dòng)化構(gòu)建工具Gradle運(yùn)行編譯腳本;
目錄獲取模塊,用于獲取當(dāng)前編譯的代碼所在的目錄;
Git判斷模塊,用于判斷當(dāng)前目錄是否存在Git;
SHA值獲取模塊,用于在當(dāng)前目錄存在Git時(shí),獲取該Git的SHA值;
SHA值判斷模塊,用于判斷SHA值是否為空;
代碼轉(zhuǎn)換模塊,用于在SHA值不為空時(shí),將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的代碼;
日志收集模塊,用于當(dāng)Android系統(tǒng)運(yùn)行出現(xiàn)異常時(shí),進(jìn)行日志收集,并加入經(jīng)過代碼轉(zhuǎn)換的SHA值;
日志上傳模塊,用于將收集的日志上傳給服務(wù)器。
進(jìn)一步地,如圖4所示,該系統(tǒng)還包括賦值模塊,用于在SHA值為空時(shí),將SHA值變?yōu)轭A(yù)設(shè)值。
該系統(tǒng)還包括賦值模塊,用于在SHA值為空時(shí),將SHA值變?yōu)?1。
日志收集模塊具體使用Android系統(tǒng)自帶的異常捕獲控制器進(jìn)行日志收集。
日志收集模塊在SHA值不為空時(shí),將SHA值轉(zhuǎn)換成Android系統(tǒng)可識別的java代碼。
應(yīng)當(dāng)理解的是,對本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)上述說明加以改進(jìn)或變換,而所有這些改進(jìn)和變換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。