android /data/system/dropbox,Android导出dropbox日志
文章內容已重新排版:Android導出dropbox日志,請到該鏈接瀏覽,謝謝支持。
大項目中出現anr幾乎是必然事件,這里我就不再去贅述怎么分析anr日志了。但是作為分析anr重要依據的必然離不開dropbox日志。
問題來了,dropbox文件目錄路徑一般是/data/system/dropbox/,開發時我們當然能直接把日志拉出來。但是,外面用的正式版的機器我們是沒有讀取這個目錄的權限的,即使你擁有系統權限也不行。所以想著怎么在程序中直接把dropbox日志直接輸出來。
后來找到android了一個跟dropbox日志緊密聯系的類:DropboxManager.
DropboxManager中文介紹可以參考這篇博客:DropboxManager介紹
第一步:獲取DropboxManager
api英文原文是:You can obtain an instance of this class by calling {@link android.content.Context#getSystemService} with {@link android.content.Context#DROPBOX_SERVICE}.代碼:
```
DropboxManager dropboxManager = (DropboxManager?) mContext.getSystemService(Context.DROPBOX_SERVICE);
```
第二步:獲取dropbox信息
DropboxManager中有一個類Entry,該Entry在api中的定義是:A single entry retrieved from the drop box. 通過這個Entry我們就可以獲取到dropbox的日志信息(嘿嘿,開心)。
其實說明白點就是:每個Entry對應的就是一個tag的系統日志(上面推薦博客中介紹到的tag,如crash,anr,strict_mode等等)。既然重點都在這個Entry上,那我們來理一理它。首先看他的參數。
其中我們要用到的就是前面三個:mTag對應的就是我們上說的系統日志的tag;mTimeMillis對應的是Entry創建的時間,這個我們后面會用到,必要參數;mData中包含的就是我們要的數據了。
那么我們怎么獲取Entry呢?不急,DropboxManager中給你提供了方法:getNextEntry(String tag, long msec)。其中tag上面說的很詳細了,傳null代表所有tag;msec代表系統這個時間點后創建的Entry。所以這個方法獲取到的就是指定tag、指定時間點后創建的第一個Entry。
好了,Entry我們已經獲取到了,接下來說說怎么從Entry獲取我們需要的日志信息。Entry類中有一個方法是String getText(int maxBytes),直接返回的就是String,深得我心啊。就是說你直接就可以獲取到對應entry中的日志信息了。具體是怎么實現的我就不說了,去看api,很簡單。
接下來你只需要對這個String進行操作就行了,可以寫到本地文件中,也可以打印到普通日志中。看你喜歡。下面貼一下我的完整代碼
```
import android.content.Context;
import android.os.DropBoxManager;
import android.os.Environment;
import android.util.Log;
import java.io.IOException;
public class DropboxOutputManager {
private static final StringTAG ="DropboxPrintManager";
private static final int MAX_BYTES =8192 *100;
// DropBoxManager 是 Android 在 Froyo(API level 8) 引入的用來持續化存儲系統數據的機制,
// 主要用于記錄 Android 運行過程中, 內核, 系統進程, 用戶進程等出現嚴重問題時的 log,
// 可以認為這是一個可持續存儲的系統級別的 logcat.
private DropBoxManagerdropBoxManager;
/**
* [dropbox文件生成路徑]
*/
private StringoutputPath = Environment.getExternalStorageDirectory().getPath() +"/log/dropbox.log";
private static DropboxOutputManagersInstance;
private DropboxOutputManager() {
//通過用參數 DROPBOX_SERVICE 調用 getSystemService(String) 來獲得這個服務
dropBoxManager = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
}
public static DropboxOutputManagergetInstance() {
if (sInstance ==null) {
synchronized (DropboxOutputManager.class) {
if (sInstance ==null) {
sInstance =new DropboxOutputManager();
}
}
}
return sInstance;
}
/**
* 打印日志信息
*/
public boolean printDropboxLog()throws IOException {
// 我們要輸出所有的dropbox信息,所以時間點從0開始
long time =0;
String text ="";
DropBoxManager.Entry entry;
while ((entry = getEntry(time)) !=null) {
//這里給它加個標簽
text = entry.getTag() +"? " + entry.getText(MAX_BYTES) +"\r\n";
time = entry.getTimeMillis();
//直接打印出來,當然你可以在這里把text寫到文件中去
Log.d("whh", text);
// 這里一定要記得關閉
if (entry !=null) {
entry.close();
}
}
return true;
}
/**
* 獲取指定時間點后的第一個entry,不指定tag
*/
private DropBoxManager.EntrygetEntry(long time) {
// 需要在AndroidManifest中增加android.permission.READ_LOGS權限
DropBoxManager.Entry entry =dropBoxManager.getNextEntry(null, time);
return entry;
}
}
```
總結
以上是生活随笔為你收集整理的android /data/system/dropbox,Android导出dropbox日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql编码转换工具_mysql编码转
- 下一篇: 四川大学 设计专业 C语言必修,四川大学