Android导出Dropbox日志

  • 大项目中出现anr几乎是必然事件,这里我就不再去赘述怎么分析anr日志了。但是作为分析anr重要依据的必然离不开dropbox日志。
  • 问题来了,dropbox文件目录路径一般是/data/system/dropbox/,开发时我们当然能直接把日志拉出来。但是,外面用的正式版的机器我们是没有读取这个目录的权限的,即使你拥有系统权限也不行。所以想着怎么在程序中直接把dropbox日志直接输出来。
  • 后来找到android一个跟dropbox日志紧密联系的类:DropboxManager,DropboxManager中文介绍可以参考这篇博客:Android 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;
    }
}

git代码地址

你可能感兴趣的:(Android导出Dropbox日志)