Android系統開發中log的使用方法及簡單的原理

來源:互聯網
上載者:User

在程式開發過程中,LOG是廣泛使用的用來記錄程式執行過程的機制,它既可以用於程式調試,也可以用於產品運營中的事件記錄。在Android系統中,提供了簡單、便利的LOG機制,開發人員可以方便地使用。在平時開發過程中經常需要與log打交道,所以很有必要瞭解log的使用方法及簡單的原理。

1、linux核心的log輸出
在標準的linux核心開發過程中,使用printk,這是一個與printf輸出列印齊名的函數,同樣提供格式化輸出功能,只是其有
列印層級且將資訊儲存到/proc/kmsg日誌中,使用cat命令查看其資訊[cat/proc/kmsg] 複製代碼 代碼如下:<SPANstyle="COLOR:#003333;FONT-SIZE:14px">#defineKERN_EMERG"<0>"/*systemisunusable*/
#defineKERN_ALERT"<1>"/*actionmustbetakenimmediately*/
#defineKERN_CRIT"<2>"/*criticalconditions*/
#deinfeKERN_ERR"<3>"/*errorconditions*/
#deinfeKERN_WARNING"<4>"/*warningconditions*/
#deinfeKERN_NOTICE"<5>"/*normalbutsignificantcondition*/
#deinfeKERN_INFO"<6>"/*informational*/
#deinfeKERN_DEBUG"<7>"/*debug-levelmessages*/</SPAN>

2、android中log輸出
Android系統在使用者空間中提供了輕量級的logger日誌系統,它是在核心中實現的一種裝置驅動,與使用者空間的logcat工具配合使用能夠方便地跟蹤偵錯工具。
Android系統中的C/C++日誌介面是通過宏來使用的。在system/core/include/android/log.h定義了日誌的層級:
/*
*Androidlogpriorityvalues,inascendingpriorityorder.
*/
typedefenumandroid_LogPriority{
ANDROID_LOG_UNKNOWN=0,
ANDROID_LOG_DEFAULT,/*onlyforSetMinPriority()*/
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT,/*onlyforSetMinPriority();mustbelast*/
}android_LogPriority;

為了使用方便,在system/core/include/cutils/log.h定義了相對應的宏:
#defineLOGV(...)((void)LOG(LOG_VERBOSE,LOG_TAG,__VA_ARGS__))
#defineLOGD(...)((void)LOG(LOG_DEBUG,LOG_TAG,__VA_ARGS__))
#defineLOGI(...)((void)LOG(LOG_INFO,LOG_TAG,__VA_ARGS__))
#defineLOGW(...)((void)LOG(LOG_WARN,LOG_TAG,__VA_ARGS__))
#defineLOGE(...)((void)LOG(LOG_ERROR,LOG_TAG,__VA_ARGS__))
因為如果需要使用log輸出,包含其標頭檔:#include<cutils/log.h>並link其動態庫:liblog.so即可
#defineLOG_TAG"XX_LOG_TAG"//這裡可以定義其輸出的TAG
#include<cutils/log.h>
JAVA層列印:
importandroid.util.Log;
privatestaticfinalStringTAG="XX_LOG_TAG";
Log.e(TAG,"ThisistheerrorlogprintedbyLog.iinandroiduserspace.");

3、盒子上如何擷取log
a、進入shell擷取log
adbkill-server
adbconnectdest-ip
adbshell【登入shell】
mount-oremount/system/system【改變許可權】
logcat>>1.log
命令列輸入CTRL+C回到cmd命令列,adbpullpath/1.log
b、直接在cmd命令列擷取log
adbconnect連上後;
adbshell
adblogcat>>path/1.log
操作完畢後
命令列輸入CTRL+C回到cmd命令列,adbpullpath/1.log
c、在terminal終端直接輸出log
斷行符號切到shell
logcat[此時即可看到列印]

4、Eclipse環境下運行(安裝了Android外掛程式),那麼直接可以在Eclipse就可以查看了

5、常用技巧
1、logcat中會列印【輸出層級+LOG_TAG名字+進程字+列印的資訊】可以充分利用這些資訊分析問題
I/SystemServer(939):ActivityManager
I/ActivityManager(939):Memoryclass:96
E/AndroidRuntime(939):ErrorreportingWTF
第一列由Log.i(e/w..決定)或者LOGI/LOGE/LOGW...
第二列由LOG_TAG/TAG(JAVA)中決定,可以對於同一組模組前相同的首碼[xxx]funtion這種命名
第三列是系統進程號getpid()這值,列印線程值pthread_slef()

最後的就是自行增加的列印資訊
2、調效效率或者執行時間
1、建議重點的列印增加首碼,方便尋找。以[######]
2、直接利用logcat輸出時間,調試執行速度,分析效率
logcat-vtime【Displaythedate,invocationtime,priority/tag,andPIDoftheoriginatingprocess.】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.