Migrate pullDiskStats and pullDirectoryUsage
Test: atest DiskStatsProtoTest Test: adb shell cmd stats pull-source 10025 Test: adb shell cmd stats pull-source 10026 Change-Id: Ia7c63e5d475d4d84da4fff74cda7745ff07cec31
This commit is contained in:
@@ -722,86 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
|
||||
pulledData.add(e);
|
||||
}
|
||||
|
||||
private void pullDiskStats(int tagId, long elapsedNanos, long wallClockNanos,
|
||||
List<StatsLogEventWrapper> 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<StatsLogEventWrapper> 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<StatsLogEventWrapper> 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;
|
||||
|
||||
@@ -95,14 +95,6 @@ std::map<PullerKey, PullAtomInfo> 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)}},
|
||||
|
||||
@@ -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<StatsEvent> 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<StatsEvent> 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() {
|
||||
|
||||
Reference in New Issue
Block a user