成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Log的一些姿勢

移動開發 Android
LogCat是Android開發者們最熟悉不過的日志打印工具,幾乎每一個Android項目里面都包含著大量的Log相關代碼。不過,或許是因為Log實在是太過于普通,所以許多人在使用它的時候就顯得非常隨意,這些錯誤的使用姿勢卻會在不經意間給我們帶來不少的大坑。

[[176407]]

LOG 是任何一種編程語言的***個API,通常被初學者用來打印 Hello, World!。 有研究顯示,

不使用 LOG 或者使用姿勢錯誤的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其余三成的人***只能把遺產留給自己的貓。畢竟愛情需要書寫,不能是一整張白紙。

LogCat是Android開發者們最熟悉不過的日志打印工具,幾乎每一個Android項目里面都包含著大量的Log相關代碼。不過,或許是因為Log實在是太過于普通,所以許多人在使用它的時候就顯得非常隨意,這些錯誤的使用姿勢卻會在不經意間給我們帶來不少的大坑。

Log相關的一些問題

沒有關閉調試用的LOG

許多同學喜歡在開發階段用Log輸出當前的一些環境數據,用于調試代碼,但是在調試完成后卻忘了關閉這些Log,導致發版出去的應用里面還會繼續輸出這些LOG,這樣不僅會造成不必要的性能丟失,也會暴露一些敏感的數據,這些都是我們不愿看到的。

首先,我們要給Log進行分級,規定“DEBUG版本輸出哪一些級別的LOG并屏蔽哪一些級別的LOG,而RELEASE版本又輸出另一些級別的LOG并屏蔽另一些級別的LOG”,這樣在開發階段能夠輸出我們調試需要的LOG,而同時又能保證放送的版本能夠屏蔽這些敏感的LOG。但是在開發階段我們不應該特意去注意這些細節,所以必須開發一個Log工具庫,在框架層級解決這個需求。

同時,需要注意的是,用于作為“開啟/關閉Log”的開關必須是一個常量,而不能是一個變量(使用常量的話,在編譯代碼的時候,如果常量為false),編譯器會直接把調試部分的Log代碼直接去掉,而使用變量作為開關的話,這個判斷邏輯會繼續保留,一方面會造成性能丟失,另一方面在運行時也可以通過Hack手段強行開啟這部分Log代碼。

另外,“開啟/關閉Log”的開關必須寫在Log方法外部,也就是說必須先判斷“開啟/關閉Log”條件,再調用Log方法,因為在調用Log方法的時候已經造成了性能丟失,而且調用方法的時候,會先構造好改方法需要的參數(按照參數順序從右往左),再調用方法,而許多人喜歡在調用Log方法的時候計算需要打印出來的內容,這里是最容易造成性能丟失的地方。因此,如果為了圖方便,寫一個Log工具類,在工具類內部去判斷是否應該開啟或關閉Log,事實上已經造成了不少的性能丟失。正確的使用姿勢應該是:

  1. public static final boolean DEBUG = true
  2.  
  3. if (DEBUG) { 
  4.   Log.v(TAG, "log something"); 
  5.  

在循環體內部打印LOG

盡管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內容

在調試代碼的時候,我們經常通過LOG來定位Bug。同理,當線上的版本出現問題的時候,我們也希望能通過LOG來定位問題所在。但是問題是用戶的設備上的打印出來的LOG我們根本沒有方法獲取,唯一的手段就是當用戶設備出現問題的時候,把設備借過來連上IDE用LogCat查看輸出的LOG……顯然這是不可行的。

這種時候,我們可以在打印重要LOG(比如重要路徑的觸發點、或者一些異常類的信息)的時候,一并把這些信息記錄到文件里。在用戶反饋系統里面,一并將這些文件上傳到我們的用戶反饋服務器,這樣在處理反饋問題的時候,就能拿到重要的參考日志了。

BLog

BLog 是 Android SDK 的 LOG 工具 {@Link android.util.Log} 的加強版,以方便在開發時用來

操作調試日志。

特點

  1. 簡單易用的API;
  2. 支持輸出線程信息;
  3. 支持設置LogLevel,方便在生產環境關閉調試用的LOG;
  4. 支持將LOG內容寫入文件,以便通過文件LOG定位用戶反饋的問題;

注意,盡管BLog支持關閉Log的輸出,但是在你調用 BLog.v(String) 的時候,其實已經造成了性能

丟失,所以請盡量使用正確的姿勢來使用BLog,比如

  1. if (BuildConfig.DEBUG) {   
  2. BLog.v(TAG, "log verbose"); 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-11-09 13:19:51

2019-05-07 10:28:27

2021-10-12 23:10:58

UnsafeJavaJDK

2009-07-21 09:29:27

iBATIS使用

2015-08-17 15:53:58

Linux桌面

2022-04-02 14:43:59

Promethues監控

2023-10-09 08:14:10

Helm管理應用

2023-11-10 08:48:09

Lombok庫Java8

2010-05-10 15:41:38

Unix系統

2015-09-23 10:06:37

cocoapods

2024-06-21 08:21:18

2011-07-19 18:11:09

iPhone 開發

2013-03-29 13:17:53

XCode調試技巧iOS開發

2011-07-13 09:13:56

Android設計

2011-03-15 17:46:43

2012-05-21 10:13:05

XCode調試技巧

2009-07-21 09:55:45

iBATIS分頁

2009-06-18 14:54:52

Spring AOP

2009-09-21 17:46:25

Hibernate數據

2011-06-01 16:50:21

JAVA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99在线免费视频 | 精品国产99 | 午夜精品一区二区三区三上悠亚 | 色播av| 亚洲男人天堂网 | 国产一区二区免费在线 | 成人一区二区三区在线观看 | 亚洲国产成人精品女人久久久 | 福利影院在线看 | 天天夜碰日日摸日日澡 | 久久成人一区 | 日本不卡免费新一二三区 | 精品国产一区二区在线 | 日韩成人在线电影 | 91免费看片神器 | 国产精品视频二区三区 | 欧美精品福利视频 | av超碰 | 亚洲 欧美 日韩在线 | 福利精品| 欧美一级二级三级视频 | 爱爱无遮挡 | 精品国产伦一区二区三区观看方式 | 国产精品.xx视频.xxtv | 自拍偷拍精品 | 国产一伦一伦一伦 | 国产中文字幕在线观看 | 一区二区三区在线电影 | 成人天堂噜噜噜 | 亚洲日本免费 | 精品日韩一区二区三区av动图 | 亚洲天堂精品一区 | 北条麻妃国产九九九精品小说 | 亚洲色图综合 | 欧美三级电影在线播放 | 国产高潮好爽受不了了夜夜做 | 精品欧美一区二区久久久伦 | 午夜影院黄| 99精品一区二区三区 | av大全在线观看 | www.亚洲视频.com |