您的位置: 首頁 >產(chǎn)經(jīng) >

IT動(dòng)態(tài):淺談Android的日志機(jī)制:Log和logcat

2022-04-04 00:29:01 編輯:鄧琛曼 來源:
導(dǎo)讀 5G已經(jīng)片區(qū)使用,很多小伙伴對(duì)通信這塊還不熟系!越來越多的人開始對(duì)IT、5G信息方面產(chǎn)生興趣,近來的話題也是引起了很多人的關(guān)注,那么既然

5G已經(jīng)片區(qū)使用,很多小伙伴對(duì)通信這塊還不熟系!越來越多的人開始對(duì)IT、5G信息方面產(chǎn)生興趣,近來的話題也是引起了很多人的關(guān)注,那么既然現(xiàn)在大家都想要知道,小編今天就來給大家針對(duì)做個(gè)詳細(xì)介紹。

感謝IT之家網(wǎng)友 東京特許許可局局長 的原創(chuàng)投稿

注:測試設(shè)備Android版本為7.1。

一、日志的概況,Android自帶終端的使用和初次使用logcat

要對(duì)應(yīng)用程序進(jìn)行調(diào)試,記錄日志是最常見快捷的方式。日志可以清楚地展現(xiàn)出應(yīng)用的運(yùn)行狀態(tài)。從而給程序員提供修正和改進(jìn)的建議。

(Windows事件管理器中的Windows系統(tǒng)日志)

和Windows一樣,在Android系統(tǒng)中也提供了類似的日志記錄機(jī)制。只不過與Windows不同,在Android中并沒有明顯的可以查看日志的入口。其實(shí)Android中已經(jīng)內(nèi)置了查看日志的工具,只不過我們需要比較特殊的手段召喚它出來。

(打開開發(fā)者選項(xiàng),打開本地終端的開關(guān))

(打開啟動(dòng)器界面中新增的“終端”圖標(biāo))

當(dāng)然,除了以上方法。對(duì)于其他基于Android深度優(yōu)化的ROM,本選項(xiàng)被閹割時(shí),可以下載第三方終端模擬器類應(yīng)用。

(這是一個(gè)第三方Terminal應(yīng)用)

(在黑色界面中輸入logcat,回車執(zhí)行)

1.logcat

二、logcat概況、日志格式、logcat詳細(xì)用法、還有MatLog

logcat是Android中用來查看日志的命令行工具(Log Catcher),由圖可知,logcat以

1.---------beginningofxxx

為起點(diǎn),開始捕捉Android日志。xxx對(duì)應(yīng)這存儲(chǔ)著Android日志記錄器的環(huán)形緩沖區(qū)。Android系統(tǒng)在運(yùn)行時(shí)會(huì)時(shí)刻在幾個(gè)設(shè)備文件中的一個(gè)中寫入字符串。而這幾個(gè)設(shè)備文件指向幾個(gè)環(huán)形緩沖區(qū)。這是Android日志的記錄原理。而這幾個(gè)緩沖區(qū)合稱日志記錄器緩沖區(qū)。

(打開開發(fā)者選項(xiàng),可以看到有個(gè)選項(xiàng)叫做“日志記錄器緩沖區(qū)大小”,默認(rèn)是256K。由上文所述,日志是循環(huán)寫入環(huán)形緩沖區(qū)的。在通常情況下,寫滿時(shí)最舊的日志會(huì)被刪除以給新輸出的日志留內(nèi)存空間。設(shè)置的越大就可以保存離當(dāng)前時(shí)間越久遠(yuǎn)的日志。但相對(duì)地,設(shè)置的越大對(duì)內(nèi)存的占用也越大,內(nèi)存的可用空間也越少,請酌情修改)

默認(rèn)輸出的日志格式如下文所示:(不帶任何參數(shù)的logcat命令)

1.07-2220:31:21.5659931032WBroadcastQueue:Backgroundexecutionnotallowed:receivingIntent{act=com.tencent.mm.plugin.openapi.Intent.ACTION_HANDLE_APP_REGISTERflg=0x10(hasextras)}tocom.tencent.mm/.plugin.base.stub.WXEntryActivity$EntryReceiver

由六部分組成:

1. 寫下日志時(shí)的時(shí)間,如上中07-22 20:31:21.565。

2. PID(進(jìn)程ID),如上中993。

3. TID(線程ID),如上中1032。

4. 優(yōu)先級(jí),在Android中,日志的優(yōu)先級(jí)從低到高分以下幾種:

V—Verbose(啰嗦,最低級(jí)別,開發(fā)調(diào)試中的一些詳細(xì)信息,僅在開發(fā)中使用,不可在發(fā)布產(chǎn)品中輸出,不是很常見,包含諸如方法名,變量值之類的信息)

