Android系统服务DropBoxManagerService详解与实践应用


Android系统服务DropBoxManagerService详解与实践应用

文章插图
 
一、背景随着公司应用的逐渐增多,需要集中收集公司部分应用线上运行的一些崩溃数据和日志来进行分析处理,在此实践过程中了解到系统data/system/dropbox目录会生成所有应用的相关日志文件 。
这个目录是由Android系统服务之一DropBoxManagerService来管理,所以由此详细阅读了DropBoxManagerService相关的源码,以下简称DBMS 。
DBMS可能是Android系统服务源码较少的一个,所以阅读起来相对比较简单,阅读之后发现,其实这就是一个简易的日志文件管理服务 。
我们在对应用本地的部分日志文件进行记录和管理的时候,恰巧可以借鉴DBMS源码对于文件管理的设计方案 。
假设不读源码,如果我们自己设计日志文件管理系统,应该需要考虑哪些?
除了最基础的获取各类日志文件的方案,我们针对文件管理可以提出几个需要考虑的点:
  1. 存取日志采用何种策略
  2. 设计哪些防呆策略
  3. 是否需要对外提供接口,提供哪些接口
  4. 如何保证性能
  5. 多进程的问题如何解决
  6. 文件丢失该如何处理
  7. 文件变化如何通知使用方
我们带着以上问题来对DBMS进行一个了解
二、DropBoxManagerService简介DropBoxManagerService是Android系统的服务之一,采用C/S结构:
  • Client端:DropboxManager,用于对应用层提供接口 。
  • Server端:DropBoxManagerService,管理系统目录(data/system/dropbox)的系统服务 。
  • 系统Setting数据库:负责管理DBMS的一些配置信息 。
整体架构关系如下图所示:
Android系统服务DropBoxManagerService详解与实践应用

文章插图
2.1 DropBox目录简介这个目录的目录结构如下图所示:
Android系统服务DropBoxManagerService详解与实践应用

文章插图
里面存放的都是系统的一些日志文件,针对不同类型的文件,文件名称和后缀也有所不同 。
2.1.1 文件格式
tag@timeStampMillis.extentions
  • tag:代表日志类型,常见的tag:data_App_anr,system_app_crash,data_app_nativecrash,其中data_app表示普通应用,system_app表示系统应用
  • timeStampMillis:日志的时间戳,一般情况下等于崩溃的时间,有些情况下系统会做一些调整
  • extentions:后缀名,常见的文件后缀名:.txt,.lost,.txt.gz,.tmp,一般的日志文件都是.txt或者.txt.gz,文件被删除后的记录会以.lost命名
这种文件命名方式优点是可以一眼看出这是什么类型的文件 。
2.1.2 常见的文件
  1. JE文件:
    data_app_crash@175423252525.txt.gz
  2. NE文件:
    data_app_native_crash@123478923458923.txt.gz
  3. ANR文件:
    data_app_anr@175423252525.txt.gz
还包括一些系统其它的错误日志,内存,重启相关的等等 。
2.2 提供的接口2.2.1 添加文件
addData/addFile/addEntry
2.2.2 获取文件
getNextEntry,根据tag和时间戳来获取想要的文件 。
2.2.3 dump目录信息
获取DropBox目录的一些信息:文件个数,文件列表,文件详细信息等,可以通过命令行操作(dumpsys dropbox) 。
$ dumpsys dropboxDrop box contents: 131 entriesMax entries: 1000// 以下省略......2.2.4 其它CMD命令
提供其他一些CMD操作的命令,如set-rate-limit,add-low-priority等等 。
2.3 目录管控配置2.3.1 默认基础配置及文件清除策略
这些配置存在系统的setting数据库里面,可以通过settings.global来访问配置 。
文件存储的配置主要包括以下几个维度:
  1. 文件存活时长(默认3天);
  2. 最大存储文件数量(默认1000个);
  3. 低内存情况下最大文件数量(默认300个);
  4. DropBox目录所能使用的空间(默认10MB);
  5. DropBox目录最多占可用存储(可用存储=系统可用存储-系统总存储*预留比例)的比例(10%);


    推荐阅读