DropBox系列-安卓DropBox介绍

news2024/12/25 1:07:59

前言:

作者本人负责公司的APM监控模块,因为工作的原因,对ANR,crash等流程研究的比较多,最近在打造APM监控平台的时候,顺带对DropBox的实现原理进行了一定的学习和研究,发现了一些妙用,因此写这篇文章来分享。

本系列分为两篇文章,

1.DropBox系列-安卓DropBox介绍:主要介绍DropBox的一些实现原理。

2.DropBox系列-利用DropBox打造APM框架:主要介绍利用DropBox打造一个面向所有APP的稳定性监控框架。

PS:本文的代码以安卓9(SDK=28)的源码来介绍,因为目前车载开发基本上都是以安卓9为基础来定制的,而且DropBox对于那些拥有系统权限的APP来讲意义更大一些。

一.DropBox简介

dropbox是安卓系统中用来记录一些异常信息的模块,比如某个应用crash了或者anr了,系统最终都会把记录的异常信息记录到dropbox中。

其一般会把异常信息记录到中:data/system/dropbox文件夹下,记录的类型会有很多种,主要有CRASH,ANR,墓碑日志,native崩溃等等,如下图所示:

 

当然,由于SELinux权限的限制,这些文件夹对于普通的APP来讲说不可访问的,只有拥有系统签名的APP才可以访问的。

二.DropBox记录流程

2.1 binder接口

DropBoxManagerService中,提供了一个binder实现类,主要提供了四个方法,其实最核心的,就是add方法,也就是真正实现记录的方法。我们的源码阅读,也从这里开始。

private final IDropBoxManagerService.Stub mStub = new IDropBoxManagerService.Stub() {
        @Override
        public void add(DropBoxManager.Entry entry) {
            DropBoxManagerService.this.add(entry);
        }

        @Override
        public boolean isTagEnabled(String tag) {
            return DropBoxManagerService.this.isTagEnabled(tag);
        }

        @Override
        public DropBoxManager.Entry getNextEntry(String tag, long millis) {
            return DropBoxManagerService.this.getNextEntry(tag, millis);
        }

        @Override
        public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            DropBoxManagerService.this.dump(fd, pw, args);
        }
    };

2.2 add流程

binder的add方法之后,会调用到DropBoxManagerService的add方法。

其核心实现逻辑就是add方法,add方法主要做了一下的工作:

1.把接收到的Entry内容写入到临时文件tmp中。

temp = new File(mDropBoxDir, "drop" + Thread.currentThread().getId() + ".tmp");

2.写入完成后,把tmp文件修改文件名,改成data_app_anr@111这样的文件名。

final File file = this.getFile(dir);
            if (!temp.renameTo(file)) {
                throw new IOException("Can't rename " + temp + " to " + file);
            }

3.切换成主线程,发送广播。

final Intent dropboxIntent = new Intent(DropBoxManager.ACTION_DROPBOX_ENTRY_ADDED);
            dropboxIntent.putExtra(DropBoxManager.EXTRA_TAG, tag);
            dropboxIntent.putExtra(DropBoxManager.EXTRA_TIME, time);
            if (!mBooted) {
                dropboxIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
            }
            // Call sendBroadcast after returning from this call to avoid deadlock. In particular
            // the caller may be holding the WindowManagerService lock but sendBroadcast requires a
            // lock in ActivityManagerService. ActivityManagerService has been caught holding that
            // very lock while waiting for the WindowManagerService lock.
            mHandler.sendMessage(mHandler.obtainMessage(MSG_SEND_BROADCAST, dropboxIntent));

三.DropBox妙用

既然在系统发现异常后,会主动把对应的记录文件进行记录,那么,我们是不是可以利用dropbox,针对系统中所有的APP应用进行一个切面编程,捕获所有的异常进行上报。这样就不需要每个应用单独去接入注入bugly一类的框架了,而且由于少了bugly的影响,性能,稳定性会更好。

实现对dropbox的切面编程,主要有以下三个方案:

方案一:监听dropbox文件夹变化

利用FileObserver对data/system/dropbox文件夹进行修改监听,bugly其实也是用的这个原理,6.0以上会因为SELinux的权限失效。所以要对SELinux的文件夹进行配置。

方案二:修改系统源码进行binder通讯

修改系统AMS中的源码,APP进行binder的注册。在发现崩溃或者ANR的之后,利用APP注册的binder,通知APP一侧。

方案三:利用广播进行通知

上面介绍,保存完成后,回发送一个广播。那么我们在APP侧监听这个广播,就可以知道什么时候出现了异常。

具体的实现和结果,我们下一章APM框架再来细细讲解。

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

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

相关文章

Dubbo 1 分布式系统中的相关概念 1.3 架构演进

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 1 分布式系统中的相关概念 文章目录Dubbo1 分布式系统中的相关概念1.3 架构演进1.3.1 架构演进1.3.2 架构演进 - 单体架构1.3.3 架构演进 - 垂直架构1.3.4 架构演进 - 分布式架构1.3.5 架构演进 - SOA…

SPDK块设备

