DiskStatsService-基于Android V(15)

141 阅读2分钟

前言

最近在翻代码的时候,偶然发现了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;
        }*/

diskstats.png 当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 文件格式如下:

截图 2025-05-26 15-36-49.png

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 中的功能:

  1. 测试一下写入512B的耗时,写入的目录是data分区:Latency: 0ms [512B Data Write]
  2. 打印最近一次Disk的写入速度:Recent Disk Write Speed (kB/s) = 48442
  3. 打印Data、Cache、System、Metadata区分的使用情况
  4. 打印FBE是否enable:File-based Encryption: true
  5. 读取/data/system/diskstats_cache.json中的信息,并打印,比如App Size、App Data Size等

总结

Android 系统服务DiskStatsService主要用于 ​​收集、管理和报告设备存储的详细使用情况,通过jobscheduler调度保存信息到json文件中,也可以通过dumpsys命令查看存储使用等信息​​。