Android 系统全局Bug日志监听

news2024/10/6 6:01:15

一、Android DropBox

Android用来持续化存储系统数据的一个管理类,主要用于记录Android运行过程中,内核、系统j进程、用户进程等出现严重问题时的Log,可以认为它就是一个可持续存储系统级别的Logcat.

日志储存位置:/data/system/dropbox

1、dropbox记录的文件有哪些?

每个文件格式命名都是:processClass _ eventType@时间戳[.txt|txt.gz].
processClass列举:system_server, system_app, data_app;

eventType列举:分为crash anr watchdog wtf strict_mode lowmem
其中@前面部分及dropbox写入的tag。

如列举部分tag含义:

以下是一些常见的日志类型:
system_app_crash 系统app崩溃
system_app_anr 系统app无响应
system_app_wtf 系统app严重错误
data_app_crash 普通app崩溃
data_app_anr 普通app无响应
system_server_anr system进程无响应
system_server_watchdog system进程发生watchdog
system_server_crash system进程崩溃
system_server_native_crash system进程native出现崩溃
system_server_wtf system进程发生严重错误
system_server_lowmem system进程内存不足

SYSTEM_TOMBSTONE Native 进程的崩溃
SYSTEM_RECOVERY_LOG 系统恢复

BATTERY_DISCHARGE_INFO 电池放电信息
SYSTEM_BOOT                    系统启动信息
SYSTEM_LAST_KMSG        重启前的kernel log
SYSTEM_TOMBSTONE       系统墓碑日志
SYSTEM_RESTART              系统重启

data_app_strictmode             App不规范操作log(比如主线程操作网络、IO等)
2、如何利用DropboxManager

a.利用 DropBoxManager 来记录需要相对持久化存储的错误日志信息
优点:自动抓错, 避免人为因素而产生的错误遗漏
b.错误自动上报
可以利用dropbox每生成新的记录, Dropbox 就会发送广播:
DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED

app可以接收监听改广播获取指定的数据文件内容,内容发送到指定的服务器或邮箱完成错误自动上报。

利用前提:app要具有系统权限 因为:DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED是保护性广播,且读取系统日志也需要android.Manifest.permission.READ_LOGS权限

3、利用DropboxManager实现监听系统异常Log

