diff options
3 files changed, 897 insertions, 34 deletions
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 a9081786866c..0f981e25b37a 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -815,31 +815,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullWifiBytesTransfer( - int tagId, long elapsedNanos, long wallClockNanos, - List<StatsLogEventWrapper> pulledData) { - long token = Binder.clearCallingIdentity(); - try { - // TODO: Consider caching the following call to get BatteryStatsInternal. - BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); - String[] ifaces = bs.getWifiIfaces(); - if (ifaces.length == 0) { - return; - } - if (mNetworkStatsService == null) { - Slog.e(TAG, "NetworkStats Service is not available!"); - return; - } - // Combine all the metrics per Uid into one record. - NetworkStats stats = mNetworkStatsService.getDetailedUidStats(ifaces).groupedByUid(); - addNetworkStats(tagId, pulledData, stats, false); - } catch (RemoteException e) { - Slog.e(TAG, "Pulling netstats for wifi bytes has error", e); - } finally { - Binder.restoreCallingIdentity(token); - } - } - private void pullWifiBytesTransferByFgBg( int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { @@ -2316,149 +2291,180 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { long elapsedNanos = SystemClock.elapsedRealtimeNanos(); long wallClockNanos = SystemClock.currentTimeMicro() * 1000L; switch (tagId) { - case StatsLog.WIFI_BYTES_TRANSFER: { - pullWifiBytesTransfer(tagId, elapsedNanos, wallClockNanos, ret); - break; - } + case StatsLog.MOBILE_BYTES_TRANSFER: { pullMobileBytesTransfer(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG: { pullWifiBytesTransferByFgBg(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: { pullMobileBytesTransferByFgBg(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.BLUETOOTH_BYTES_TRANSFER: { pullBluetoothBytesTransfer(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.KERNEL_WAKELOCK: { pullKernelWakelock(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.CPU_TIME_PER_FREQ: { pullCpuTimePerFreq(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.CPU_TIME_PER_UID: { pullKernelUidCpuTime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.CPU_TIME_PER_UID_FREQ: { pullKernelUidCpuFreqTime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.CPU_CLUSTER_TIME: { pullKernelUidCpuClusterTime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.CPU_ACTIVE_TIME: { pullKernelUidCpuActiveTime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.WIFI_ACTIVITY_INFO: { pullWifiActivityInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.MODEM_ACTIVITY_INFO: { pullModemActivityInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.BLUETOOTH_ACTIVITY_INFO: { pullBluetoothActivityInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.SYSTEM_UPTIME: { pullSystemUpTime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.SYSTEM_ELAPSED_REALTIME: { pullSystemElapsedRealtime(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_MEMORY_STATE: { pullProcessMemoryState(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_MEMORY_HIGH_WATER_MARK: { pullProcessMemoryHighWaterMark(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_MEMORY_SNAPSHOT: { pullProcessMemorySnapshot(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.SYSTEM_ION_HEAP_SIZE: { pullSystemIonHeapSize(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE: { pullProcessSystemIonHeapSize(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.BINDER_CALLS: { pullBinderCallsStats(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.BINDER_CALLS_EXCEPTIONS: { pullBinderCallsStatsExceptions(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.LOOPER_STATS: { pullLooperStats(tagId, elapsedNanos, wallClockNanos, ret); 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; } + case StatsLog.CATEGORY_SIZE: { pullCategorySize(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.NUM_FINGERPRINTS_ENROLLED: { pullNumBiometricsEnrolled(BiometricsProtoEnums.MODALITY_FINGERPRINT, tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.NUM_FACES_ENROLLED: { pullNumBiometricsEnrolled(BiometricsProtoEnums.MODALITY_FACE, tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROC_STATS: { pullProcessStats(ProcessStats.REPORT_ALL, tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROC_STATS_PKG_PROC: { pullProcessStats(ProcessStats.REPORT_PKG_PROC_STATS, tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DISK_IO: { pullDiskIo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.POWER_PROFILE: { pullPowerProfile(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.BUILD_INFORMATION: { pullBuildInformation(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_CPU_TIME: { pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); break; @@ -2467,73 +2473,90 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullCpuTimePerThreadFreq(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DEVICE_CALCULATED_POWER_USE: { pullDeviceCalculatedPowerUse(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DEVICE_CALCULATED_POWER_BLAME_UID: { pullDeviceCalculatedPowerBlameUid(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER: { pullDeviceCalculatedPowerBlameOther(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.TEMPERATURE: { pullTemperature(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.COOLING_DEVICE: { pullCoolingDevices(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DEBUG_ELAPSED_CLOCK: { pullDebugElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DEBUG_FAILING_ELAPSED_CLOCK: { pullDebugFailingElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.ROLE_HOLDER: { pullRoleHolders(elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DANGEROUS_PERMISSION_STATE: { pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED: { pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.TIME_ZONE_DATA_INFO: { pullTimeZoneDataInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.EXTERNAL_STORAGE_INFO: { pullExternalStorageInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.APPS_ON_EXTERNAL_STORAGE_INFO: { pullAppsOnExternalStorageInfo(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.FACE_SETTINGS: { pullFaceSettings(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.APP_OPS: { pullAppOps(elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.NOTIFICATION_REMOTE_VIEWS: { pullNotificationStats(NotificationManagerService.REPORT_REMOTE_VIEWS, tagId, elapsedNanos, wallClockNanos, ret); break; } + default: Slog.w(TAG, "No such tagId data as " + tagId); return null; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 1d31873209b2..b5680331f63e 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -59,161 +59,200 @@ namespace statsd { const int64_t NO_ALARM_UPDATE = INT64_MAX; std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { - // wifi_bytes_transfer - {{.atomTag = android::util::WIFI_BYTES_TRANSFER}, - {.additiveFields = {2, 3, 4, 5}, - .puller = new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER)}}, + // wifi_bytes_transfer_by_fg_bg {{.atomTag = android::util::WIFI_BYTES_TRANSFER_BY_FG_BG}, {.additiveFields = {3, 4, 5, 6}, .puller = new StatsCompanionServicePuller(android::util::WIFI_BYTES_TRANSFER_BY_FG_BG)}}, + // mobile_bytes_transfer {{.atomTag = android::util::MOBILE_BYTES_TRANSFER}, {.additiveFields = {2, 3, 4, 5}, .puller = new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER)}}, + // mobile_bytes_transfer_by_fg_bg {{.atomTag = android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG}, {.additiveFields = {3, 4, 5, 6}, .puller = new StatsCompanionServicePuller(android::util::MOBILE_BYTES_TRANSFER_BY_FG_BG)}}, + // bluetooth_bytes_transfer {{.atomTag = android::util::BLUETOOTH_BYTES_TRANSFER}, {.additiveFields = {2, 3}, .puller = new StatsCompanionServicePuller(android::util::BLUETOOTH_BYTES_TRANSFER)}}, + // kernel_wakelock {{.atomTag = android::util::KERNEL_WAKELOCK}, {.puller = new StatsCompanionServicePuller(android::util::KERNEL_WAKELOCK)}}, + // subsystem_sleep_state {{.atomTag = android::util::SUBSYSTEM_SLEEP_STATE}, {.puller = new SubsystemSleepStatePuller()}}, + // on_device_power_measurement {{.atomTag = android::util::ON_DEVICE_POWER_MEASUREMENT}, {.puller = new PowerStatsPuller()}}, + // cpu_time_per_freq {{.atomTag = android::util::CPU_TIME_PER_FREQ}, {.additiveFields = {3}, .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_FREQ)}}, + // cpu_time_per_uid {{.atomTag = android::util::CPU_TIME_PER_UID}, {.additiveFields = {2, 3}, .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID)}}, + // cpu_time_per_uid_freq // the throttling is 3sec, handled in // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader {{.atomTag = android::util::CPU_TIME_PER_UID_FREQ}, {.additiveFields = {4}, .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_UID_FREQ)}}, + // cpu_active_time // the throttling is 3sec, handled in // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader {{.atomTag = android::util::CPU_ACTIVE_TIME}, {.additiveFields = {2}, .puller = new StatsCompanionServicePuller(android::util::CPU_ACTIVE_TIME)}}, + // cpu_cluster_time // the throttling is 3sec, handled in // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader {{.atomTag = android::util::CPU_CLUSTER_TIME}, {.additiveFields = {3}, .puller = new StatsCompanionServicePuller(android::util::CPU_CLUSTER_TIME)}}, + // wifi_activity_energy_info {{.atomTag = android::util::WIFI_ACTIVITY_INFO}, {.puller = new StatsCompanionServicePuller(android::util::WIFI_ACTIVITY_INFO)}}, + // modem_activity_info {{.atomTag = android::util::MODEM_ACTIVITY_INFO}, {.puller = new StatsCompanionServicePuller(android::util::MODEM_ACTIVITY_INFO)}}, + // bluetooth_activity_info {{.atomTag = android::util::BLUETOOTH_ACTIVITY_INFO}, {.puller = new StatsCompanionServicePuller(android::util::BLUETOOTH_ACTIVITY_INFO)}}, + // system_elapsed_realtime {{.atomTag = android::util::SYSTEM_ELAPSED_REALTIME}, {.coolDownNs = NS_PER_SEC, .puller = new StatsCompanionServicePuller(android::util::SYSTEM_ELAPSED_REALTIME), .pullTimeoutNs = NS_PER_SEC / 2, }}, + // system_uptime {{.atomTag = android::util::SYSTEM_UPTIME}, {.puller = new StatsCompanionServicePuller(android::util::SYSTEM_UPTIME)}}, + // remaining_battery_capacity {{.atomTag = android::util::REMAINING_BATTERY_CAPACITY}, {.puller = new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}}, + // full_battery_capacity {{.atomTag = android::util::FULL_BATTERY_CAPACITY}, {.puller = new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}}, + // battery_voltage {{.atomTag = android::util::BATTERY_VOLTAGE}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_VOLTAGE)}}, + // battery_level {{.atomTag = android::util::BATTERY_LEVEL}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_LEVEL)}}, + // battery_cycle_count {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, + // process_memory_state {{.atomTag = android::util::PROCESS_MEMORY_STATE}, {.additiveFields = {4, 5, 6, 7, 8}, .puller = new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}}, + // process_memory_high_water_mark {{.atomTag = android::util::PROCESS_MEMORY_HIGH_WATER_MARK}, {.puller = new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_HIGH_WATER_MARK)}}, + // process_memory_snapshot {{.atomTag = android::util::PROCESS_MEMORY_SNAPSHOT}, {.puller = new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_SNAPSHOT)}}, + // system_ion_heap_size {{.atomTag = android::util::SYSTEM_ION_HEAP_SIZE}, {.puller = new StatsCompanionServicePuller(android::util::SYSTEM_ION_HEAP_SIZE)}}, + // process_system_ion_heap_size {{.atomTag = android::util::PROCESS_SYSTEM_ION_HEAP_SIZE}, {.puller = new StatsCompanionServicePuller(android::util::PROCESS_SYSTEM_ION_HEAP_SIZE)}}, + // temperature {{.atomTag = android::util::TEMPERATURE}, {.puller = new StatsCompanionServicePuller(android::util::TEMPERATURE)}}, + // cooling_device {{.atomTag = android::util::COOLING_DEVICE}, {.puller = new StatsCompanionServicePuller(android::util::COOLING_DEVICE)}}, + // binder_calls {{.atomTag = android::util::BINDER_CALLS}, {.additiveFields = {4, 5, 6, 8, 12}, .puller = new StatsCompanionServicePuller(android::util::BINDER_CALLS)}}, + // binder_calls_exceptions {{.atomTag = android::util::BINDER_CALLS_EXCEPTIONS}, {.puller = new StatsCompanionServicePuller(android::util::BINDER_CALLS_EXCEPTIONS)}}, + // looper_stats {{.atomTag = android::util::LOOPER_STATS}, {.additiveFields = {5, 6, 7, 8, 9}, .puller = new StatsCompanionServicePuller(android::util::LOOPER_STATS)}}, + // 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)}}, + // Size of specific categories of files. Eg. Music. {{.atomTag = android::util::CATEGORY_SIZE}, {.puller = new StatsCompanionServicePuller(android::util::CATEGORY_SIZE)}}, + // Number of fingerprints enrolled for each user. {{.atomTag = android::util::NUM_FINGERPRINTS_ENROLLED}, {.puller = new StatsCompanionServicePuller(android::util::NUM_FINGERPRINTS_ENROLLED)}}, + // Number of faces enrolled for each user. {{.atomTag = android::util::NUM_FACES_ENROLLED}, {.puller = new StatsCompanionServicePuller(android::util::NUM_FACES_ENROLLED)}}, + // ProcStats. {{.atomTag = android::util::PROC_STATS}, {.puller = new StatsCompanionServicePuller(android::util::PROC_STATS)}}, + // ProcStatsPkgProc. {{.atomTag = android::util::PROC_STATS_PKG_PROC}, {.puller = new StatsCompanionServicePuller(android::util::PROC_STATS_PKG_PROC)}}, + // Disk I/O stats per uid. {{.atomTag = android::util::DISK_IO}, {.additiveFields = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, .coolDownNs = 3 * NS_PER_SEC, .puller = new StatsCompanionServicePuller(android::util::DISK_IO)}}, + // PowerProfile constants for power model calculations. {{.atomTag = android::util::POWER_PROFILE}, {.puller = new StatsCompanionServicePuller(android::util::POWER_PROFILE)}}, + // Process cpu stats. Min cool-down is 5 sec, inline with what AcitivityManagerService uses. {{.atomTag = android::util::PROCESS_CPU_TIME}, {.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/, @@ -221,64 +260,83 @@ std::map<PullerKey, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::CPU_TIME_PER_THREAD_FREQ}, {.additiveFields = {7, 9, 11, 13, 15, 17, 19, 21}, .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_THREAD_FREQ)}}, + // DeviceCalculatedPowerUse. {{.atomTag = android::util::DEVICE_CALCULATED_POWER_USE}, {.puller = new StatsCompanionServicePuller(android::util::DEVICE_CALCULATED_POWER_USE)}}, + // DeviceCalculatedPowerBlameUid. {{.atomTag = android::util::DEVICE_CALCULATED_POWER_BLAME_UID}, {.puller = new StatsCompanionServicePuller( android::util::DEVICE_CALCULATED_POWER_BLAME_UID)}}, + // DeviceCalculatedPowerBlameOther. {{.atomTag = android::util::DEVICE_CALCULATED_POWER_BLAME_OTHER}, {.puller = new StatsCompanionServicePuller( android::util::DEVICE_CALCULATED_POWER_BLAME_OTHER)}}, + // DebugElapsedClock. {{.atomTag = android::util::DEBUG_ELAPSED_CLOCK}, {.additiveFields = {1, 2, 3, 4}, .puller = new StatsCompanionServicePuller(android::util::DEBUG_ELAPSED_CLOCK)}}, + // DebugFailingElapsedClock. {{.atomTag = android::util::DEBUG_FAILING_ELAPSED_CLOCK}, {.additiveFields = {1, 2, 3, 4}, .puller = new StatsCompanionServicePuller(android::util::DEBUG_FAILING_ELAPSED_CLOCK)}}, + // BuildInformation. {{.atomTag = android::util::BUILD_INFORMATION}, {.puller = new StatsCompanionServicePuller(android::util::BUILD_INFORMATION)}}, + // RoleHolder. {{.atomTag = android::util::ROLE_HOLDER}, {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}}, + // PermissionState. {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE}, {.puller = new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE)}}, + // TrainInfo. {{.atomTag = android::util::TRAIN_INFO}, {.puller = new TrainInfoPuller()}}, + // TimeZoneDataInfo. {{.atomTag = android::util::TIME_ZONE_DATA_INFO}, {.puller = new StatsCompanionServicePuller(android::util::TIME_ZONE_DATA_INFO)}}, + // ExternalStorageInfo {{.atomTag = android::util::EXTERNAL_STORAGE_INFO}, {.puller = new StatsCompanionServicePuller(android::util::EXTERNAL_STORAGE_INFO)}}, + // GpuStatsGlobalInfo {{.atomTag = android::util::GPU_STATS_GLOBAL_INFO}, {.puller = new GpuStatsPuller(android::util::GPU_STATS_GLOBAL_INFO)}}, + // GpuStatsAppInfo {{.atomTag = android::util::GPU_STATS_APP_INFO}, {.puller = new GpuStatsPuller(android::util::GPU_STATS_APP_INFO)}}, + // AppsOnExternalStorageInfo {{.atomTag = android::util::APPS_ON_EXTERNAL_STORAGE_INFO}, {.puller = new StatsCompanionServicePuller(android::util::APPS_ON_EXTERNAL_STORAGE_INFO)}}, + // Face Settings {{.atomTag = android::util::FACE_SETTINGS}, {.puller = new StatsCompanionServicePuller(android::util::FACE_SETTINGS)}}, + // App ops {{.atomTag = android::util::APP_OPS}, {.puller = new StatsCompanionServicePuller(android::util::APP_OPS)}}, + // VmsClientStats {{.atomTag = android::util::VMS_CLIENT_STATS}, {.additiveFields = {5, 6, 7, 8, 9, 10}, .puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}}, + // NotiifcationRemoteViews. {{.atomTag = android::util::NOTIFICATION_REMOTE_VIEWS}, {.puller = new StatsCompanionServicePuller(android::util::NOTIFICATION_REMOTE_VIEWS)}}, + // PermissionStateSampled. {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE_SAMPLED}, {.puller = diff --git a/services/core/java/com/android/server/stats/StatsPullAtomService.java b/services/core/java/com/android/server/stats/StatsPullAtomService.java index e367f284b39a..a75f1c210bc0 100644 --- a/services/core/java/com/android/server/stats/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/StatsPullAtomService.java @@ -16,11 +16,166 @@ package com.android.server.stats; +import static android.app.AppOpsManager.OP_FLAGS_ALL_TRUSTED; +import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; +import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; +import static android.os.Process.THREAD_PRIORITY_BACKGROUND; +import static android.os.Process.getUidForPid; +import static android.os.storage.VolumeInfo.TYPE_PRIVATE; +import static android.os.storage.VolumeInfo.TYPE_PUBLIC; + +import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem; +import static com.android.server.stats.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs; +import static com.android.server.stats.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs; +import static com.android.server.stats.ProcfsMemoryUtil.forEachPid; +import static com.android.server.stats.ProcfsMemoryUtil.readCmdlineFromProcfs; +import static com.android.server.stats.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.ActivityManagerInternal; +import android.app.AlarmManager; +import android.app.AlarmManager.OnAlarmListener; +import android.app.AppOpsManager; +import android.app.AppOpsManager.HistoricalOps; +import android.app.AppOpsManager.HistoricalOpsRequest; +import android.app.AppOpsManager.HistoricalPackageOps; +import android.app.AppOpsManager.HistoricalUidOps; +import android.app.INotificationManager; +import android.app.ProcessMemoryState; +import android.app.StatsManager; +import android.app.StatsManager.PullAtomMetadata; +import android.bluetooth.BluetoothActivityEnergyInfo; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.UidTraffic; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.content.pm.UserInfo; +import android.hardware.biometrics.BiometricsProtoEnums; +import android.hardware.face.FaceManager; +import android.hardware.fingerprint.FingerprintManager; +import android.net.ConnectivityManager; +import android.net.INetworkStatsService; +import android.net.Network; +import android.net.NetworkRequest; +import android.net.NetworkStats; +import android.net.wifi.WifiManager; +import android.os.BatteryStats; +import android.os.BatteryStatsInternal; +import android.os.Binder; +import android.os.Build; +import android.os.Bundle; +import android.os.CoolingDevice; +import android.os.Environment; +import android.os.FileUtils; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.IPullAtomCallback; +import android.os.IStatsCompanionService; +import android.os.IStatsd; +import android.os.IStoraged; +import android.os.IThermalEventListener; +import android.os.IThermalService; +import android.os.Looper; +import android.os.ParcelFileDescriptor; +import android.os.Parcelable; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.StatFs; +import android.os.StatsLogEventWrapper; +import android.os.SynchronousResultReceiver; +import android.os.SystemClock; +import android.os.SystemProperties; +import android.os.Temperature; +import android.os.UserHandle; +import android.os.UserManager; +import android.os.connectivity.WifiActivityEnergyInfo; +import android.os.storage.DiskInfo; +import android.os.storage.StorageManager; +import android.os.storage.VolumeInfo; +import android.provider.Settings; +import android.stats.storage.StorageEnums; +import android.telephony.ModemActivityInfo; +import android.telephony.TelephonyManager; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Log; import android.util.Slog; +import android.util.StatsEvent; +import android.util.StatsLog; +import android.util.proto.ProtoOutputStream; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.app.procstats.IProcessStats; +import com.android.internal.app.procstats.ProcessStats; import com.android.internal.os.BackgroundThread; +import com.android.internal.os.BatterySipper; +import com.android.internal.os.BatteryStatsHelper; +import com.android.internal.os.BinderCallsStats.ExportedCallStat; +import com.android.internal.os.KernelCpuSpeedReader; +import com.android.internal.os.KernelCpuThreadReader; +import com.android.internal.os.KernelCpuThreadReaderDiff; +import com.android.internal.os.KernelCpuThreadReaderSettingsObserver; +import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader; +import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader; +import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; +import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; +import com.android.internal.os.KernelWakelockReader; +import com.android.internal.os.KernelWakelockStats; +import com.android.internal.os.LooperStats; +import com.android.internal.os.PowerProfile; +import com.android.internal.os.ProcessCpuTracker; +import com.android.internal.os.StoragedUidIoStatsReader; +import com.android.internal.util.DumpUtils; +import com.android.server.BinderCallsStatsService; +import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.SystemServiceManager; +import com.android.server.am.MemoryStatUtil.MemoryStat; +import com.android.server.notification.NotificationManagerService; +import com.android.server.role.RoleManagerInternal; +import com.android.server.stats.IonMemoryUtil.IonAllocations; +import com.android.server.stats.ProcfsMemoryUtil.MemorySnapshot; +import com.android.server.storage.DiskStatsFileLogger; +import com.android.server.storage.DiskStatsLoggingService; + +import com.google.android.collect.Sets; + +import libcore.io.IoUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; /** * SystemService containing PullAtomCallbacks that are registered with statsd. @@ -31,13 +186,24 @@ public class StatsPullAtomService extends SystemService { private static final String TAG = "StatsPullAtomService"; private static final boolean DEBUG = true; + private final Object mNetworkStatsLock = new Object(); + @GuardedBy("mNetworkStatsLock") + private INetworkStatsService mNetworkStatsService; + private final Object mThermalLock = new Object(); + @GuardedBy("mThermalLock") + private IThermalService mThermalService; + + private final Context mContext; + private StatsManager mStatsManager; + public StatsPullAtomService(Context context) { super(context); + mContext = context; } @Override public void onStart() { - // No op. + mStatsManager = (StatsManager) mContext.getSystemService(Context.STATS_MANAGER); } @Override @@ -54,5 +220,621 @@ public class StatsPullAtomService extends SystemService { if (DEBUG) { Slog.d(TAG, "Registering all pullers with statsd"); } + registerWifiBytesTransfer(); + registerWifiBytesTransferBackground(); + registerMobileBytesTransfer(); + registerMobileBytesTransferBackground(); + registerBluetoothBytesTransfer(); + registerKernelWakelock(); + registerCpuTimePerFreq(); + registerCpuTimePerUid(); + registerCpuTimePerUidFreq(); + registerCpuActiveTime(); + registerCpuClusterTime(); + registerWifiActivityInfo(); + registerModemActivityInfo(); + registerBluetoothActivityInfo(); + registerSystemElapsedRealtime(); + registerSystemUptime(); + registerRemainingBatteryCapacity(); + registerFullBatteryCapacity(); + registerBatteryVoltage(); + registerBatteryLevel(); + registerBatteryCycleCount(); + registerProcessMemoryState(); + registerProcessMemoryHighWaterMark(); + registerProcessMemorySnapshot(); + registerSystemIonHeapSize(); + registerProcessSystemIonHeapSize(); + registerTemperature(); + registerCoolingDevice(); + registerBinderCalls(); + registerBinderCallsExceptions(); + registerLooperStats(); + registerDiskStats(); + registerDirectoryUsage(); + registerAppSize(); + registerCategorySize(); + registerNumFingerprintsEnrolled(); + registerNumFacesEnrolled(); + registerProcStats(); + registerProcStatsPkgProc(); + registerDiskIO(); + registerPowerProfile(); + registerProcessCpuTime(); + registerCpuTimePerThreadFreq(); + registerDeviceCalculatedPowerUse(); + registerDeviceCalculatedPowerBlameUid(); + registerDeviceCalculatedPowerBlameOther(); + registerDebugElapsedClock(); + registerDebugFailingElapsedClock(); + registerBuildInformation(); + registerRoleHolder(); + registerDangerousPermissionState(); + registerTimeZoneDataInfo(); + registerExternalStorageInfo(); + registerAppsOnExternalStorageInfo(); + registerFaceSettings(); + registerAppOps(); + registerNotificationRemoteViews(); + registerDangerousPermissionState(); + registerDangerousPermissionStateSampled(); + } + + private INetworkStatsService getINetworkStatsService() { + synchronized (mNetworkStatsLock) { + if (mNetworkStatsService == null) { + mNetworkStatsService = INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + if (mNetworkStatsService != null) { + try { + mNetworkStatsService.asBinder().linkToDeath(() -> { + synchronized (mNetworkStatsLock) { + mNetworkStatsService = null; + } + }, /* flags */ 0); + } catch (RemoteException e) { + Slog.e(TAG, "linkToDeath with NetworkStatsService failed", e); + mNetworkStatsService = null; + } + } + + } + return mNetworkStatsService; + } + } + + private IThermalService getIThermalService() { + synchronized (mThermalLock) { + if (mThermalService == null) { + mThermalService = IThermalService.Stub.asInterface( + ServiceManager.getService(Context.THERMAL_SERVICE)); + if (mThermalService != null) { + try { + mThermalService.asBinder().linkToDeath(() -> { + synchronized (mThermalLock) { + mThermalService = null; + } + }, /* flags */ 0); + } catch (RemoteException e) { + Slog.e(TAG, "linkToDeath with thermalService failed", e); + mThermalService = null; + } + } + } + return mThermalService; + } + } + private void registerWifiBytesTransfer() { + int tagId = StatsLog.WIFI_BYTES_TRANSFER; + PullAtomMetadata metaData = PullAtomMetadata.newBuilder() + .setAdditiveFields(new int[] {2, 3, 4, 5}).build(); + mStatsManager.registerPullAtomCallback( + tagId, + metaData, + (atomTag, data) -> pullWifiBytesTransfer(atomTag, data), + Executors.newSingleThreadExecutor() + ); + } + + private int pullWifiBytesTransfer(int atomTag, List<StatsEvent> pulledData) { + INetworkStatsService networkStatsService = getINetworkStatsService(); + if (networkStatsService == null) { + Slog.e(TAG, "NetworkStats Service is not available!"); + return StatsManager.PULL_SKIP; + } + long token = Binder.clearCallingIdentity(); + try { + // TODO: Consider caching the following call to get BatteryStatsInternal. + BatteryStatsInternal bs = LocalServices.getService(BatteryStatsInternal.class); + String[] ifaces = bs.getWifiIfaces(); + if (ifaces.length == 0) { + return StatsManager.PULL_SKIP; + } + // Combine all the metrics per Uid into one record. + NetworkStats stats = networkStatsService.getDetailedUidStats(ifaces).groupedByUid(); + addNetworkStats(atomTag, pulledData, stats, false); + } catch (RemoteException e) { + Slog.e(TAG, "Pulling netstats for wifi bytes has error", e); + } finally { + Binder.restoreCallingIdentity(token); + } + return StatsManager.PULL_SUCCESS; + } + + private void addNetworkStats( + int tag, List<StatsEvent> ret, NetworkStats stats, boolean withFGBG) { + int size = stats.size(); + NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling + for (int j = 0; j < size; j++) { + stats.getValues(j, entry); + StatsEvent.Builder e = StatsEvent.newBuilder(); + e.setAtomId(tag); + e.writeInt(entry.uid); + if (withFGBG) { + e.writeInt(entry.set); + } + e.writeLong(entry.rxBytes); + e.writeLong(entry.rxPackets); + e.writeLong(entry.txBytes); + e.writeLong(entry.txPackets); + ret.add(e.build()); + } + } + + private void registerWifiBytesTransferBackground() { + // No op. + } + + private void pullWifiBytesTransferBackground() { + // No op. + } + + private void registerMobileBytesTransfer() { + // No op. + } + + private void pullMobileBytesTransfer() { + // No op. + } + + private void registerMobileBytesTransferBackground() { + // No op. + } + + private void pullMobileBytesTransferBackground() { + // No op. + } + + private void registerBluetoothBytesTransfer() { + // No op. + } + + private void pullBluetoothBytesTransfer() { + // No op. + } + + private void registerKernelWakelock() { + // No op. + } + + private void pullKernelWakelock() { + // No op. + } + + private void registerCpuTimePerFreq() { + // No op. + } + + private void pullCpuTimePerFreq() { + // No op. + } + + private void registerCpuTimePerUid() { + // No op. + } + + private void pullCpuTimePerUid() { + // No op. + } + + private void registerCpuTimePerUidFreq() { + // No op. + } + + private void pullCpuTimeperUidFreq() { + // No op. + } + + private void registerCpuActiveTime() { + // No op. + } + + private void pullCpuActiveTime() { + // No op. + } + + private void registerCpuClusterTime() { + // No op. + } + + private int pullCpuClusterTime() { + return 0; + } + + private void registerWifiActivityInfo() { + // No op. + } + + private void pullWifiActivityInfo() { + // No op. + } + + private void registerModemActivityInfo() { + // No op. + } + + private void pullModemActivityInfo() { + // No op. + } + + private void registerBluetoothActivityInfo() { + // No op. + } + + private void pullBluetoothActivityInfo() { + // No op. + } + + private void registerSystemElapsedRealtime() { + // No op. + } + + private void pullSystemElapsedRealtime() { + // No op. + } + + private void registerSystemUptime() { + // No op. + } + + private void pullSystemUptime() { + // No op. + } + + private void registerRemainingBatteryCapacity() { + // No op. + } + + private void pullRemainingBatteryCapacity() { + // No op. + } + + private void registerFullBatteryCapacity() { + // No op. + } + + private void pullFullBatteryCapacity() { + // No op. + } + + private void registerBatteryVoltage() { + // No op. + } + + private void pullBatteryVoltage() { + // No op. + } + + private void registerBatteryLevel() { + // No op. + } + + private void pullBatteryLevel() { + // No op. + } + + private void registerBatteryCycleCount() { + // No op. + } + + private void pullBatteryCycleCount() { + // No op. + } + + private void registerProcessMemoryState() { + // No op. + } + + private void pullProcessMemoryState() { + // No op. + } + + private void registerProcessMemoryHighWaterMark() { + // No op. + } + + private void pullProcessMemoryHighWaterMark() { + // No op. + } + + private void registerProcessMemorySnapshot() { + // No op. + } + + private void pullProcessMemorySnapshot() { + // No op. + } + + private void registerSystemIonHeapSize() { + // No op. + } + + private void pullSystemIonHeapSize() { + // No op. + } + + private void registerProcessSystemIonHeapSize() { + // No op. + } + + private void pullProcessSystemIonHeapSize() { + // No op. + } + + private void registerTemperature() { + // No op. + } + + private void pullTemperature() { + // No op. + } + + private void registerCoolingDevice() { + // No op. + } + + private void pullCooldownDevice() { + // No op. + } + + private void registerBinderCalls() { + // No op. + } + + private void pullBinderCalls() { + // No op. + } + + private void registerBinderCallsExceptions() { + // No op. + } + + private void pullBinderCallsExceptions() { + // No op. + } + + private void registerLooperStats() { + // No op. + } + + private void pullLooperStats() { + // No op. + } + + private void registerDiskStats() { + // No op. + } + + private void pullDiskStats() { + // No op. + } + + private void registerDirectoryUsage() { + // No op. + } + + private void pullDirectoryUsage() { + // No op. + } + + private void registerAppSize() { + // No op. + } + + private void pullAppSize() { + // No op. + } + + private void registerCategorySize() { + // No op. + } + + private void pullCategorySize() { + // No op. + } + + private void registerNumFingerprintsEnrolled() { + // No op. + } + + private void pullNumFingerprintsEnrolled() { + // No op. + } + + private void registerNumFacesEnrolled() { + // No op. + } + + private void pullNumFacesEnrolled() { + // No op. + } + + private void registerProcStats() { + // No op. + } + + private void pullProcStats() { + // No op. + } + + private void registerProcStatsPkgProc() { + // No op. + } + + private void pullProcStatsPkgProc() { + // No op. + } + + private void registerDiskIO() { + // No op. + } + + private void pullDiskIO() { + // No op. + } + + private void registerPowerProfile() { + // No op. + } + + private void pullPowerProfile() { + // No op. + } + + private void registerProcessCpuTime() { + // No op. + } + + private void pullProcessCpuTime() { + // No op. + } + + private void registerCpuTimePerThreadFreq() { + // No op. + } + + private void pullCpuTimePerThreadFreq() { + // No op. + } + + private void registerDeviceCalculatedPowerUse() { + // No op. + } + + private void pullDeviceCalculatedPowerUse() { + // No op. + } + + private void registerDeviceCalculatedPowerBlameUid() { + // No op. + } + + private void pullDeviceCalculatedPowerBlameUid() { + // No op. + } + + private void registerDeviceCalculatedPowerBlameOther() { + // No op. + } + + private void pullDeviceCalculatedPowerBlameOther() { + // No op. + } + + private void registerDebugElapsedClock() { + // No op. + } + + private void pullDebugElapsedClock() { + // No op. + } + + private void registerDebugFailingElapsedClock() { + // No op. + } + + private void pullDebugFailingElapsedClock() { + // No op. + } + + private void registerBuildInformation() { + // No op. + } + + private void pullBuildInformation() { + // No op. + } + + private void registerRoleHolder() { + // No op. + } + + private void pullRoleHolder() { + // No op. + } + + private void registerDangerousPermissionState() { + // No op. + } + + private void pullDangerousPermissionState() { + // No op. + } + + private void registerTimeZoneDataInfo() { + // No op. + } + + private void pullTimeZoneDataInfo() { + // No op. + } + + private void registerExternalStorageInfo() { + // No op. + } + + private void pullExternalStorageInfo() { + // No op. + } + + private void registerAppsOnExternalStorageInfo() { + // No op. + } + + private void pullAppsOnExternalStorageInfo() { + // No op. + } + + private void registerFaceSettings() { + // No op. + } + + private void pullRegisterFaceSettings() { + // No op. + } + + private void registerAppOps() { + // No op. + } + + private void pullAppOps() { + // No op. + } + + private void registerNotificationRemoteViews() { + // No op. + } + + private void pullNotificationRemoteViews() { + // No op. + } + + private void registerDangerousPermissionStateSampled() { + // No op. + } + + private void pullDangerousPermissionStateSampled() { + // No op. } } |