diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 4390209b268f4..c39e63a80900a 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,86 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullDiskStats(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - // Run a quick-and-dirty performance test: write 512 bytes - byte[] junk = new byte[512]; - for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes - - File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp"); - FileOutputStream fos = null; - IOException error = null; - - long before = SystemClock.elapsedRealtime(); - try { - fos = new FileOutputStream(tmp); - fos.write(junk); - } catch (IOException e) { - error = e; - } finally { - try { - if (fos != null) fos.close(); - } catch (IOException e) { - // Do nothing. - } - } - - long latency = SystemClock.elapsedRealtime() - before; - if (tmp.exists()) tmp.delete(); - - if (error != null) { - Slog.e(TAG, "Error performing diskstats latency test"); - latency = -1; - } - // File based encryption. - boolean fileBased = StorageManager.isFileEncryptedNativeOnly(); - - //Recent disk write speed. Binder call to storaged. - int writeSpeed = -1; - try { - IBinder binder = ServiceManager.getService("storaged"); - if (binder == null) { - Slog.e(TAG, "storaged not found"); - } - IStoraged storaged = IStoraged.Stub.asInterface(binder); - writeSpeed = storaged.getRecentPerf(); - } catch (RemoteException e) { - Slog.e(TAG, "storaged not found"); - } - - // Add info pulledData. - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeLong(latency); - e.writeBoolean(fileBased); - e.writeInt(writeSpeed); - pulledData.add(e); - } - - private void pullDirectoryUsage(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath()); - StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath()); - StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath()); - - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA); - e.writeLong(statFsData.getAvailableBytes()); - e.writeLong(statFsData.getTotalBytes()); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE); - e.writeLong(statFsCache.getAvailableBytes()); - e.writeLong(statFsCache.getTotalBytes()); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM); - e.writeLong(statFsSystem.getAvailableBytes()); - e.writeLong(statFsSystem.getTotalBytes()); - pulledData.add(e); - } - private void pullAppSize(int tagId, long elapsedNanos, long wallClockNanos, List pulledData) { try { @@ -1549,16 +1469,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.DISK_STATS: { - pullDiskStats(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - - case StatsLog.DIRECTORY_USAGE: { - pullDirectoryUsage(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.APP_SIZE: { pullAppSize(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 82d4a300499af..663e17ef9ed94 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,14 +95,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, - // Disk Stats - {{.atomTag = android::util::DISK_STATS}, - {.puller = new StatsCompanionServicePuller(android::util::DISK_STATS)}}, - - // Directory usage - {{.atomTag = android::util::DIRECTORY_USAGE}, - {.puller = new StatsCompanionServicePuller(android::util::DIRECTORY_USAGE)}}, - // Size of app's code, data, and cache {{.atomTag = android::util::APP_SIZE}, {.puller = new StatsCompanionServicePuller(android::util::APP_SIZE)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index c79f49e060a63..10b48c5d6a635 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -198,6 +198,9 @@ public class StatsPullAtomService extends SystemService { private final Object mThermalLock = new Object(); @GuardedBy("mThermalLock") private IThermalService mThermalService; + private final Object mStoragedLock = new Object(); + @GuardedBy("mStoragedLock") + private IStoraged mStorageService; private final Context mContext; private StatsManager mStatsManager; @@ -346,6 +349,29 @@ public class StatsPullAtomService extends SystemService { return mThermalService; } } + + private IStoraged getIStoragedService() { + synchronized (mStoragedLock) { + if (mStorageService == null) { + mStorageService = IStoraged.Stub.asInterface( + ServiceManager.getService("storaged")); + } + if (mStorageService != null) { + try { + mStorageService.asBinder().linkToDeath(() -> { + synchronized (mStoragedLock) { + mStorageService = null; + } + }, /* flags */ 0); + } catch (RemoteException e) { + Slog.e(TAG, "linkToDeath with storagedService failed", e); + mStorageService = null; + } + } + } + return mStorageService; + } + private void registerWifiBytesTransfer() { int tagId = StatsLog.WIFI_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() @@ -1471,19 +1497,110 @@ public class StatsPullAtomService extends SystemService { } private void registerDiskStats() { - // No op. + int tagId = StatsLog.DISK_STATS; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDiskStats(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDiskStats() { - // No op. + private int pullDiskStats(int atomTag, List pulledData) { + // Run a quick-and-dirty performance test: write 512 bytes + byte[] junk = new byte[512]; + for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes + + File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp"); + FileOutputStream fos = null; + IOException error = null; + + long before = SystemClock.elapsedRealtime(); + try { + fos = new FileOutputStream(tmp); + fos.write(junk); + } catch (IOException e) { + error = e; + } finally { + try { + if (fos != null) fos.close(); + } catch (IOException e) { + // Do nothing. + } + } + + long latency = SystemClock.elapsedRealtime() - before; + if (tmp.exists()) tmp.delete(); + + if (error != null) { + Slog.e(TAG, "Error performing diskstats latency test"); + latency = -1; + } + // File based encryption. + boolean fileBased = StorageManager.isFileEncryptedNativeOnly(); + + //Recent disk write speed. Binder call to storaged. + int writeSpeed = -1; + IStoraged storaged = getIStoragedService(); + if (storaged == null) { + return StatsManager.PULL_SKIP; + } + try { + writeSpeed = storaged.getRecentPerf(); + } catch (RemoteException e) { + Slog.e(TAG, "storaged not found"); + } + + // Add info pulledData. + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeLong(latency) + .writeBoolean(fileBased) + .writeInt(writeSpeed) + .build(); + pulledData.add(e); + return StatsManager.PULL_SUCCESS; } private void registerDirectoryUsage() { - // No op. + int tagId = StatsLog.DIRECTORY_USAGE; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDirectoryUsage(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDirectoryUsage() { - // No op. + private int pullDirectoryUsage(int atomTag, List pulledData) { + StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath()); + StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath()); + StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath()); + + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA) + .writeLong(statFsData.getAvailableBytes()) + .writeLong(statFsData.getTotalBytes()) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE) + .writeLong(statFsCache.getAvailableBytes()) + .writeLong(statFsCache.getTotalBytes()) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM) + .writeLong(statFsSystem.getAvailableBytes()) + .writeLong(statFsSystem.getTotalBytes()) + .build(); + pulledData.add(e); + return StatsManager.PULL_SUCCESS; } private void registerAppSize() {