SPDK视角每个App由多个子系统(subsystem)构成,同时每个子系统又包含多个模块(module),子系统和模块的注入都是可插拔的,通过相关的宏定义声明集成到SPDK组件容器里(其中子系统的注入可通过声明SPDK_SUBSYSTEM_REGISTER,块设备模块…

5G小基站行业市场空间将持续释放 2024年或将迎来建设高峰期

5G小基站行业上游包括硬件资源供应商、软件资源供应商、配套资源供应商;中游主体包括5G小基站设备厂商、5G小基站解决方案服务商;下游则主要是大型写字楼、购物中心、机场等。 数据来源:中国5G小基站市场发展趋势分析与未来前景研究报告&…

弥漫的烟圈-Abaqus涡环仿真与空气大炮

今天简单地讨论一下这个有趣的流体现象-烟圈,并使用Abaqus欧拉分析对它的形成过程进行仿真,揭示其中的力学奥秘。 烟圈 喷气圈的海豚 在流体力学里面,烟圈和水下气圈有个共同的名字,叫做Vortex Ring,即涡环或环形涡流…

腾讯云服务器选购新手教程(新版流程超级详细)

腾讯云服务器选购新手教程(新版流程超级详细),来详细说下腾讯云服务器购买流程图文详解及购买渠道说明。 腾讯云服务器购买流程 购买腾讯云服务器很简单,首先你需要注册一个腾讯云账号,使用微信或QQ注册即可,很简单。账号注册后&…

git clone 拉取远程仓库

1. git clone 拉取仓库 2. 以 HTTPS 方式拉取仓库 3. 以 SSH 方式拉取仓库 1. git clone 拉取仓库 拉取远程库的默认分支 git clone <repositories> 拉取远程库的指定分支 -b, --branch git clone -b <branch> <repositories> 将远程库拉取到指定目录 git c…

产品销量一直上不去,怎么办,试试这种模式?

裂变营销的本质是以存量带增量&#xff0c;让已有消费者帮你寻找潜在消费者&#xff0c;从而达到快速获客的目的。这种方法成本低、影响持久、效率高&#xff0c;已经成为传统企业转型不可或缺的重要战略&#xff1b;时至今日&#xff0c;许多传统企业&#xff0c;在引流方面碰…

【图像去噪】PM模型图像降噪【含Matlab源码 2107期】

⛄一、PM模型图像降噪简介 为了提高去除噪声和保留细节信息的算法的性能,Peroha等提出以热学中扩散方程式为基础的扩散算法即为PM模型。该模型主要是在经典各向异性扩散方dgi,j,t/dtdiv(d∇g)上提出将其中的扩散系数d用函数控制的扩散系数替代。PM模型为 其中,f(|∇gi,j,t|)是…

ISO 15765-2协议分享(三)—寻址方式详解

文章目录 前言一、Normal addressing二、Extended addressing三、Mixed addressing总结前言 2021年下半年的第一天,愿大家都安好。 对于自己的未来,做一个规划,不要让自己每天沉溺于肤浅信息带来的感官愉悦。 喜欢《沉思录》中一句话: 要学会深思,洞察事物之间的相互转…

轻量级聊天应用VoceChat

本文是应网友 猪猪侠的要求折腾的&#xff1b; 什么是 VoceChat &#xff1f; VoceChat 是一款支持独立部署的个人云社交媒体聊天服务。15MB 的大小可部署在任何的服务器上&#xff0c;部署简单&#xff0c;很少需要维护。前端可以内嵌到自己的网站下&#xff0c;数据完全由用户…

探花交友_第8章_搜附近(新版)

探花交友_第8章_搜附近(新版) 文章目录探花交友_第8章_搜附近(新版)1.1 需求分析需求说明数据库表1.2 探花推荐列表查询接口文档tanhua-modeltanhua-app-server**TanHuaController**TanHuaService配置文件tanhua-dubbo-interfacetanhua-dubbo-mongo1.3 左滑右滑接口文档tanhua-…

2022-前端实现电子签名(web、移动端)通用组件

前端实现电子签名&#xff08;web、移动端&#xff09;通用组件 前言 在现在的时代发展中&#xff0c;从以前的手写签名&#xff0c;逐渐衍生出了电子签名。电子签名和纸质手写签名一样具有法律效应。电子签名目前主要还是在需要个人确认的产品环节和司法类相关的产品上较多。…

可视化大数据分析系统

可视化大数据分析系统有很多&#xff0c;如果系统级都是收费的&#xff0c;如果大家想要了解可视化大数据分析系统&#xff0c;私信我就行。下面聊下5个常用的大数据可视化分析工具。 1、FineReport FineReport是一款纯Java编写的、集数据展示(报表)和数据录入(表单)功能于一…

Linux环境变量配置

在自定义安装软件的时候&#xff0c;经常需要配置环境变量&#xff0c;下面列举出各种对环境变量的配置方法。 下面所有例子的环境说明如下&#xff1a; 系统&#xff1a;Ubuntu 14.0 用户名&#xff1a;uusama 需要配置MySQL环境变量路径&#xff1a;/home/uusama/mysql/bi…

Servlet转发与重定向

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

【设计模式】代理模式——静态动态代理

【设计模式】代理模式——静态&动态代理 文章目录【设计模式】代理模式——静态&动态代理一&#xff1a;代理模式概述二&#xff1a;代理模式结构三&#xff1a;静态代理四&#xff1a;JDK动态代理1&#xff1a;简介2&#xff1a;步骤五&#xff1a;CGLIB动态代理六&am…

Python -- 元组、字典、集合

目录 1.元组的使用 1.1 访问元组 1.2 修改元组 1.3 count,index 1.4 定义只有一个数据的元组 2.字典的基本使用 2.1 字典的增删改查 2.2 字典的遍历 3.集合的使用 4.通用方法 1.元组的使用 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使…

测试人必备的Linux常用命令大全...【全网最全面整理】

Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是很多人喜欢linux的原因&#xff0c…

基于BP神经网络的数字识别系统仿真,带GUI界面

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 OCR&#xff08;Optical Character Recognition&#xff09;即光学字符识别技术&#xff0c;是通过扫描仪把印刷体或手写体文稿扫描成图像&#xff0c;然后识别成相应的计算机可直接处理的字符。…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与…