Android崩溃日志收集是个什么鬼?

目前大多数app都是使用三方库(例如友盟)实现崩溃日志收集, 但不一定了解是如何实现的。 今天工作不忙, 刚好有时间思考一下这个问题。

我们知道Android进程在闪退或崩溃时, logcat里会输出一片红色的崩溃日志, 包括Shutting down vm和堆栈信息。 PS: Android基础知识点:app和linux进程是什么关系? 答:每个android进程可以理解为是一个linux进程。

下面说说我理解的做日志采集的套路:
1、 自定义Application类, 一般在这个类里初始化三方库。
<pre>
<application
android:name=".TheApplication"
android:icon="${icon}"
android:label="${str}"
android:largeHeap="true"
tools:replace="android:label"></pre>

2、 保存默认异常处理Handler的引用(Java虚虚拟机的异常日志都会执行回调函数uncaughtException), 注意handler是运行在主线程里! (PS: 为什么不是子线程? 我的理解是子线程默认没有looper, 而创建android进程时AndroidNative.java里会创建一个looper。)
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

3、 将uncaughtException函数的参数转换为字符串, 即异常日志堆栈信息。


异常堆栈.png

4、 为了更好的分析问题,除了异常堆栈外,可能还需要app版本号、用户信息(例如用户名或手机号)、手机信息(如机型、版本等)、当前进程的线程信息等等, 将这些信息保存到数据库表里(可以用原生的sqlite或三方库如Realm、LitePal、OrmLite、GreenDao等等), 写到数据库的目的在于能够多条批量上传,更重要的是避免进程崩溃后日志丢失或者不知道是否已上传的状态。 PS:当然还可以在捕获到异常时保存其它你关心的数据!

5、 上传日志可以单独启动个远程服务(运行在:remote进程,目的是避免占用UI进程资源), 使用观察者模式监听数据库变化或监听当前时间和上次上传日志的时间间隔, 当日志记录条数超出阈值或者超出间隔周期时, 将日志打包成gzip或其它压缩格式并传送到服务器, 服务器存储结果并返回成功时, 客户端删除对应的日志记录。
PS: HTTP交互是在子线程执行的, 可以借助三方库例如OkHttp实现。

思路示例代码(省略了存数据和打包上传的代码):
<pre>
public class TheApplication extends Application {
Thread.UncaughtExceptionHandler mDefaultHandler;

@Override
public void onCreate() {
    super.onCreate();
    mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();  //第一步,获取默认handler

    //替换handler, 这是在主线程里执行
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            Writer writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            e.printStackTrace(printWriter);
            Throwable cause = e.getCause();
            while (cause != null) {
                cause.printStackTrace(printWriter);
                cause = cause.getCause();
            }
            printWriter.close();
            String result = writer.toString();   //这就是异常日志堆栈信息

            /**
              第三步, 存储app版本号、用户信息(例如uid或手机号)、手机信息(例如机型、版本号)、
             当前进程的线程信息和result(即异常堆栈到一个数据库表里(状态位表示未上传,已上传时删除该记录)
            */

            /**
             * 第四步, 上传异常日志的服务器。 进程里应该有个服务,监听着数据库异常日志表(观察者模式)或启动服务
             * 时判断记录条数是否达到阈值; 超过阈值时, 将多条记录打包压缩成gzip或其它格式上传到服务器, 服务器
             * 存储数据后返回成功, 客户端删除本地日志表的对应记录。
             */

            mDefaultHandler.uncaughtException(t, e);
            // Java的默认异常处理。 如果是NullPointerException, 注释掉这行app会无响应,因为"AndroidRuntime: Shutting down VM"
        }
    });</pre>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容