前言
最近在翻代码的时候,偶然发现了systemserver中的一个小服务DiskStatsService,今天记录一下它的作用和功能,本文代码基于Android V(15)分析。
介绍
启动
在systemserver startOtherServices函数中启动:
t.traceBegin("StartDiskStatsService");
try {
ServiceManager.addService("diskstats", new DiskStatsService(context));
} catch (Throwable e) {
reportWtf("starting DiskStats Service", e);
}
t.traceEnd();
DiskStatsService 对象初始化的时候主要是注册了一个JobScheduler,触发条件是device Idle、充电状态、周期为1天:
public static void schedule(Context context) {
JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
js.schedule(new JobInfo.Builder(JOB_DISKSTATS_LOGGING, sDiskStatsLoggingService)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.setPeriodic(TimeUnit.DAYS.toMillis(1))
.build());
}
我们通过adb shell 命令强制触发job执行,注释掉onStartJob函数入口的判断,单步调试模拟器,整理流程图如下
adb shell cmd jobscheduler run -f android 1145656139
public boolean onStartJob(JobParameters params) {
// We need to check the preconditions again because they may not be enforced for
// subsequent runs.
/*if (!isCharging(this) || !isDumpsysTaskEnabled(getContentResolver())) {
jobFinished(params, true);
return false;
}*/
当job触发时,系统会将disk等相关信息写入到/data/system/diskstats_cache.json文件中,这其中包含的信息如下:
- SystemSize(sm.getPrimaryStorageSize() - sharedDataSize)
- 外部存储(externalStorage)中的imagesSize、videosSize、audioSize和miscSize
- downloadsSize (/storage/emulated/0/Download)大小
- 系统中安装的app的cacheSize、codeSize、dataSize
diskstats_cache.json 文件格式如下:
dumpsys 功能
既然是系统服务,就有dump功能,我们先dumpsys 一下看看
adb shell dumpsys diskstats
Latency: 0ms [512B Data Write]
Recent Disk Write Speed (kB/s) = 48442
Data-Free: 9592256K / 10167132K total = 94% free
Cache-Free: 9592256K / 10167132K total = 94% free
System-Free: 49192K / 856456K total = 5% free
Metadata-Free: 9952K / 11248K total = 88% free
File-based Encryption: true
App Size: 13975552
App Data Size: 26190623
App Cache Size: 14880768
Photos Size: 0
Videos Size: 0
Audio Size: 0
Downloads Size: 0
System Size: 16000000000
Other Size: 49152
总结一下dumpsys 中的功能:
- 测试一下写入512B的耗时,写入的目录是data分区:Latency: 0ms [512B Data Write]
- 打印最近一次Disk的写入速度:Recent Disk Write Speed (kB/s) = 48442
- 打印Data、Cache、System、Metadata区分的使用情况
- 打印FBE是否enable:File-based Encryption: true
- 读取/data/system/diskstats_cache.json中的信息,并打印,比如App Size、App Data Size等
总结
Android 系统服务DiskStatsService主要用于 收集、管理和报告设备存储的详细使用情况,通过jobscheduler调度保存信息到json文件中,也可以通过dumpsys命令查看存储使用等信息。