當前位置:首頁 » 安卓系統 » android封裝log

android封裝log

發布時間: 2023-03-11 09:24:23

A. Android 各種log 的介紹

包含設備日誌,堆棧跟蹤和其他診斷信息,可幫助您查找和修復應用中的錯誤。

安卓bugreport主要用於分析手機的狀態。其包含: main log , kernel log ,cpuinfo等信息。bugreport是一個可執行文件,編譯後的路徑為system/bin/bugreport,源碼位於framework/native/cmds/bugreport。其核心在於啟動mpsys服務。bugreport同mpstate服務建立socket通信(建立連接20次,超時3min無數據等容錯)。連接之後,將接收到的數據定向到文件中。

  因此我們看到的bugreport數據均來自mpstate。

bugreport通過socket與mpstate服務建立通信,在mpstate.cpp中的mpstate()方法完成核心功能。分別輸出: current log、 last log、 vm trace、 mpsys、 system info

 其詳細內容主要有: 系統build及運行時長等信息、 內存和CPU進程的信息、 kernel log、 system log、 radio log、 event log 等等。實際來說,bugreport中顯示的大部分為信息,都有對應的命令方式可以獲取。bugreport只是作為一個在不打擾用戶的前提下執行的一套命令集合。

    1). main_log    記錄手機android上層app以及framework相關活動的log,比如你寫的app列印的log,就在這裡面

    2). events_log    主要是ActivityManager、powerManager等相關的log

    3). kernel Log    驅動相關的log

Logcat是內置在Android系統中的一個可執行工具,用於轉儲系統消息日誌,其中包括設備引發錯誤時的堆棧追蹤以及從您的應用當使用 Log 類編寫的消息。可以在主機上通過adb logcat命令來查看模擬機上日誌信息。

Android tcpmp是命令行數據包捕獲實用程序。它可以捕獲來自您的Wi-Fi連接,蜂窩連接以及您在android設備上可能具有的任何其他網路連接的數據包

modem 是手機里負責搜網和sim卡數據操作底層模塊,每個手機都有,md log 用於分析掉網、掉話、無信號等問題

系統崩潰時留下的遺言,怎麼死的,死哪了,死的多慘。

當一個動態庫(native 程序)開始執行時,系統會注冊一些連接到 debuggerd 的 signal handlers,當系統 crash(崩潰) 的時候,會保存一個 tombstone 文件到/data/tombstones目錄下(Logcat中也會有相應的信息),文件的確就像墓碑一樣記錄了死亡了的進程的基本信息(例如進程的進程號,線程號),死亡的地址(在哪個地址上發生了 Crash),死亡時的現場是什麼樣的(記錄了一系列的堆棧調用信息)等等。

6. netlog    網路相關

看網路鏈接情況,抓取網路包等等

7. QXDM(the Qualcomm eXtensible Diagnostic Monitor)高通可擴展診斷監視器

該工具適用於擁有使用Qualcomm ASIC和試用硬體的設備的人,並允許他們測試,評估和潛在診斷其移動設備的RF性能問題。通常使用它來促進這些設備的產品開發。

使用該軟體,用戶可以查看他們的移動設備發出的所有信令消息,因為該軟體會生成它們的日誌。這些日誌也可以通過軟體進行注釋。可以將網路和電話參數的任何混合添加到屏幕,並且允許用戶在使用其參數時使用復雜的公式。該程序還實時生成大量統計數據,以便用戶可以更好地識別潛在的性能問題。用戶可以訪問Markov統計信息,Mux統計信息,RLP統計信息,塊錯誤率,移動性管理數據,尋呼和訪問統計信息,前向和反向鏈路統計信息等等。該程序還為用戶提供了攜帶型設備信號的圖形顯示。該程序與Windows操作系統兼容。

8. init Log(init進程log)

9. Crashlog(崩潰日誌)

B. Android中如何通過logcat追蹤生命周期事件

Log類是Android.util的成員類,當我們鍵入Log類時,會彈出一個智能代碼提示列表。我們在該列表中選擇日誌輸出類型d的方法時,系統會自動import導入Android.util.Log包。但是要注意Log類值在實際開發中只用於測試代碼,如果你准備進行應用分發時,你應該在代碼中注釋掉或者刪除所有Log類的引用。Log類中封裝了一套方法可以將消息發送到logcat控制台、命令行或者Andorid studio中,這些方法都是由單個字元組成,常用的方法有以下5個:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。根據首字母對應VERBOSE,DEBUG,INFO, WARN,ERROR,分別表示不同的調式級別。在logcat控制台中你可以設置只顯示某個級別及其以上的日誌信息。