1、自定义广播监听

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.DropBoxManager;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class DropBoxBroadcastReceiver extends BroadcastReceiver {
    private DropBoxManager dropBoxManager;
    private StringBuffer sb;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (dropBoxManager == null) {
            dropBoxManager = (DropBoxManager) context.getSystemService(Context.DROPBOX_SERVICE);
            sb = new StringBuffer();
        }
        sb.setLength(0);
        final String tag = intent.getStringExtra(DropBoxManager.EXTRA_TAG);
        final Long time = intent.getLongExtra(DropBoxManager.EXTRA_TIME, 0L);
        Log.i("ACRA", "main tag:"+tag+"   time:"+time);

        new Thread(new Runnable() {
            @Override
            public void run() {
                DropBoxManager.Entry nextEntry = dropBoxManager.getNextEntry(tag, time-1);
                while (nextEntry != null) {
                    try {
                        long msec = nextEntry.getTimeMillis();
                        DataInputStream dis = new DataInputStream(new BufferedInputStream(nextEntry.getInputStream()));
                        byte[] bytes = new byte[1024];
                        int count = -1;
                        while ((count = dis.read(bytes, 0, 1024)) != -1) {
                            String str = new String(bytes, 0, count);
                            sb.append(str);
                        }
                        dis.close();
                        nextEntry.close();
                        nextEntry = dropBoxManager.getNextEntry(tag, msec);

                        logE("ACRA", "------>:\r\n" + sb.toString());
                        sb.setLength(0);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

            }
        }).start();
    }
    /**
     * 超出部分截断输出
     * @param tag
     * @param content
     */
    public static void logE(String tag, String content) {
        int p = 2048;
        //1.获取字符前2048字节的md5值
        try {
            Log.e(tag, "md5:"+md5(content.substring(0,p)));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        long length = content.length();
        if (length < p || length == p)
            Log.e(tag, content);
        else {
            while (content.length() > p) {
                String logContent = content.substring(0, p);
                content = content.replace(logContent, "");
                Log.e(tag, logContent);
            }
            Log.e(tag, content);
        }
    }
}

2、AndroidManifest.xml清单文件添加广播 、系统进程属性

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.xxxx"
    android:sharedUserId="android.uid.system" 
    android:versionCode="19"
    android:versionName="2.0" >
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name=".broadcast.DropBoxBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.DROPBOX_ENTRY_ADDED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1669240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

云计算第十二课

安装虚拟机 第一步新建虚拟机 选择自定义安装 下一步 选择稍后安装操作系统 选择系统类型和版本 选择虚拟机文件路径&#xff08;建议每台虚拟机单独存放并且路径不要有中文&#xff09;点击下一步 选择bios下一步 选择虚拟机处理器内核数量 默认硬盘或者自行调大硬盘 选择虚…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中&#xff0c;您是否常常觉得时间不够用&#xff1f;Dato for Mac&#xff0c;您的时间管理专家&#xff0c;助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能&#xff0c;让您的日程安排井井有条。无论是工作还是生活&#xff0c;Dato for Mac都能成为您的…

ONES 功能上新 | 近期产品新功能一览

支持在 ONES Project 中通过弹窗查看、编辑 ONES Wiki 页面。 应用场景&#xff1a; 当需要在 ONES Project 中查看 ONES Wiki 的页面内容时&#xff0c;可以直接点击工作项关联的 ONES Wiki 页面或项目文档组件中的页面&#xff0c;即可在 ONES Project 中通过弹窗查看 ONES W…

OCR技术在历史文献数字化中的革命性作用

随着数字化技术的不断发展&#xff0c;历史文献的数字化已成为保存和传播文化遗产的重要途径。其中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在历史文献数字化中发挥了革命性的作用&#xff0c;为研究者提供了更广阔的研究空间&#xff0c;推动了历史学研究的发…

【C语言|数据结构】双向链表

文章目录 前言1、初步认识双向链表1.1 定义&#xff1a;1.2 结构1.3 节点的存储 2、双向链表的接口函数2.1 链表的节点的动态申请2.2 链表的初始化2.3 尾插2.4 头插2.5 头删2.5 尾删2.6 在pos节点后面添加数据2.6 删除pos节点 3、双向链表的实现&#xff1a; 前言 各位小伙伴大…

读人工智能时代与人类未来笔记01_重塑人类社会秩序

1. AlphaZero 1.1. 2017年年底&#xff0c;由谷歌旗下DeepMind公司开发的人工智能程序AlphaZero击败了当时世界上最强大的国际象棋程序Stockfish 1.1.1. AlphaZero对Stockfish的百场战绩是28胜72平0负&#xff0c;可以说获得了压倒性的胜利 1.1.2. …

嵌入式学习-中断控制系统

补充一下前面NVIC内嵌向量中断控制器的知识 中断 中断类型 中断控制 配置中断 优先级 分组问题 中断使能 NVIC相关库函数和作用 库函数 函数名 描述 NVIC_DeInit 将外设 NVIC 寄存器重设为初始值 NVIC_SCBDeInit 将外设 SCB 寄存器重设为初始值 NVIC_PriorityGroupCon…

C++ | Leetcode C++题解之第85题最大矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int m matrix.size();if (m 0) {return 0;}int n matrix[0].size();vector<vector<int>> left(m, vector<int>(n, 0)…

用 Python 从头开始​​编写线性回归

找到最佳拟合线的方法是使用梯度下降&#xff0c;我们将随机绘制一条线&#xff0c;计算该线的误差 计算误差 给定m和b&#xff0c;我们将计算直线的误差。Eeeor用sigma表示法表示 def compute_error_for_line_given_points(b, m, points):totalError 0for i in range(0, len…

职校智慧校园现状及问题分析

各大中职院校及高职院校是校园信息化的先行者和开拓者&#xff0c;很早就开始注重信息化基础设施建设和信息化人文素养的提升。在过去几年里&#xff0c;随着国家大力发展与扶植职校教育&#xff0c;学校投入相当的经费进行了校园信息通信网络、计算机等基础硬件设备建设&#…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列&#xff0c;具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务&#xff0c;支持各种接入方式和协议&#xff0c;并且可以方便地进行扩展和升级。 实验拓扑图&…

打造清洁宜居家园保护自然生态环境,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建自然生态场景下违规违法垃圾倾倒检测识别系统

自然生态环境&#xff0c;作为我们人类赖以生存的家园&#xff0c;其健康与否直接关系到我们的生活质量。然而&#xff0c;近年来&#xff0c;一些不法分子为了个人私利&#xff0c;在河边、路边等公共区域肆意倾倒垃圾&#xff0c;严重破坏了环境的健康与平衡。这种行为不仅损…

【无标题】能效?性能?一个关于openssl speed速度测试的诡异问题。

问题描述 最近的某个软件用到了openssl&#xff0c;所以就想着测试一下速度。我的电脑是惠普的&#xff0c;CPU是AMD Ryzen 7 PRO 6850HS&#xff0c;系统是Win11。我使用openssl自带的speed测试加密/解密的速度&#xff0c;命令大致如下&#xff1a; openssl speed -evp aes…

中仕公考:公务员考试都有哪些类型?

1、国考&#xff1a;国考即国家公务员考试&#xff0c;是全国统一招考。每年10月份发布公告&#xff0c;11月份笔试&#xff0c;涉及的岗位比较多。 2、省考&#xff1a;省考是各省份公务员考试&#xff0c;主要是地方各级组织的统一考试。分为全国联考和非联考&#xff0c;一…

一键自动生成视频字幕,高效实用的视频后期工具:VideoSrt

VideoSrt&#xff1a;一键高效&#xff1a;专业级视频音频字幕自动生成功能- 精选真开源&#xff0c;释放新价值。 概览 VideoSrt是一款专为高效媒体后期制作设计的工具&#xff0c;它采用了Golang编程语言&#xff0c;并基于lxn/walk GUI库构建&#xff0c;专为Windows环境优…

如何快速变得专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

C++基础与深度解析 | 什么是C++ | C++开发环境与相关工具 | C++编译/链接模型

文章目录 一、什么是C二、C的开发环境与相关工具三、C的编译/链接模型 一、什么是C C是一门比较流行的编程语言&#xff08;高级语言&#xff09;&#xff0c;同时也是一门复杂的语言。从TIOBE 编程社区指数中可以看出&#xff1a;在2024.04中&#xff0c;其编程语言受欢迎程度…

1. 抓娃娃-二分

因为这个限制&#xff0c;所以不用担心线段比区间长 线段一定比区间短的话&#xff0c;想要判断是否线段的二分之一及以上在区间内&#xff0c;则可以转化为线段中点是否在区间内的问题 如果没有那个限制&#xff0c;那么就无法这么考虑了&#xff0c;因为即使中点在区间内&…

C++笔试强训day19

目录 1.小易的升级之路 2.礼物的最大价值 3.对称之美 1.小易的升级之路 链接 模拟就行&#xff0c;唯一可能是难点得就是gcd&#xff08;最大公约数&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…