D—Debug(調(diào)試,用于調(diào)試的信息,可以在發(fā)布產(chǎn)品中關(guān)閉,比較常見,開發(fā)中經(jīng)常選擇輸出此種級(jí)別的日志,有時(shí)在beta版應(yīng)用中出現(xiàn))

I—Info(信息,該等級(jí)日志顯示運(yùn)行狀態(tài)信息,可在產(chǎn)品出現(xiàn)問題時(shí)提供幫助,從該級(jí)別開始的日志通常包含完整意義的英語語句和調(diào)試信息,是最常見的日志級(jí)別)

W—Warning(警告,運(yùn)行出現(xiàn)異常即將發(fā)生錯(cuò)誤或表明已發(fā)生非致命性錯(cuò)誤,該級(jí)別日志通常顯示出執(zhí)行過程中的意外情況,例如將try-catch語句塊中的異常打印堆棧軌跡之后可輸出此種級(jí)別日志)

E—Error(錯(cuò)誤,已經(jīng)出現(xiàn)可影響運(yùn)行的錯(cuò)誤,比如應(yīng)用crash時(shí)輸出的日志)

F—Fatal(嚴(yán)重錯(cuò)誤,比error級(jí)別更高,目前我只在android系統(tǒng)內(nèi)核發(fā)出的日志中看到此種級(jí)別。在Android6.0以前表明開發(fā)者認(rèn)為絕對(duì)不應(yīng)該出現(xiàn)的錯(cuò)誤,在此以后一般開發(fā)場景下絕不應(yīng)該輸出此種級(jí)別的日志)

S—Silent(寂靜,最高級(jí)別,沒有一條日志會(huì)屬于這個(gè)級(jí)別,僅僅作為關(guān)閉logcat輸出的過濾器參數(shù))

示例中日志等級(jí)顯示為W,表示警告級(jí)別。

5. 標(biāo)簽,標(biāo)明日志發(fā)起者和方便日志的過濾篩選,如上中BroadcastQueue,表示該日志關(guān)于廣播隊(duì)列。

6. 正文,本日志的主體內(nèi)容。示例日志中表示一個(gè)后臺(tái)執(zhí)行被阻止,并顯示出了接收到的意圖的詳細(xì)信息。

在之前的操作中,日志只是輸出了幾段就暫停了輸出。其實(shí)在非root的系統(tǒng)權(quán)限下,logcat只能夠輸出當(dāng)前應(yīng)用動(dòng)作引起的日志(這里是指終端應(yīng)用)。如果想獲取全局日志,必須在root權(quán)限下獲取,所以。。。

1.kenzo:/$su

2.kenzo:/#logcat

輸入su回車之后再輸入logcat回車,輸出的全局日志看起來像流水一樣,只不過由于新日志的不斷輸出,方向是向上流的。

logcat的使用姿勢很豐富。用法如下:

logcat [選項(xiàng)] [過濾器]?

選項(xiàng):

-s <過濾器>設(shè)置過濾器,后加過濾器,多個(gè)過濾器用逗號(hào)分隔。若其后不加過濾器。等效于"-s *:S",不輸出日志。

除了方便查看日志的MatLog之外,這里再介紹一個(gè)應(yīng)用叫LiveBoot。這個(gè)應(yīng)用可以將開機(jī)時(shí)正式進(jìn)入系統(tǒng)前,還在播放開機(jī)動(dòng)畫時(shí),就將日志顯示在屏幕上。這個(gè)功能最大的好處就是當(dāng)系統(tǒng)長期播放開機(jī)動(dòng)畫時(shí),通過顯示出的日志可以判斷系統(tǒng)是在建立虛擬機(jī)緩存(比如在Recovery中清除Cache和Dalvik/ART Cache了之后的重啟)還是變成了bootloop軟磚。(永久開機(jī)動(dòng)畫循環(huán))

(應(yīng)用界面,可以看到這個(gè)應(yīng)用的作者是大名鼎鼎的誰)

(開機(jī)效果,看起來很裝逼不是嗎)

這個(gè)工具需要root權(quán)限支持。而且并不是都支持所有非類原生ROM,還會(huì)稍微拖慢開機(jī)時(shí)間。不過想到在疑似系統(tǒng)故障的時(shí)候不知道系統(tǒng)到底是好是壞的忐忑心情,這點(diǎn)小瑕疵算得了什么?

四、免root獲取全局日志,F(xiàn)lyme6獲取真正全局日志的方法

