LOG 是任何一種編程語言的第一個API,一般被初學者用來打印
Hello, World!
。 有研究顯示,
不使用 LOG 或者使用姿式錯誤的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟本身不愛的人結婚,而其他三成的人最後只能把遺產留給本身的貓。畢竟愛情須要書寫,不能是一整張白紙。java
LogCat是Android開發者們最熟悉不過的日誌打印工具,幾乎每個Android項目裏面都包含着大量的Log相關代碼。不過,或許是由於Log實在是太過於普通,因此許多人在使用它的時候就顯得很是隨意,這些錯誤的使用姿式卻會在不經意間給咱們帶來很多的大坑。android
許多同窗喜歡在開發階段用Log輸出當前的一些環境數據,用於調試代碼,可是在調試完成後卻忘了關閉這些Log,致使發版出去的應用裏面還會繼續輸出這些LOG,這樣不只會形成沒必要要的性能丟失,也會暴露一些敏感的數據,這些都是咱們不肯看到的。git
首先,咱們要給Log進行分級,規定「DEBUG版本輸出哪一些級別的LOG並屏蔽哪一些級別的LOG,而RELEASE版本又輸出另外一些級別的LOG並屏蔽另外一些級別的LOG」,這樣在開發階段可以輸出咱們調試須要的LOG,而同時又能保證放送的版本可以屏蔽這些敏感的LOG。可是在開發階段咱們不該該特地去注意這些細節,因此必須開發一個Log工具庫,在框架層級解決這個需求。github
同時,須要注意的是,用於做爲「開啓/關閉Log」的開關必須是一個常量,而不能是一個變量(使用常量的話,在編譯代碼的時候,若是常量爲false),編譯器會直接把調試部分的Log代碼直接去掉,而使用變量做爲開關的話,這個判斷邏輯會繼續保留,一方面會形成性能丟失,另外一方面在運行時也能夠經過Hack手段強行開啓這部分Log代碼。編程
另外,「開啓/關閉Log」的開關必須寫在Log方法外部,也就是說必須先判斷「開啓/關閉Log」條件,再調用Log方法,由於在調用Log方法的時候已經形成了性能丟失,並且調用方法的時候,會先構造好改方法須要的參數(按照參數順序從右往左),再調用方法,而許多人喜歡在調用Log方法的時候計算須要打印出來的內容,這裏是最容易形成性能丟失的地方。所以,若是爲了圖方便,寫一個Log工具類,在工具類內部去判斷是否應該開啓或關閉Log,事實上已經形成了很多的性能丟失。正確的使用姿式應該是:服務器
public static final boolean DEBUG = true; if (DEBUG) { Log.v(TAG, "log something"); }
儘管Log形成的性能損失很小,可是若是在循環體內部循環調用Log方法的話,那整體的丟失的很是可觀了,因此不該該在循環體內部使用Log,正確的作法是在循環體內部拼接須要打印的內容,等跳出循環體再一次打印出來。框架
除了常見的循環體外,還要一個須要注意的場景就是Adapter。ListView/RecyclerView是Android開發中最經常使用的控件,所以Adapter使用的情景也不少。滾動屏幕的時候,ListView/RecyclerView會在經過Adapter頻繁地綁定ItemView和數據,並且這些都是在UI線程裏進行的,因此若是在綁定的過程當中調用Log,可能會形成明顯的卡頓。編程語言
至於Log到底會丟失多少性能,通常狀況下,Log的性能丟失很小,畢竟是這麼常見的系統Api,確定是身經百戰,早就是「best performance」了。不過我曾經有個RecyclerView在MIUI上很是卡,一開始我是RecyclerView佈局沒優化好,最終定位到Adapter內部的一處Log上,卡頓的地方出如今Log的Native實現。MIUI到底對用戶輸出的日誌作了什麼處理呢?很是神奇。工具
在調試代碼的時候,咱們常常經過LOG來定位Bug。同理,當線上的版本出現問題的時候,咱們也但願能經過LOG來定位問題所在。可是問題是用戶的設備上的打印出來的LOG咱們根本沒有方法獲取,惟一的手段就是當用戶設備出現問題的時候,把設備借過來連上IDE用LogCat查看輸出的LOG……顯然這是不可行的。佈局
這種時候,咱們能夠在打印重要LOG(好比重要路徑的觸發點、或者一些異常類的信息)的時候,一併把這些信息記錄到文件裏。在用戶反饋系統裏面,一併將這些文件上傳到咱們的用戶反饋服務器,這樣在處理反饋問題的時候,就能拿到重要的參考日誌了。
BLog 是 Android SDK 的 LOG 工具 {@Link android.util.Log} 的增強版,以方便在開發時用來
操做調試日誌。
簡單易用的API;
支持輸出線程信息;
支持設置LogLevel,方便在生產環境關閉調試用的LOG;
支持將LOG內容寫入文件,以便經過文件LOG定位用戶反饋的問題;
注意,儘管BLog支持關閉Log的輸出,可是在你調用 BLog.v(String)
的時候,其實已經形成了性能
丟失,因此請儘可能使用正確的姿式來使用BLog,好比
if (BuildConfig.DEBUG) { BLog.v(TAG, "log verbose"); }
GitHub : https://github.com/kaedea/b-log
出處 : 使用 Log 的正確姿式