按照日誌級別從高到低為ERROR, WARN, INFO, DEBUG, VERBOSE..
1、Log.v 字元串的輸出顏色為黑色的,輸出大於或等於VERBOSE日誌級別的信息
2、Log.d字元串的輸出顏色是藍色的,輸出大於或等於DEBUG日誌級別的信息
3、Log.i字元串的輸出為綠色,輸出大於或等於INFO日誌級別的信息
4、Log.w字元串的輸出為橙色, 輸出大於或等於WARN日誌級別的信息
5、Log.e字元串的的輸出為紅色,僅輸出ERROR日誌級別的信息.

那我們如何通過Log類監聽Activity的生命周期呢看
首先我們在Activity中重寫所有生命周期相關的回調方法,然後在每個回調方法中通過Log類來調用相應的方法來列印信息。根據列印的信息我們就可以知道Activity的生命周期順序時怎麼樣的了,以下示例代碼我們監聽了Activity所有生命周期相關的回調方法。在我們運行程序時就可以在控制台看到生命周期順序的列印信息了。
package com.example.hsport.catalog;

import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private CoordinatorLayout coordinatorLayout;
private final String TAG ="--MainActivity--";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
Button button = (Button) findViewById(R.id.submitbutton);
Log.d(TAG,"--onCreate--");
}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG,"--onStop--");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"--onDestroy--");
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"-- onPause--");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG,"-- onRestar--");
}
}
當我們在模擬器中啟動Activity時列印信息如下,可以看出來它調用了onCreate、onStart、onResume三個方法

你可以通過操作應用程序來查看更多情況下的Activity生命周期的變化。
這些都是Android中的基礎知識,推薦你可以在一個叫做秒秒學的教程網站上可以找到相關資料。

C. 安卓如何將log保存到文件中

相信大家在做應用調試的時候,不可能時時通過USB線連著電腦去查看log信息,所以,將應用的log信息保存到手機本地就很有必要了,有助我們從這些log信息中提取有用的部分,以解決一些bug,下面我把網上分享的代碼中作了一些精簡,作為開發者使用,個人覺得沒必要通過用戶上傳給我們,用戶上傳的不需要這么龐大的log信息,僅僅那部分崩潰的log信息即可,可參考我的另外一篇blog:http://blog.csdn.net/weidi1989/article/details/7927273。
好了,廢話不多說,直接分享封裝好的log信息類:LogcatHelper
package com.way.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import android.content.Context;
import android.os.Environment;

/**
* log日誌統計保存
*
* @author way
*
*/

public class LogcatHelper {

private static LogcatHelper INSTANCE = null;
private static String PATH_LOGCAT;
private LogDumper mLogDumper = null;
private int mPId;

/**
*
* 初始化目錄
*
* */
public void init(Context context) {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {// 優先保存到SD卡中
PATH_LOGCAT = Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator + "miniGPS";
} else {// 如果SD卡不存在,就保存到本應用的目錄下
PATH_LOGCAT = context.getFilesDir().getAbsolutePath()
+ File.separator + "miniGPS";
}
File file = new File(PATH_LOGCAT);
if (!file.exists()) {
file.mkdirs();
}
}

public static LogcatHelper getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = new LogcatHelper(context);
}
return INSTANCE;
}

private LogcatHelper(Context context) {
init(context);
mPId = android.os.Process.myPid();
}

public void start() {
if (mLogDumper == null)
mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);
mLogDumper.start();
}

public void stop() {
if (mLogDumper != null) {
mLogDumper.stopLogs();
mLogDumper = null;
}
}