之前就說過,要想獲取全局日志,必須要在root權(quán)限下執(zhí)行l(wèi)ogcat才能達(dá)到目的。這樣做的目的是為了保護(hù)用戶隱私信息。(大家如果閑著沒事的話,打開MatLog,如果懂點(diǎn)英語的話看看正在輸出的日志會(huì)透露出多少用戶隱私?;蛘哒J褂迷O(shè)備一段時(shí)間后再用logcat導(dǎo)出日志到文件查看,這樣顯示出的用戶隱私更多)不過,Google并沒有完全禁止免root查看日志。Android中有一個(gè)權(quán)限叫"android.permission.READ_LOGS"。從字面意思上看就是讀取日志時(shí)使用的權(quán)限。這個(gè)權(quán)限默認(rèn)不授予給第三方應(yīng)用,如果想要將這個(gè)權(quán)限授予給第三方應(yīng)用??梢允褂迷陔娔X上安裝ADB和相關(guān)驅(qū)動(dòng)。在Android設(shè)備上打開USB調(diào)試權(quán)限。(adb大家都很熟悉吧)。然后輸入以下命令。

1.adbshellpmgrant<要授權(quán)的應(yīng)用包名>android.permission.READ_LOGS

正常的情況下。執(zhí)行完即退出,不會(huì)輸出任何字符。第三方應(yīng)用在授權(quán)之后重新啟動(dòng),通過使用shell召喚logcat,即使在非root權(quán)限下也能獲取日志。如果出現(xiàn)以下錯(cuò)誤:

1.Operation not allowed: java.lang.SecurityException:Package<應(yīng)用包名>hasnotrequestedpermissionandroid.permission.READ_LOGS

則表明應(yīng)用的清單文件(AndroidManifest.xml)中需要添加以下權(quán)限:

1.<uses-permissionandroid:name="android.permission.READ_LOGS"/>

而且目標(biāo)SDK(targetSdkVersion)必須不小于21。

在MIUI上,可能還會(huì)出現(xiàn)這個(gè)錯(cuò)誤。

1.Operationnotallowed:java.lang.SecurityException:grantRuntimePermission:Neitheruser2000norcurrentprocesshasandroid.permission.GRANT_RUNTIME_PERMISSIONS.

其實(shí)MIUI默認(rèn)不允許adb權(quán)限更改。如果要想允許權(quán)限更改。需要打開USB調(diào)試的安全設(shè)置開關(guān)。

注意:需要登錄MIUI賬號(hào)。

由于日志本身的隱私屬性。有一些非原生ROM,就算是在root權(quán)限的logcat也無法全部獲取日志。比如說Flyme。這時(shí)也需要找深藏的設(shè)置開關(guān)來解決此問題。

(同樣是點(diǎn)擊系統(tǒng)版本打開開發(fā)者模式)

(設(shè)置--輔助功能--開發(fā)者選項(xiàng)--性能優(yōu)化--高級(jí)日志輸出--全部允許)

不同的xxOS,XXUI有不同的方法,請大家自行查找。

五、總結(jié)

總的來說,這篇文章,也就是圍繞著“Android日志”這個(gè)主題講了一些東西。不過個(gè)人感覺最好的部分還是在logcat的詳細(xì)介紹中。(畢竟這部分我是做得最辛苦的,網(wǎng)上說的太簡單了,每一條命令都是我測試過的。當(dāng)然,這文章的所有做法我都嚴(yán)格測試過以證明其有效性)當(dāng)然,這篇文章對(duì)于普羅大眾來說最大的用處就是知道Android中有日志這個(gè)東西,并且能夠查看,導(dǎo)出并使用它。日志中,我認(rèn)為,盡管只是對(duì)于愛好玩機(jī)的普羅大眾,也蘊(yùn)含著豐富的財(cái)富。通過查看日志,可以了解到Android系統(tǒng)中的許多奧秘,這種好奇心被滿足的興奮感絕不亞于小時(shí)候拆開機(jī)械手表查看其中的齒輪運(yùn)轉(zhuǎn)所感受到的心情。總之,お楽しみ下さい(請盡情享【shi】受【jian】吧)!謝謝大家!


免責(zé)聲明:本文由用戶上傳,如有侵權(quán)請聯(lián)系刪除!

最新文章

精彩推薦

圖文推薦

點(diǎn)擊排行

2016-2022 All Rights Reserved.平安財(cái)經(jīng)網(wǎng).復(fù)制必究 聯(lián)系QQ280 715 8082   備案號(hào):閩ICP備19027007號(hào)-6

本站除標(biāo)明“本站原創(chuàng)”外所有信息均轉(zhuǎn)載自互聯(lián)網(wǎng) 版權(quán)歸原作者所有。