diff --git a/core/proto/android/service/diskstats.proto b/core/proto/android/service/diskstats.proto index f725e8a8c7dab..3c7a0e3ba4754 100644 --- a/core/proto/android/service/diskstats.proto +++ b/core/proto/android/service/diskstats.proto @@ -43,6 +43,8 @@ message DiskStatsServiceDumpProto { optional EncryptionType encryption = 5; // Cached values of folder sizes, etc. optional DiskStatsCachedValuesProto cached_folder_sizes = 6; + // Average write speed of storaged benchmark for last 24 hours + optional int32 benchmarked_write_speed_kbps = 7; } message DiskStatsCachedValuesProto { diff --git a/services/core/java/com/android/server/DiskStatsService.java b/services/core/java/com/android/server/DiskStatsService.java index 2d2c6b0bc8b3e..e884de00c15ab 100644 --- a/services/core/java/com/android/server/DiskStatsService.java +++ b/services/core/java/com/android/server/DiskStatsService.java @@ -19,6 +19,10 @@ package com.android.server; import android.content.Context; import android.os.Binder; import android.os.Environment; +import android.os.IBinder; +import android.os.IStoraged; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.StatFs; import android.os.SystemClock; import android.os.storage.StorageManager; @@ -109,6 +113,12 @@ public class DiskStatsService extends Binder { } } + if (protoFormat) { + reportDiskWriteSpeedProto(proto); + } else { + reportDiskWriteSpeed(pw); + } + reportFreeSpace(Environment.getDataDirectory(), "Data", pw, proto, DiskStatsFreeSpaceProto.FOLDER_DATA); reportFreeSpace(Environment.getDownloadCacheDirectory(), "Cache", pw, proto, @@ -285,4 +295,41 @@ public class DiskStatsService extends Binder { Log.w(TAG, "exception reading diskstats cache file", e); } } + + private int getRecentPerf() throws RemoteException, IllegalStateException { + IBinder binder = ServiceManager.getService("storaged"); + if (binder == null) throw new IllegalStateException("storaged not found"); + IStoraged storaged = IStoraged.Stub.asInterface(binder); + return storaged.getRecentPerf(); + } + + // Keep reportDiskWriteSpeed and reportDiskWriteSpeedProto in sync + private void reportDiskWriteSpeed(PrintWriter pw) { + try { + long perf = getRecentPerf(); + if (perf != 0) { + pw.print("Recent Disk Write Speed (kB/s) = "); + pw.println(perf); + } else { + pw.println("Recent Disk Write Speed data unavailable"); + Log.w(TAG, "Recent Disk Write Speed data unavailable!"); + } + } catch (RemoteException | IllegalStateException e) { + pw.println(e.toString()); + Log.e(TAG, e.toString()); + } + } + + private void reportDiskWriteSpeedProto(ProtoOutputStream proto) { + try { + long perf = getRecentPerf(); + if (perf != 0) { + proto.write(DiskStatsServiceDumpProto.BENCHMARKED_WRITE_SPEED_KBPS, perf); + } else { + Log.w(TAG, "Recent Disk Write Speed data unavailable!"); + } + } catch (RemoteException | IllegalStateException e) { + Log.e(TAG, e.toString()); + } + } }