private class LogDumper extends Thread {

private Process logcatProc;
private BufferedReader mReader = null;
private boolean mRunning = true;
String cmds = null;
private String mPID;
private FileOutputStream out = null;

public LogDumper(String pid, String dir) {
mPID = pid;
try {
out = new FileOutputStream(new File(dir, "GPS-"
+ MyDate.getFileName() + ".log"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

/**
*
* 日誌等級:*:v , *:d , *:w , *:e , *:f , *:s
*
* 顯示當前mPID程序的 E和W等級的日誌.
*
* */

// cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";
// cmds = "logcat | grep \"(" + mPID + ")\"";//列印所有日誌信息
// cmds = "logcat -s way";//列印標簽過濾信息
cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";

}

public void stopLogs() {
mRunning = false;
}

@Override
public void run() {
try {
logcatProc = Runtime.getRuntime().exec(cmds);
mReader = new BufferedReader(new InputStreamReader(
logcatProc.getInputStream()), 1024);
String line = null;
while (mRunning && (line = mReader.readLine()) != null) {
if (!mRunning) {
break;
}
if (line.length() == 0) {
continue;
}
if (out != null && line.contains(mPID)) {
out.write((MyDate.getDateEN() + " " + line + "\n")
.getBytes());
}
}

} catch (IOException e) {
e.printStackTrace();
} finally {
if (logcatProc != null) {
logcatProc.destroy();
logcatProc = null;
}
if (mReader != null) {
try {
mReader.close();
mReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
out = null;
}

}

}

}

}

記得加上許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_LOGS" />

另外把那個時間的工具類也分享一下:
package com.way.util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDate {
public static String getFileName() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String date = format.format(new Date(System.currentTimeMillis()));
return date;// 2012年10月03日 23:41:31
}

public static String getDateEN() {
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1 = format1.format(new Date(System.currentTimeMillis()));
return date1;// 2012-10-03 23:41:31
}

}

OK,所有事情做完之後,在我們的應用中start一下就OK了,使用完之後,記得調用一下stop:
public class GPSApplication extends Application {

@Override
public void onCreate() {
// TODO Auto-generated method stub
LogcatHelper.getInstance(this).start();
}
}

D. Android Log等級的介紹

android.util.Log常用的方法有以下5個:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() 。按照日誌級別從高到低為ERROR, WARN, INFO, DEBUG, VERBOSE.至於日誌級別本身的含義.

1.下面是對各種日誌級別的輸出介紹:

1、Log.v 的輸出顏色為黑色的,輸出大於或等於VERBOSE日誌級別的信息

2、Log.d的輸出顏色是藍色的,輸出大於或等於DEBUG日誌級別的信息

3、Log.i的輸出為綠色,輸出大於或等於INFO日誌級別的信息

4、Log.w的輸出為橙色, 輸出大於或等於WARN日誌級別的信息

5、Log.e的輸出為紅色,僅輸出ERROR日誌級別的信息.

Android的Log等級通常有五類,按照日誌級別由低到高分別是Verbose、Debug、Info、Warning、Error,其對應的log定義在system層。

1.V

Verbose就是冗長啰嗦的。通常表達開發調試過程中的一些詳細信息,用Log.v()輸出,不過濾地輸出所有調試信息。是最低級的Log可以不用管。

2.D

Debug來表達調試信息。用Log.d()輸出,能輸出Debug、Info、Warning、Error級別的Log信息。

3.I

Info來表達一些信息。用Log.i()輸出,能輸出Info、Warning、Error級別的Log信息。

4.W

Warning表示警告,但不一定會馬上出現錯誤,開發時有時用來表示特別注意的地方。用Log.w()輸出,能輸出Warning、Error級別的Log信息。

5.E

Error表示出現錯誤,是最需要關註解決的。用Log.e()輸出,能輸出Error級別的Log信息。

註:Info、Warnning、Error等級的Log在普通調試中不隨意濫用,存在發布版本中。在開發調試版本中,才會顯示全部等級。

E. 為什麼要對android log進行封裝

簡單說,在版本發布的時候,要取消所有log,你封裝一下,改一下開關就能關閉所有的log了。而不關閉log的風險包括,你列印的東西太多 和 列印的東西有可能空指針異常之類的。

熱點內容
下載安裝python 發布:2025-05-13 19:39:21 瀏覽:27
蘋果手機如何退出ad密碼 發布:2025-05-13 19:35:24 瀏覽:353
資本論中央編譯局 發布:2025-05-13 19:21:50 瀏覽:134
python路徑是否存在 發布:2025-05-13 19:08:38 瀏覽:570
保時捷卡宴哪個配置比較好 發布:2025-05-13 19:00:08 瀏覽:725
c語言負數運算 發布:2025-05-13 18:45:21 瀏覽:428
太空殺電腦版連接不到伺服器 發布:2025-05-13 18:40:19 瀏覽:457
同樣的配置為什麼跑分不同 發布:2025-05-13 18:39:06 瀏覽:278
獲取linuxcpu序列號 發布:2025-05-13 18:36:35 瀏覽:738
appleid為什麼連接伺服器出現問題 發布:2025-05-13 18:17:37 瀏覽:972