blob: 1afec9c18a7fe93ae4ca3b2160e636a22129ccec [file] [log] [blame]
Tej Singh953ad862020-01-03 12:47:07 -08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Tej Singh250e7aa2020-01-16 13:16:21 -080017package com.android.server.stats.pull;
Tej Singh953ad862020-01-03 12:47:07 -080018
Stanislav Zholnin050abc32020-02-17 14:14:52 +000019import static android.app.AppOpsManager.OP_FLAG_SELF;
Stanislav Zholnind20eacc2020-03-02 18:44:45 +000020import static android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXY;
junyulai212a5f0e2020-02-07 17:42:39 +080021import static android.app.usage.NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080022import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
23import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
junyulai317ba5b2020-02-11 14:59:38 +080024import static android.net.NetworkTemplate.getAllCollapsedRatTypes;
Rafal Slawikbdd5a502020-01-14 14:14:29 +000025import static android.os.Debug.getIonHeapsSizeKb;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080026import static android.os.Process.getUidForPid;
27import static android.os.storage.VolumeInfo.TYPE_PRIVATE;
28import static android.os.storage.VolumeInfo.TYPE_PUBLIC;
Stanislav Zholnin59199132020-03-06 14:19:25 +000029import static android.util.MathUtils.abs;
30import static android.util.MathUtils.constrain;
Tej Singh953ad862020-01-03 12:47:07 -080031
Muhammad Qureshi22e52da2020-03-30 21:14:21 -070032import static com.android.internal.util.FrameworkStatsLog.ANNOTATION_ID_IS_UID;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080033import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
Tej Singh250e7aa2020-01-16 13:16:21 -080034import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs;
35import static com.android.server.stats.pull.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs;
Ioannis Ilkos754eb072020-01-27 16:42:24 +000036import static com.android.server.stats.pull.ProcfsMemoryUtil.getProcessCmdlines;
Tej Singh250e7aa2020-01-16 13:16:21 -080037import static com.android.server.stats.pull.ProcfsMemoryUtil.readCmdlineFromProcfs;
38import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080039
junyulai212a5f0e2020-02-07 17:42:39 +080040import static java.util.concurrent.TimeUnit.MICROSECONDS;
41
42import android.annotation.NonNull;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080043import android.annotation.Nullable;
44import android.app.ActivityManagerInternal;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080045import android.app.AppOpsManager;
46import android.app.AppOpsManager.HistoricalOps;
47import android.app.AppOpsManager.HistoricalOpsRequest;
48import android.app.AppOpsManager.HistoricalPackageOps;
49import android.app.AppOpsManager.HistoricalUidOps;
50import android.app.INotificationManager;
51import android.app.ProcessMemoryState;
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +000052import android.app.RuntimeAppOpAccessMessage;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080053import android.app.StatsManager;
54import android.app.StatsManager.PullAtomMetadata;
55import android.bluetooth.BluetoothActivityEnergyInfo;
56import android.bluetooth.BluetoothAdapter;
57import android.bluetooth.UidTraffic;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080058import android.content.Context;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080059import android.content.pm.ApplicationInfo;
60import android.content.pm.PackageInfo;
61import android.content.pm.PackageManager;
62import android.content.pm.PermissionInfo;
63import android.content.pm.UserInfo;
64import android.hardware.biometrics.BiometricsProtoEnums;
65import android.hardware.face.FaceManager;
66import android.hardware.fingerprint.FingerprintManager;
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -080067import android.hardware.health.V2_0.IHealth;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080068import android.net.ConnectivityManager;
69import android.net.INetworkStatsService;
junyulai212a5f0e2020-02-07 17:42:39 +080070import android.net.INetworkStatsSession;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080071import android.net.Network;
72import android.net.NetworkRequest;
73import android.net.NetworkStats;
junyulai212a5f0e2020-02-07 17:42:39 +080074import android.net.NetworkTemplate;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080075import android.net.wifi.WifiManager;
76import android.os.BatteryStats;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080077import android.os.Binder;
78import android.os.Build;
79import android.os.Bundle;
80import android.os.CoolingDevice;
81import android.os.Environment;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080082import android.os.IStoraged;
83import android.os.IThermalEventListener;
84import android.os.IThermalService;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080085import android.os.ParcelFileDescriptor;
86import android.os.Parcelable;
87import android.os.RemoteException;
88import android.os.ServiceManager;
89import android.os.StatFs;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080090import android.os.SynchronousResultReceiver;
91import android.os.SystemClock;
92import android.os.SystemProperties;
93import android.os.Temperature;
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +000094import android.os.Trace;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -080095import android.os.UserHandle;
96import android.os.UserManager;
97import android.os.connectivity.WifiActivityEnergyInfo;
98import android.os.storage.DiskInfo;
99import android.os.storage.StorageManager;
100import android.os.storage.VolumeInfo;
101import android.provider.Settings;
102import android.stats.storage.StorageEnums;
103import android.telephony.ModemActivityInfo;
104import android.telephony.TelephonyManager;
105import android.util.ArrayMap;
106import android.util.ArraySet;
107import android.util.Log;
108import android.util.Slog;
Ioannis Ilkos754eb072020-01-27 16:42:24 +0000109import android.util.SparseArray;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800110import android.util.StatsEvent;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800111import android.util.proto.ProtoOutputStream;
112
113import com.android.internal.annotations.GuardedBy;
114import com.android.internal.app.procstats.IProcessStats;
115import com.android.internal.app.procstats.ProcessStats;
Tej Singh953ad862020-01-03 12:47:07 -0800116import com.android.internal.os.BackgroundThread;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800117import com.android.internal.os.BatterySipper;
118import com.android.internal.os.BatteryStatsHelper;
119import com.android.internal.os.BinderCallsStats.ExportedCallStat;
120import com.android.internal.os.KernelCpuSpeedReader;
121import com.android.internal.os.KernelCpuThreadReader;
122import com.android.internal.os.KernelCpuThreadReaderDiff;
123import com.android.internal.os.KernelCpuThreadReaderSettingsObserver;
124import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader;
125import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader;
126import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
127import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
128import com.android.internal.os.KernelWakelockReader;
129import com.android.internal.os.KernelWakelockStats;
130import com.android.internal.os.LooperStats;
131import com.android.internal.os.PowerProfile;
132import com.android.internal.os.ProcessCpuTracker;
133import com.android.internal.os.StoragedUidIoStatsReader;
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800134import com.android.internal.util.FrameworkStatsLog;
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -0800135import com.android.server.BatteryService;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800136import com.android.server.BinderCallsStatsService;
137import com.android.server.LocalServices;
Tej Singh953ad862020-01-03 12:47:07 -0800138import com.android.server.SystemService;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800139import com.android.server.SystemServiceManager;
140import com.android.server.am.MemoryStatUtil.MemoryStat;
141import com.android.server.notification.NotificationManagerService;
142import com.android.server.role.RoleManagerInternal;
Tej Singh250e7aa2020-01-16 13:16:21 -0800143import com.android.server.stats.pull.IonMemoryUtil.IonAllocations;
144import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800145import com.android.server.storage.DiskStatsFileLogger;
146import com.android.server.storage.DiskStatsLoggingService;
147
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800148import libcore.io.IoUtils;
149
150import org.json.JSONArray;
151import org.json.JSONException;
152import org.json.JSONObject;
153
154import java.io.File;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800155import java.io.FileOutputStream;
156import java.io.IOException;
157import java.io.InputStream;
Stanislav Zholnin59199132020-03-06 14:19:25 +0000158import java.time.Instant;
159import java.time.temporal.ChronoUnit;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800160import java.util.ArrayList;
161import java.util.Arrays;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800162import java.util.HashSet;
163import java.util.List;
164import java.util.Map;
Ruchir Rastogibd2c4ba2020-01-15 14:48:36 -0800165import java.util.MissingResourceException;
Stanislav Zholnin59199132020-03-06 14:19:25 +0000166import java.util.Random;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800167import java.util.Set;
168import java.util.UUID;
169import java.util.concurrent.CompletableFuture;
170import java.util.concurrent.Executor;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800171import java.util.concurrent.ThreadLocalRandom;
172import java.util.concurrent.TimeUnit;
173import java.util.concurrent.TimeoutException;
Tej Singh953ad862020-01-03 12:47:07 -0800174
175/**
176 * SystemService containing PullAtomCallbacks that are registered with statsd.
177 *
178 * @hide
179 */
180public class StatsPullAtomService extends SystemService {
181 private static final String TAG = "StatsPullAtomService";
182 private static final boolean DEBUG = true;
183
Stanislav Zholnin59199132020-03-06 14:19:25 +0000184 // Random seed stable for StatsPullAtomService life cycle - can be used for stable sampling
185 private static final int RANDOM_SEED = new Random().nextInt();
186
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800187 /**
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800188 * Lowest available uid for apps.
189 *
190 * <p>Used to quickly discard memory snapshots of the zygote forks from native process
191 * measurements.
192 */
193 private static final int MIN_APP_UID = 10_000;
194
Jeffrey Huangfa917892020-01-10 16:58:03 -0800195 private static final String RESULT_RECEIVER_CONTROLLER_KEY = "controller_activity";
196 /**
197 * How long to wait on an individual subsystem to return its stats.
198 */
199 private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
Tej Singh72a70a82020-02-26 23:46:29 -0800200 private static final long MILLIS_PER_SEC = 1000;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800201 private static final long MILLI_AMP_HR_TO_NANO_AMP_SECS = 1_000_000L * 3600L;
202
203 private static final int MAX_BATTERY_STATS_HELPER_FREQUENCY_MS = 1000;
204 private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8;
Stanislav Zholnind20eacc2020-03-02 18:44:45 +0000205 private static final int OP_FLAGS_PULLED = OP_FLAG_SELF | OP_FLAG_TRUSTED_PROXY;
Stanislav Zholnindbcf85e2020-02-24 18:17:55 +0000206 private static final String COMMON_PERMISSION_PREFIX = "android.permission.";
Jeffrey Huangfa917892020-01-10 16:58:03 -0800207
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800208 private final Object mNetworkStatsLock = new Object();
209 @GuardedBy("mNetworkStatsLock")
junyulai212a5f0e2020-02-07 17:42:39 +0800210 @Nullable
211 private INetworkStatsSession mNetworkStatsSession;
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800212
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800213 private final Object mThermalLock = new Object();
214 @GuardedBy("mThermalLock")
215 private IThermalService mThermalService;
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800216
Jeffrey Huang95765f02020-01-16 11:33:58 -0800217 private final Object mStoragedLock = new Object();
218 @GuardedBy("mStoragedLock")
219 private IStoraged mStorageService;
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800220
Jeffrey Huang730bf962020-01-16 15:59:52 -0800221 private final Object mNotificationStatsLock = new Object();
222 @GuardedBy("mNotificationStatsLock")
223 private INotificationManager mNotificationManagerService;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800224
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800225 private final Object mProcessStatsLock = new Object();
226 @GuardedBy("mProcessStatsLock")
227 private IProcessStats mProcessStatsService;
228
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800229 private final Object mCpuTrackerLock = new Object();
230 @GuardedBy("mCpuTrackerLock")
231 private ProcessCpuTracker mProcessCpuTracker;
232
233 private final Object mDebugElapsedClockLock = new Object();
234 @GuardedBy("mDebugElapsedClockLock")
235 private long mDebugElapsedClockPreviousValue = 0;
236 @GuardedBy("mDebugElapsedClockLock")
237 private long mDebugElapsedClockPullCount = 0;
238
239 private final Object mDebugFailingElapsedClockLock = new Object();
240 @GuardedBy("mDebugFailingElapsedClockLock")
241 private long mDebugFailingElapsedClockPreviousValue = 0;
242 @GuardedBy("mDebugFailingElapsedClockLock")
243 private long mDebugFailingElapsedClockPullCount = 0;
244
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800245 private final Context mContext;
246 private StatsManager mStatsManager;
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -0800247 private StorageManager mStorageManager;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800248 private WifiManager mWifiManager;
249 private TelephonyManager mTelephony;
250
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800251 private KernelWakelockReader mKernelWakelockReader;
252 private KernelWakelockStats mTmpWakelockStats;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800253
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800254 private StoragedUidIoStatsReader mStoragedUidIoStatsReader;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800255
256 private KernelCpuSpeedReader[] mKernelCpuSpeedReaders;
257 // Disables throttler on CPU time readers.
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800258 private KernelCpuUidUserSysTimeReader mCpuUidUserSysTimeReader;
259 private KernelCpuUidFreqTimeReader mCpuUidFreqTimeReader;
260 private KernelCpuUidActiveTimeReader mCpuUidActiveTimeReader;
261 private KernelCpuUidClusterTimeReader mCpuUidClusterTimeReader;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800262
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800263 private File mBaseDir;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800264
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -0800265 private BatteryService.HealthServiceWrapper mHealthService;
266
Jeffrey Huanga85d8f92020-01-24 13:28:45 -0800267 @Nullable
268 private KernelCpuThreadReaderDiff mKernelCpuThreadReader;
269
270 private BatteryStatsHelper mBatteryStatsHelper = null;
271 private long mBatteryStatsHelperTimestampMs = -MAX_BATTERY_STATS_HELPER_FREQUENCY_MS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800272
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800273 private StatsPullAtomCallbackImpl mStatsCallbackImpl;
274
Stanislav Zholnin59199132020-03-06 14:19:25 +0000275 private int mAppOpsSamplingRate = 0;
276
Tej Singh953ad862020-01-03 12:47:07 -0800277 public StatsPullAtomService(Context context) {
278 super(context);
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800279 mContext = context;
Tej Singh953ad862020-01-03 12:47:07 -0800280 }
281
Jeffrey Huang4c527162020-01-30 17:53:13 -0800282 private native void nativeInit();
283
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800284 /**
285 * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
286 * get if we used lambdas.
287 *
288 * The pull methods are intentionally left to be package private to avoid the creation
289 * of synthetic methods to save unnecessary bytecode.
290 */
291 private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
292 @Override
293 public int onPullAtom(int atomTag, List<StatsEvent> data) {
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000294 if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
295 Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StatsPull-" + atomTag);
296 }
297 try {
298 switch (atomTag) {
299 case FrameworkStatsLog.WIFI_BYTES_TRANSFER:
junyulai212a5f0e2020-02-07 17:42:39 +0800300 return pullWifiBytesTransfer(atomTag, data, false);
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000301 case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG:
junyulai212a5f0e2020-02-07 17:42:39 +0800302 return pullWifiBytesTransfer(atomTag, data, true);
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000303 case FrameworkStatsLog.MOBILE_BYTES_TRANSFER:
junyulai212a5f0e2020-02-07 17:42:39 +0800304 return pullMobileBytesTransfer(atomTag, data, false);
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000305 case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG:
junyulai212a5f0e2020-02-07 17:42:39 +0800306 return pullMobileBytesTransfer(atomTag, data, true);
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000307 case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER:
308 return pullBluetoothBytesTransfer(atomTag, data);
309 case FrameworkStatsLog.KERNEL_WAKELOCK:
310 return pullKernelWakelock(atomTag, data);
311 case FrameworkStatsLog.CPU_TIME_PER_FREQ:
312 return pullCpuTimePerFreq(atomTag, data);
313 case FrameworkStatsLog.CPU_TIME_PER_UID:
314 return pullCpuTimePerUid(atomTag, data);
315 case FrameworkStatsLog.CPU_TIME_PER_UID_FREQ:
316 return pullCpuTimeperUidFreq(atomTag, data);
317 case FrameworkStatsLog.CPU_ACTIVE_TIME:
318 return pullCpuActiveTime(atomTag, data);
319 case FrameworkStatsLog.CPU_CLUSTER_TIME:
320 return pullCpuClusterTime(atomTag, data);
321 case FrameworkStatsLog.WIFI_ACTIVITY_INFO:
322 return pullWifiActivityInfo(atomTag, data);
323 case FrameworkStatsLog.MODEM_ACTIVITY_INFO:
324 return pullModemActivityInfo(atomTag, data);
325 case FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO:
326 return pullBluetoothActivityInfo(atomTag, data);
327 case FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME:
328 return pullSystemElapsedRealtime(atomTag, data);
329 case FrameworkStatsLog.SYSTEM_UPTIME:
330 return pullSystemUptime(atomTag, data);
331 case FrameworkStatsLog.PROCESS_MEMORY_STATE:
332 return pullProcessMemoryState(atomTag, data);
333 case FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK:
334 return pullProcessMemoryHighWaterMark(atomTag, data);
335 case FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT:
336 return pullProcessMemorySnapshot(atomTag, data);
337 case FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE:
338 return pullSystemIonHeapSize(atomTag, data);
339 case FrameworkStatsLog.ION_HEAP_SIZE:
340 return pullIonHeapSize(atomTag, data);
341 case FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE:
342 return pullProcessSystemIonHeapSize(atomTag, data);
343 case FrameworkStatsLog.TEMPERATURE:
344 return pullTemperature(atomTag, data);
345 case FrameworkStatsLog.COOLING_DEVICE:
346 return pullCooldownDevice(atomTag, data);
347 case FrameworkStatsLog.BINDER_CALLS:
348 return pullBinderCallsStats(atomTag, data);
349 case FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS:
350 return pullBinderCallsStatsExceptions(atomTag, data);
351 case FrameworkStatsLog.LOOPER_STATS:
352 return pullLooperStats(atomTag, data);
353 case FrameworkStatsLog.DISK_STATS:
354 return pullDiskStats(atomTag, data);
355 case FrameworkStatsLog.DIRECTORY_USAGE:
356 return pullDirectoryUsage(atomTag, data);
357 case FrameworkStatsLog.APP_SIZE:
358 return pullAppSize(atomTag, data);
359 case FrameworkStatsLog.CATEGORY_SIZE:
360 return pullCategorySize(atomTag, data);
361 case FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED:
362 return pullNumBiometricsEnrolled(
363 BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data);
364 case FrameworkStatsLog.NUM_FACES_ENROLLED:
365 return pullNumBiometricsEnrolled(
366 BiometricsProtoEnums.MODALITY_FACE, atomTag, data);
367 case FrameworkStatsLog.PROC_STATS:
368 return pullProcStats(ProcessStats.REPORT_ALL, atomTag, data);
369 case FrameworkStatsLog.PROC_STATS_PKG_PROC:
370 return pullProcStats(ProcessStats.REPORT_PKG_PROC_STATS, atomTag, data);
371 case FrameworkStatsLog.DISK_IO:
372 return pullDiskIO(atomTag, data);
373 case FrameworkStatsLog.POWER_PROFILE:
374 return pullPowerProfile(atomTag, data);
375 case FrameworkStatsLog.PROCESS_CPU_TIME:
376 return pullProcessCpuTime(atomTag, data);
377 case FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ:
378 return pullCpuTimePerThreadFreq(atomTag, data);
379 case FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE:
380 return pullDeviceCalculatedPowerUse(atomTag, data);
381 case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID:
382 return pullDeviceCalculatedPowerBlameUid(atomTag, data);
383 case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER:
384 return pullDeviceCalculatedPowerBlameOther(atomTag, data);
385 case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK:
386 return pullDebugElapsedClock(atomTag, data);
387 case FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK:
388 return pullDebugFailingElapsedClock(atomTag, data);
389 case FrameworkStatsLog.BUILD_INFORMATION:
390 return pullBuildInformation(atomTag, data);
391 case FrameworkStatsLog.ROLE_HOLDER:
392 return pullRoleHolder(atomTag, data);
393 case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE:
394 return pullDangerousPermissionState(atomTag, data);
395 case FrameworkStatsLog.TIME_ZONE_DATA_INFO:
396 return pullTimeZoneDataInfo(atomTag, data);
397 case FrameworkStatsLog.EXTERNAL_STORAGE_INFO:
398 return pullExternalStorageInfo(atomTag, data);
399 case FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO:
400 return pullAppsOnExternalStorageInfo(atomTag, data);
401 case FrameworkStatsLog.FACE_SETTINGS:
402 return pullFaceSettings(atomTag, data);
403 case FrameworkStatsLog.APP_OPS:
404 return pullAppOps(atomTag, data);
405 case FrameworkStatsLog.RUNTIME_APP_OP_ACCESS:
406 return pullRuntimeAppOpAccessMessage(atomTag, data);
407 case FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS:
408 return pullNotificationRemoteViews(atomTag, data);
409 case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED:
410 return pullDangerousPermissionState(atomTag, data);
411 case FrameworkStatsLog.BATTERY_LEVEL:
412 case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY:
413 case FrameworkStatsLog.FULL_BATTERY_CAPACITY:
414 case FrameworkStatsLog.BATTERY_VOLTAGE:
415 case FrameworkStatsLog.BATTERY_CYCLE_COUNT:
416 return pullHealthHal(atomTag, data);
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -0800417 case FrameworkStatsLog.ATTRIBUTED_APP_OPS:
418 return pullAttributedAppOps(atomTag, data);
Raff Tsai87cefd42020-04-07 14:25:02 +0800419 case FrameworkStatsLog.SETTING_SNAPSHOT:
420 return pullSettingsStats(atomTag, data);
Ioannis Ilkos606bf6e2020-02-20 13:25:37 +0000421 default:
422 throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
423 }
424 } finally {
425 Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800426 }
427 }
428 }
429
Tej Singh953ad862020-01-03 12:47:07 -0800430 @Override
431 public void onStart() {
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800432 // no op
433 }
434
435 @Override
436 public void onBootPhase(int phase) {
437 super.onBootPhase(phase);
438 if (phase == PHASE_SYSTEM_SERVICES_READY) {
439 BackgroundThread.getHandler().post(() -> {
Jeffrey Huang4c527162020-01-30 17:53:13 -0800440 nativeInit();
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800441 initializePullersState();
442 registerAllPullers();
443 registerEventListeners();
444 });
445 }
446 }
447
448 void initializePullersState() {
449 // Get Context Managers
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800450 mStatsManager = (StatsManager) mContext.getSystemService(Context.STATS_MANAGER);
Jeffrey Huang4df57402020-01-14 11:57:22 -0800451 mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
Jeffrey Huang1f818892020-01-14 12:05:05 -0800452 mTelephony = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -0800453 mStorageManager = (StorageManager) mContext.getSystemService(StorageManager.class);
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800454
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800455 // Initialize DiskIO
456 mStoragedUidIoStatsReader = new StoragedUidIoStatsReader();
Jeffrey Huangbf130832020-01-22 15:48:26 -0800457
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800458 // Initialize PROC_STATS
Jeffrey Huangb2cdb1a52020-02-24 15:26:13 -0800459 mBaseDir = new File(SystemServiceManager.ensureSystemDir(), "stats_pull");
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800460
461 // Disables throttler on CPU time readers.
462 mCpuUidUserSysTimeReader = new KernelCpuUidUserSysTimeReader(false);
463 mCpuUidFreqTimeReader = new KernelCpuUidFreqTimeReader(false);
464 mCpuUidActiveTimeReader = new KernelCpuUidActiveTimeReader(false);
465 mCpuUidClusterTimeReader = new KernelCpuUidClusterTimeReader(false);
466
467 // Initialize state for KERNEL_WAKELOCK
468 mKernelWakelockReader = new KernelWakelockReader();
469 mTmpWakelockStats = new KernelWakelockStats();
Jeffrey Huangbf130832020-01-22 15:48:26 -0800470
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800471 // Initialize state for CPU_TIME_PER_FREQ atom
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800472 PowerProfile powerProfile = new PowerProfile(mContext);
473 final int numClusters = powerProfile.getNumCpuClusters();
474 mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters];
475 int firstCpuOfCluster = 0;
476 for (int i = 0; i < numClusters; i++) {
477 final int numSpeedSteps = powerProfile.getNumSpeedStepsInCpuCluster(i);
478 mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster,
479 numSpeedSteps);
480 firstCpuOfCluster += powerProfile.getNumCoresInCpuCluster(i);
481 }
Jeffrey Huangbf4eef82020-01-16 15:38:58 -0800482
483 // Used for CPU_TIME_PER_THREAD_FREQ
484 mKernelCpuThreadReader =
485 KernelCpuThreadReaderSettingsObserver.getSettingsModifiedReader(mContext);
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800486
487 // Used by PROC_STATS and PROC_STATS_PKG_PROC atoms
488 mBaseDir.mkdirs();
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -0800489
490 // Initialize HealthService
491 mHealthService = new BatteryService.HealthServiceWrapper();
492 try {
493 mHealthService.init();
494 } catch (RemoteException e) {
495 Slog.e(TAG, "failed to initialize healthHalWrapper");
496 }
Tej Singh953ad862020-01-03 12:47:07 -0800497 }
498
Jeffrey Huang1c0fe042020-01-27 13:22:05 -0800499 void registerEventListeners() {
500 final ConnectivityManager connectivityManager =
501 (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
502 // Default NetworkRequest should cover all transport types.
503 final NetworkRequest request = new NetworkRequest.Builder().build();
504 connectivityManager.registerNetworkCallback(request, new ConnectivityStatsCallback());
505
506 // Enable push notifications of throttling from vendor thermal
507 // management subsystem via thermalservice.
508 IThermalService thermalService = getIThermalService();
509 if (thermalService != null) {
510 try {
511 thermalService.registerThermalEventListener(new ThermalEventListener());
512 Slog.i(TAG, "register thermal listener successfully");
513 } catch (RemoteException e) {
514 Slog.i(TAG, "failed to register thermal listener");
515 }
Tej Singh953ad862020-01-03 12:47:07 -0800516 }
517 }
518
519 void registerAllPullers() {
520 if (DEBUG) {
521 Slog.d(TAG, "Registering all pullers with statsd");
522 }
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800523 mStatsCallbackImpl = new StatsPullAtomCallbackImpl();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800524 registerWifiBytesTransfer();
525 registerWifiBytesTransferBackground();
526 registerMobileBytesTransfer();
527 registerMobileBytesTransferBackground();
528 registerBluetoothBytesTransfer();
529 registerKernelWakelock();
530 registerCpuTimePerFreq();
531 registerCpuTimePerUid();
532 registerCpuTimePerUidFreq();
533 registerCpuActiveTime();
534 registerCpuClusterTime();
535 registerWifiActivityInfo();
536 registerModemActivityInfo();
537 registerBluetoothActivityInfo();
538 registerSystemElapsedRealtime();
539 registerSystemUptime();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800540 registerProcessMemoryState();
541 registerProcessMemoryHighWaterMark();
542 registerProcessMemorySnapshot();
543 registerSystemIonHeapSize();
Rafal Slawikbdd5a502020-01-14 14:14:29 +0000544 registerIonHeapSize();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800545 registerProcessSystemIonHeapSize();
546 registerTemperature();
547 registerCoolingDevice();
Jeffrey Huang877adfe2020-01-15 17:16:43 -0800548 registerBinderCallsStats();
549 registerBinderCallsStatsExceptions();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800550 registerLooperStats();
551 registerDiskStats();
552 registerDirectoryUsage();
553 registerAppSize();
554 registerCategorySize();
555 registerNumFingerprintsEnrolled();
556 registerNumFacesEnrolled();
557 registerProcStats();
558 registerProcStatsPkgProc();
559 registerDiskIO();
560 registerPowerProfile();
561 registerProcessCpuTime();
562 registerCpuTimePerThreadFreq();
563 registerDeviceCalculatedPowerUse();
564 registerDeviceCalculatedPowerBlameUid();
565 registerDeviceCalculatedPowerBlameOther();
566 registerDebugElapsedClock();
567 registerDebugFailingElapsedClock();
568 registerBuildInformation();
569 registerRoleHolder();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800570 registerTimeZoneDataInfo();
571 registerExternalStorageInfo();
572 registerAppsOnExternalStorageInfo();
573 registerFaceSettings();
574 registerAppOps();
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -0800575 registerAttributedAppOps();
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +0000576 registerRuntimeAppOpAccessMessage();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800577 registerNotificationRemoteViews();
578 registerDangerousPermissionState();
579 registerDangerousPermissionStateSampled();
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -0800580 registerBatteryLevel();
Jeffrey Huang43f4d262020-01-30 14:03:31 -0800581 registerRemainingBatteryCapacity();
582 registerFullBatteryCapacity();
583 registerBatteryVoltage();
584 registerBatteryCycleCount();
Raff Tsai87cefd42020-04-07 14:25:02 +0800585 registerSettingsStats();
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800586 }
587
junyulai212a5f0e2020-02-07 17:42:39 +0800588 /**
589 * Return the {@code INetworkStatsSession} object that holds the necessary properties needed
590 * for the subsequent queries to {@link com.android.server.net.NetworkStatsService}. Or
591 * null if the service or binder cannot be obtained.
592 */
593 @Nullable
594 private INetworkStatsSession getNetworkStatsSession() {
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800595 synchronized (mNetworkStatsLock) {
junyulai212a5f0e2020-02-07 17:42:39 +0800596 if (mNetworkStatsSession != null) return mNetworkStatsSession;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800597
junyulai212a5f0e2020-02-07 17:42:39 +0800598 final INetworkStatsService networkStatsService =
599 INetworkStatsService.Stub.asInterface(
600 ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
601 if (networkStatsService == null) return null;
602
603 try {
604 networkStatsService.asBinder().linkToDeath(() -> {
605 synchronized (mNetworkStatsLock) {
606 mNetworkStatsSession = null;
607 }
608 }, /* flags */ 0);
609 mNetworkStatsSession = networkStatsService.openSessionForUsageStats(
610 FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN, mContext.getOpPackageName());
611 } catch (RemoteException e) {
612 Slog.e(TAG, "Cannot get NetworkStats session", e);
613 mNetworkStatsSession = null;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800614 }
junyulai212a5f0e2020-02-07 17:42:39 +0800615
616 return mNetworkStatsSession;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800617 }
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800618 }
619
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800620 private IThermalService getIThermalService() {
621 synchronized (mThermalLock) {
622 if (mThermalService == null) {
623 mThermalService = IThermalService.Stub.asInterface(
624 ServiceManager.getService(Context.THERMAL_SERVICE));
625 if (mThermalService != null) {
626 try {
627 mThermalService.asBinder().linkToDeath(() -> {
628 synchronized (mThermalLock) {
629 mThermalService = null;
630 }
631 }, /* flags */ 0);
632 } catch (RemoteException e) {
633 Slog.e(TAG, "linkToDeath with thermalService failed", e);
634 mThermalService = null;
635 }
636 }
637 }
638 return mThermalService;
639 }
640 }
Jeffrey Huang95765f02020-01-16 11:33:58 -0800641
642 private IStoraged getIStoragedService() {
643 synchronized (mStoragedLock) {
644 if (mStorageService == null) {
645 mStorageService = IStoraged.Stub.asInterface(
646 ServiceManager.getService("storaged"));
647 }
648 if (mStorageService != null) {
649 try {
650 mStorageService.asBinder().linkToDeath(() -> {
651 synchronized (mStoragedLock) {
652 mStorageService = null;
653 }
654 }, /* flags */ 0);
655 } catch (RemoteException e) {
656 Slog.e(TAG, "linkToDeath with storagedService failed", e);
657 mStorageService = null;
658 }
659 }
660 }
661 return mStorageService;
662 }
663
Jeffrey Huang730bf962020-01-16 15:59:52 -0800664 private INotificationManager getINotificationManagerService() {
665 synchronized (mNotificationStatsLock) {
666 if (mNotificationManagerService == null) {
667 mNotificationManagerService = INotificationManager.Stub.asInterface(
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800668 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
Jeffrey Huang730bf962020-01-16 15:59:52 -0800669 }
670 if (mNotificationManagerService != null) {
671 try {
672 mNotificationManagerService.asBinder().linkToDeath(() -> {
673 synchronized (mNotificationStatsLock) {
674 mNotificationManagerService = null;
675 }
676 }, /* flags */ 0);
677 } catch (RemoteException e) {
678 Slog.e(TAG, "linkToDeath with notificationManager failed", e);
679 mNotificationManagerService = null;
680 }
681 }
682 }
683 return mNotificationManagerService;
684 }
685
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -0800686 private IProcessStats getIProcessStatsService() {
687 synchronized (mProcessStatsLock) {
688 if (mProcessStatsService == null) {
689 mProcessStatsService = IProcessStats.Stub.asInterface(
690 ServiceManager.getService(ProcessStats.SERVICE_NAME));
691 }
692 if (mProcessStatsService != null) {
693 try {
694 mProcessStatsService.asBinder().linkToDeath(() -> {
695 synchronized (mProcessStatsLock) {
696 mProcessStatsService = null;
697 }
698 }, /* flags */ 0);
699 } catch (RemoteException e) {
700 Slog.e(TAG, "linkToDeath with ProcessStats failed", e);
701 mProcessStatsService = null;
702 }
703 }
704 }
705 return mProcessStatsService;
706 }
707
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800708 private void registerWifiBytesTransfer() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800709 int tagId = FrameworkStatsLog.WIFI_BYTES_TRANSFER;
Tej Singh6b979832020-01-02 15:23:02 -0800710 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800711 .setAdditiveFields(new int[] {2, 3, 4, 5})
712 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800713 mStatsManager.setPullAtomCallback(
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800714 tagId,
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800715 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800716 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800717 mStatsCallbackImpl
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800718 );
719 }
720
junyulai212a5f0e2020-02-07 17:42:39 +0800721 private int pullWifiBytesTransfer(
722 int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) {
723 final NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard();
724 final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg);
725 if (stats != null) {
junyulai317ba5b2020-02-11 14:59:38 +0800726 addNetworkStats(atomTag, pulledData, stats, withFgbg, 0 /* ratType */);
junyulai212a5f0e2020-02-07 17:42:39 +0800727 return StatsManager.PULL_SUCCESS;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800728 }
junyulai212a5f0e2020-02-07 17:42:39 +0800729 return StatsManager.PULL_SKIP;
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800730 }
731
junyulai212a5f0e2020-02-07 17:42:39 +0800732 private int pullMobileBytesTransfer(
733 int atomTag, @NonNull List<StatsEvent> pulledData, boolean withFgbg) {
junyulai317ba5b2020-02-11 14:59:38 +0800734 int ret = StatsManager.PULL_SKIP;
735 for (final int ratType : getAllCollapsedRatTypes()) {
736 final NetworkTemplate template =
737 NetworkTemplate.buildTemplateMobileWithRatType(null, ratType);
738 final NetworkStats stats = getUidNetworkStatsSinceBoot(template, withFgbg);
739 if (stats != null) {
740 addNetworkStats(atomTag, pulledData, stats, withFgbg, ratType);
741 ret = StatsManager.PULL_SUCCESS; // If any of them is not null, then success.
742 }
junyulai212a5f0e2020-02-07 17:42:39 +0800743 }
junyulai317ba5b2020-02-11 14:59:38 +0800744 // If there is no data return PULL_SKIP to avoid wasting performance adding empty stats.
745 return ret;
junyulai212a5f0e2020-02-07 17:42:39 +0800746 }
747
748 private void addNetworkStats(int atomTag, @NonNull List<StatsEvent> ret,
junyulai317ba5b2020-02-11 14:59:38 +0800749 @NonNull NetworkStats stats, boolean withFgbg, int ratType) {
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800750 int size = stats.size();
junyulai212a5f0e2020-02-07 17:42:39 +0800751 final NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800752 for (int j = 0; j < size; j++) {
753 stats.getValues(j, entry);
754 StatsEvent.Builder e = StatsEvent.newBuilder();
junyulai212a5f0e2020-02-07 17:42:39 +0800755 e.setAtomId(atomTag);
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800756 e.writeInt(entry.uid);
Muhammad Qureshi22e52da2020-03-30 21:14:21 -0700757 e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true);
junyulai212a5f0e2020-02-07 17:42:39 +0800758 if (withFgbg) {
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800759 e.writeInt(entry.set);
760 }
761 e.writeLong(entry.rxBytes);
762 e.writeLong(entry.rxPackets);
763 e.writeLong(entry.txBytes);
764 e.writeLong(entry.txPackets);
junyulai317ba5b2020-02-11 14:59:38 +0800765 switch (atomTag) {
766 case FrameworkStatsLog.MOBILE_BYTES_TRANSFER:
767 case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG:
768 e.writeInt(ratType);
769 break;
770 default:
771 }
Jeffrey Huang3ee8e202020-01-09 15:31:16 -0800772 ret.add(e.build());
773 }
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800774 }
775
junyulai212a5f0e2020-02-07 17:42:39 +0800776 @Nullable private NetworkStats getUidNetworkStatsSinceBoot(
777 @NonNull NetworkTemplate template, boolean withFgbg) {
778
779 final long elapsedMillisSinceBoot = SystemClock.elapsedRealtime();
780 final long currentTimeInMillis = MICROSECONDS.toMillis(SystemClock.currentTimeMicro());
781 try {
782 final NetworkStats stats = getNetworkStatsSession().getSummaryForAllUid(template,
783 currentTimeInMillis - elapsedMillisSinceBoot, currentTimeInMillis, false);
784 return withFgbg ? rollupNetworkStatsByFgbg(stats) : stats.groupedByUid();
785 } catch (RemoteException | NullPointerException e) {
786 Slog.e(TAG, "Pulling netstats for " + template
787 + " fgbg= " + withFgbg + " bytes has error", e);
788 }
789 return null;
790 }
791
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800792 /**
793 * Allows rollups per UID but keeping the set (foreground/background) slicing.
794 * Adapted from groupedByUid in frameworks/base/core/java/android/net/NetworkStats.java
795 */
junyulai212a5f0e2020-02-07 17:42:39 +0800796 @NonNull private NetworkStats rollupNetworkStatsByFgbg(@NonNull NetworkStats stats) {
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800797 final NetworkStats ret = new NetworkStats(stats.getElapsedRealtime(), 1);
798
799 final NetworkStats.Entry entry = new NetworkStats.Entry();
800 entry.iface = NetworkStats.IFACE_ALL;
801 entry.tag = NetworkStats.TAG_NONE;
802 entry.metered = NetworkStats.METERED_ALL;
803 entry.roaming = NetworkStats.ROAMING_ALL;
804
805 int size = stats.size();
junyulai212a5f0e2020-02-07 17:42:39 +0800806 final NetworkStats.Entry recycle = new NetworkStats.Entry(); // Used for retrieving values
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800807 for (int i = 0; i < size; i++) {
808 stats.getValues(i, recycle);
809
810 // Skip specific tags, since already counted in TAG_NONE
811 if (recycle.tag != NetworkStats.TAG_NONE) continue;
812
813 entry.set = recycle.set; // Allows slicing by background/foreground
814 entry.uid = recycle.uid;
815 entry.rxBytes = recycle.rxBytes;
816 entry.rxPackets = recycle.rxPackets;
817 entry.txBytes = recycle.txBytes;
818 entry.txPackets = recycle.txPackets;
819 // Operations purposefully omitted since we don't use them for statsd.
820 ret.combineValues(entry);
821 }
822 return ret;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800823 }
824
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800825 private void registerWifiBytesTransferBackground() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800826 int tagId = FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG;
Tej Singh6b979832020-01-02 15:23:02 -0800827 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800828 .setAdditiveFields(new int[] {3, 4, 5, 6})
829 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800830 mStatsManager.setPullAtomCallback(
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800831 tagId,
832 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800833 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800834 mStatsCallbackImpl
Jeffrey Huangacaee0f2020-01-10 14:45:19 -0800835 );
836 }
837
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800838 private void registerMobileBytesTransfer() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800839 int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER;
Tej Singh6b979832020-01-02 15:23:02 -0800840 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangc8785422020-01-10 15:54:53 -0800841 .setAdditiveFields(new int[] {2, 3, 4, 5})
842 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800843 mStatsManager.setPullAtomCallback(
Jeffrey Huangc8785422020-01-10 15:54:53 -0800844 tagId,
845 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800846 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800847 mStatsCallbackImpl
Jeffrey Huangc8785422020-01-10 15:54:53 -0800848 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800849 }
850
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800851 private void registerMobileBytesTransferBackground() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800852 int tagId = FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG;
Tej Singh6b979832020-01-02 15:23:02 -0800853 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huang89864442020-01-10 16:35:51 -0800854 .setAdditiveFields(new int[] {3, 4, 5, 6})
855 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800856 mStatsManager.setPullAtomCallback(
Jeffrey Huang89864442020-01-10 16:35:51 -0800857 tagId,
858 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800859 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800860 mStatsCallbackImpl
Jeffrey Huang89864442020-01-10 16:35:51 -0800861 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800862 }
863
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800864 private void registerBluetoothBytesTransfer() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800865 int tagId = FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER;
Tej Singh6b979832020-01-02 15:23:02 -0800866 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangfa917892020-01-10 16:58:03 -0800867 .setAdditiveFields(new int[] {2, 3})
868 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800869 mStatsManager.setPullAtomCallback(
Jeffrey Huangfa917892020-01-10 16:58:03 -0800870 tagId,
871 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800872 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800873 mStatsCallbackImpl
Jeffrey Huangfa917892020-01-10 16:58:03 -0800874 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800875 }
876
Jeffrey Huangfa917892020-01-10 16:58:03 -0800877 /**
878 * Helper method to extract the Parcelable controller info from a
879 * SynchronousResultReceiver.
880 */
881 private static <T extends Parcelable> T awaitControllerInfo(
882 @Nullable SynchronousResultReceiver receiver) {
883 if (receiver == null) {
884 return null;
885 }
886
887 try {
888 final SynchronousResultReceiver.Result result =
889 receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS);
890 if (result.bundle != null) {
891 // This is the final destination for the Bundle.
892 result.bundle.setDefusable(true);
893
894 final T data = result.bundle.getParcelable(RESULT_RECEIVER_CONTROLLER_KEY);
895 if (data != null) {
896 return data;
897 }
898 }
Jeffrey Huangfa917892020-01-10 16:58:03 -0800899 } catch (TimeoutException e) {
900 Slog.w(TAG, "timeout reading " + receiver.getName() + " stats");
901 }
902 return null;
903 }
904
905 private synchronized BluetoothActivityEnergyInfo fetchBluetoothData() {
906 // TODO: Investigate whether the synchronized keyword is needed.
907 final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
908 if (adapter != null) {
909 SynchronousResultReceiver bluetoothReceiver = new SynchronousResultReceiver(
910 "bluetooth");
911 adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
912 return awaitControllerInfo(bluetoothReceiver);
913 } else {
914 Slog.e(TAG, "Failed to get bluetooth adapter!");
915 return null;
916 }
917 }
918
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800919 int pullBluetoothBytesTransfer(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangfa917892020-01-10 16:58:03 -0800920 BluetoothActivityEnergyInfo info = fetchBluetoothData();
921 if (info == null || info.getUidTraffic() == null) {
922 return StatsManager.PULL_SKIP;
923 }
924 for (UidTraffic traffic : info.getUidTraffic()) {
925 StatsEvent e = StatsEvent.newBuilder()
926 .setAtomId(atomTag)
927 .writeInt(traffic.getUid())
Muhammad Qureshi22e52da2020-03-30 21:14:21 -0700928 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangfa917892020-01-10 16:58:03 -0800929 .writeLong(traffic.getRxBytes())
930 .writeLong(traffic.getTxBytes())
931 .build();
932 pulledData.add(e);
933 }
934 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800935 }
936
937 private void registerKernelWakelock() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800938 int tagId = FrameworkStatsLog.KERNEL_WAKELOCK;
Tej Singh72a70a82020-02-26 23:46:29 -0800939 mStatsManager.setPullAtomCallback(
Jeffrey Huanga6e5a9b2020-01-13 15:59:16 -0800940 tagId,
941 /* PullAtomMetadata */ null,
Tej Singh6b979832020-01-02 15:23:02 -0800942 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800943 mStatsCallbackImpl
Jeffrey Huanga6e5a9b2020-01-13 15:59:16 -0800944 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800945 }
946
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800947 int pullKernelWakelock(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huanga6e5a9b2020-01-13 15:59:16 -0800948 final KernelWakelockStats wakelockStats =
949 mKernelWakelockReader.readKernelWakelockStats(mTmpWakelockStats);
950 for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) {
951 String name = ent.getKey();
952 KernelWakelockStats.Entry kws = ent.getValue();
953 StatsEvent e = StatsEvent.newBuilder()
954 .setAtomId(atomTag)
955 .writeString(name)
956 .writeInt(kws.mCount)
957 .writeInt(kws.mVersion)
958 .writeLong(kws.mTotalTime)
959 .build();
960 pulledData.add(e);
961 }
962 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800963 }
964
965 private void registerCpuTimePerFreq() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800966 int tagId = FrameworkStatsLog.CPU_TIME_PER_FREQ;
Tej Singh6b979832020-01-02 15:23:02 -0800967 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800968 .setAdditiveFields(new int[] {3})
969 .build();
Tej Singh72a70a82020-02-26 23:46:29 -0800970 mStatsManager.setPullAtomCallback(
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800971 tagId,
972 metadata,
Tej Singh6b979832020-01-02 15:23:02 -0800973 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800974 mStatsCallbackImpl
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800975 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800976 }
977
Jeffrey Huang8fb5b832020-01-27 13:20:16 -0800978 int pullCpuTimePerFreq(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang43d5e2d2020-01-13 16:22:36 -0800979 for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
980 long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readAbsolute();
981 if (clusterTimeMs != null) {
982 for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) {
983 StatsEvent e = StatsEvent.newBuilder()
984 .setAtomId(atomTag)
985 .writeInt(cluster)
986 .writeInt(speed)
987 .writeLong(clusterTimeMs[speed])
988 .build();
989 pulledData.add(e);
990 }
991 }
992 }
993 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -0800994 }
995
996 private void registerCpuTimePerUid() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -0800997 int tagId = FrameworkStatsLog.CPU_TIME_PER_UID;
Tej Singh6b979832020-01-02 15:23:02 -0800998 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangd5f053e2020-01-13 16:27:53 -0800999 .setAdditiveFields(new int[] {2, 3})
1000 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001001 mStatsManager.setPullAtomCallback(
Jeffrey Huangd5f053e2020-01-13 16:27:53 -08001002 tagId,
1003 metadata,
Tej Singh6b979832020-01-02 15:23:02 -08001004 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001005 mStatsCallbackImpl
Jeffrey Huangd5f053e2020-01-13 16:27:53 -08001006 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001007 }
1008
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001009 int pullCpuTimePerUid(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangd5f053e2020-01-13 16:27:53 -08001010 mCpuUidUserSysTimeReader.readAbsolute((uid, timesUs) -> {
1011 long userTimeUs = timesUs[0], systemTimeUs = timesUs[1];
1012 StatsEvent e = StatsEvent.newBuilder()
1013 .setAtomId(atomTag)
1014 .writeInt(uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001015 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangd5f053e2020-01-13 16:27:53 -08001016 .writeLong(userTimeUs)
1017 .writeLong(systemTimeUs)
1018 .build();
1019 pulledData.add(e);
1020 });
1021 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001022 }
1023
1024 private void registerCpuTimePerUidFreq() {
Jeffrey Huanga9899302020-01-13 16:34:03 -08001025 // the throttling is 3sec, handled in
1026 // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001027 int tagId = FrameworkStatsLog.CPU_TIME_PER_UID_FREQ;
Tej Singh6b979832020-01-02 15:23:02 -08001028 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huanga9899302020-01-13 16:34:03 -08001029 .setAdditiveFields(new int[] {4})
1030 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001031 mStatsManager.setPullAtomCallback(
Jeffrey Huanga9899302020-01-13 16:34:03 -08001032 tagId,
1033 metadata,
Tej Singh6b979832020-01-02 15:23:02 -08001034 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001035 mStatsCallbackImpl
Jeffrey Huanga9899302020-01-13 16:34:03 -08001036 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001037 }
1038
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001039 int pullCpuTimeperUidFreq(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huanga9899302020-01-13 16:34:03 -08001040 mCpuUidFreqTimeReader.readAbsolute((uid, cpuFreqTimeMs) -> {
1041 for (int freqIndex = 0; freqIndex < cpuFreqTimeMs.length; ++freqIndex) {
1042 if (cpuFreqTimeMs[freqIndex] != 0) {
1043 StatsEvent e = StatsEvent.newBuilder()
1044 .setAtomId(atomTag)
1045 .writeInt(uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001046 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huanga9899302020-01-13 16:34:03 -08001047 .writeInt(freqIndex)
1048 .writeLong(cpuFreqTimeMs[freqIndex])
1049 .build();
1050 pulledData.add(e);
1051 }
1052 }
1053 });
1054 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001055 }
1056
1057 private void registerCpuActiveTime() {
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001058 // the throttling is 3sec, handled in
1059 // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001060 int tagId = FrameworkStatsLog.CPU_ACTIVE_TIME;
Tej Singh6b979832020-01-02 15:23:02 -08001061 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001062 .setAdditiveFields(new int[] {2})
1063 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001064 mStatsManager.setPullAtomCallback(
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001065 tagId,
1066 metadata,
Tej Singh6b979832020-01-02 15:23:02 -08001067 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001068 mStatsCallbackImpl
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001069 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001070 }
1071
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001072 int pullCpuActiveTime(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001073 mCpuUidActiveTimeReader.readAbsolute((uid, cpuActiveTimesMs) -> {
1074 StatsEvent e = StatsEvent.newBuilder()
1075 .setAtomId(atomTag)
1076 .writeInt(uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001077 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangccfcdf02020-01-13 16:38:27 -08001078 .writeLong(cpuActiveTimesMs)
1079 .build();
1080 pulledData.add(e);
1081 });
1082 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001083 }
1084
1085 private void registerCpuClusterTime() {
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001086 // the throttling is 3sec, handled in
1087 // frameworks/base/core/java/com/android/internal/os/KernelCpuProcReader
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001088 int tagId = FrameworkStatsLog.CPU_CLUSTER_TIME;
Tej Singh6b979832020-01-02 15:23:02 -08001089 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001090 .setAdditiveFields(new int[] {3})
1091 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001092 mStatsManager.setPullAtomCallback(
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001093 tagId,
1094 metadata,
Tej Singh6b979832020-01-02 15:23:02 -08001095 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001096 mStatsCallbackImpl
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001097 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001098 }
1099
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001100 int pullCpuClusterTime(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001101 mCpuUidClusterTimeReader.readAbsolute((uid, cpuClusterTimesMs) -> {
1102 for (int i = 0; i < cpuClusterTimesMs.length; i++) {
1103 StatsEvent e = StatsEvent.newBuilder()
1104 .setAtomId(atomTag)
1105 .writeInt(uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001106 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangceb1d252020-01-13 16:47:44 -08001107 .writeInt(i)
1108 .writeLong(cpuClusterTimesMs[i])
1109 .build();
1110 pulledData.add(e);
1111 }
1112 });
1113 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001114 }
1115
1116 private void registerWifiActivityInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001117 int tagId = FrameworkStatsLog.WIFI_ACTIVITY_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08001118 mStatsManager.setPullAtomCallback(
Jeffrey Huang4df57402020-01-14 11:57:22 -08001119 tagId,
1120 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001121 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001122 mStatsCallbackImpl
Jeffrey Huang4df57402020-01-14 11:57:22 -08001123 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001124 }
1125
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001126 int pullWifiActivityInfo(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang4df57402020-01-14 11:57:22 -08001127 long token = Binder.clearCallingIdentity();
1128 try {
1129 SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi");
1130 mWifiManager.getWifiActivityEnergyInfoAsync(
1131 new Executor() {
1132 @Override
1133 public void execute(Runnable runnable) {
1134 // run the listener on the binder thread, if it was run on the main
1135 // thread it would deadlock since we would be waiting on ourselves
1136 runnable.run();
1137 }
1138 },
1139 info -> {
1140 Bundle bundle = new Bundle();
1141 bundle.putParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY, info);
1142 wifiReceiver.send(0, bundle);
1143 }
1144 );
1145 final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
1146 if (wifiInfo == null) {
1147 return StatsManager.PULL_SKIP;
1148 }
1149 StatsEvent e = StatsEvent.newBuilder()
1150 .setAtomId(atomTag)
1151 .writeLong(wifiInfo.getTimeSinceBootMillis())
1152 .writeInt(wifiInfo.getStackState())
1153 .writeLong(wifiInfo.getControllerTxDurationMillis())
1154 .writeLong(wifiInfo.getControllerRxDurationMillis())
1155 .writeLong(wifiInfo.getControllerIdleDurationMillis())
1156 .writeLong(wifiInfo.getControllerEnergyUsedMicroJoules())
1157 .build();
1158 pulledData.add(e);
1159 } catch (RuntimeException e) {
1160 Slog.e(TAG, "failed to getWifiActivityEnergyInfoAsync", e);
1161 return StatsManager.PULL_SKIP;
1162 } finally {
1163 Binder.restoreCallingIdentity(token);
1164 }
1165 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001166 }
1167
1168 private void registerModemActivityInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001169 int tagId = FrameworkStatsLog.MODEM_ACTIVITY_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08001170 mStatsManager.setPullAtomCallback(
Jeffrey Huang1f818892020-01-14 12:05:05 -08001171 tagId,
1172 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001173 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001174 mStatsCallbackImpl
Jeffrey Huang1f818892020-01-14 12:05:05 -08001175 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001176 }
1177
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001178 int pullModemActivityInfo(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang1f818892020-01-14 12:05:05 -08001179 long token = Binder.clearCallingIdentity();
1180 try {
1181 SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony");
1182 mTelephony.requestModemActivityInfo(modemReceiver);
1183 final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver);
1184 if (modemInfo == null) {
1185 return StatsManager.PULL_SKIP;
1186 }
1187 StatsEvent e = StatsEvent.newBuilder()
1188 .setAtomId(atomTag)
1189 .writeLong(modemInfo.getTimestamp())
1190 .writeLong(modemInfo.getSleepTimeMillis())
1191 .writeLong(modemInfo.getIdleTimeMillis())
1192 .writeLong(modemInfo.getTransmitPowerInfo().get(0).getTimeInMillis())
1193 .writeLong(modemInfo.getTransmitPowerInfo().get(1).getTimeInMillis())
1194 .writeLong(modemInfo.getTransmitPowerInfo().get(2).getTimeInMillis())
1195 .writeLong(modemInfo.getTransmitPowerInfo().get(3).getTimeInMillis())
1196 .writeLong(modemInfo.getTransmitPowerInfo().get(4).getTimeInMillis())
1197 .writeLong(modemInfo.getReceiveTimeMillis())
1198 .build();
1199 pulledData.add(e);
1200 } finally {
1201 Binder.restoreCallingIdentity(token);
1202 }
1203 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001204 }
1205
1206 private void registerBluetoothActivityInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001207 int tagId = FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08001208 mStatsManager.setPullAtomCallback(
Jeffrey Huangaafccb32020-01-13 10:16:58 -08001209 tagId,
1210 /* metadata */ null,
Tej Singh6b979832020-01-02 15:23:02 -08001211 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001212 mStatsCallbackImpl
Jeffrey Huangaafccb32020-01-13 10:16:58 -08001213 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001214 }
1215
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001216 int pullBluetoothActivityInfo(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangaafccb32020-01-13 10:16:58 -08001217 BluetoothActivityEnergyInfo info = fetchBluetoothData();
1218 if (info == null) {
1219 return StatsManager.PULL_SKIP;
1220 }
1221 StatsEvent e = StatsEvent.newBuilder()
1222 .setAtomId(atomTag)
1223 .writeLong(info.getTimeStamp())
1224 .writeInt(info.getBluetoothStackState())
1225 .writeLong(info.getControllerTxTimeMillis())
1226 .writeLong(info.getControllerRxTimeMillis())
1227 .writeLong(info.getControllerIdleTimeMillis())
1228 .writeLong(info.getControllerEnergyUsed())
1229 .build();
1230 pulledData.add(e);
1231 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001232 }
1233
1234 private void registerSystemElapsedRealtime() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001235 int tagId = FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001236 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Tej Singh72a70a82020-02-26 23:46:29 -08001237 .setCoolDownMillis(MILLIS_PER_SEC)
1238 .setTimeoutMillis(MILLIS_PER_SEC / 2)
Jeffrey Huang882f99a2020-01-14 14:33:52 -08001239 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001240 mStatsManager.setPullAtomCallback(
Jeffrey Huang882f99a2020-01-14 14:33:52 -08001241 tagId,
1242 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001243 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001244 mStatsCallbackImpl
Jeffrey Huang882f99a2020-01-14 14:33:52 -08001245 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001246 }
1247
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001248 int pullSystemElapsedRealtime(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang882f99a2020-01-14 14:33:52 -08001249 StatsEvent e = StatsEvent.newBuilder()
1250 .setAtomId(atomTag)
1251 .writeLong(SystemClock.elapsedRealtime())
1252 .build();
1253 pulledData.add(e);
1254 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001255 }
1256
1257 private void registerSystemUptime() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001258 int tagId = FrameworkStatsLog.SYSTEM_UPTIME;
Tej Singh72a70a82020-02-26 23:46:29 -08001259 mStatsManager.setPullAtomCallback(
Ruchir Rastogice29fc12020-01-09 17:08:20 -08001260 tagId,
1261 null, // use default PullAtomMetadata values
Tej Singh6b979832020-01-02 15:23:02 -08001262 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001263 mStatsCallbackImpl
Ruchir Rastogice29fc12020-01-09 17:08:20 -08001264 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001265 }
1266
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001267 int pullSystemUptime(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogice29fc12020-01-09 17:08:20 -08001268 StatsEvent e = StatsEvent.newBuilder()
1269 .setAtomId(atomTag)
tsaichristinedc1c34a2020-03-18 14:43:06 -07001270 .writeLong(SystemClock.uptimeMillis())
Ruchir Rastogice29fc12020-01-09 17:08:20 -08001271 .build();
1272 pulledData.add(e);
1273 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001274 }
1275
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001276 private void registerProcessMemoryState() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001277 int tagId = FrameworkStatsLog.PROCESS_MEMORY_STATE;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001278 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001279 .setAdditiveFields(new int[] {4, 5, 6, 7, 8})
1280 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001281 mStatsManager.setPullAtomCallback(
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001282 tagId,
1283 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001284 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001285 mStatsCallbackImpl
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001286 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001287 }
1288
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001289 int pullProcessMemoryState(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001290 List<ProcessMemoryState> processMemoryStates =
1291 LocalServices.getService(ActivityManagerInternal.class)
1292 .getMemoryStateForProcesses();
1293 for (ProcessMemoryState processMemoryState : processMemoryStates) {
1294 final MemoryStat memoryStat = readMemoryStatFromFilesystem(processMemoryState.uid,
1295 processMemoryState.pid);
1296 if (memoryStat == null) {
1297 continue;
1298 }
1299 StatsEvent e = StatsEvent.newBuilder()
1300 .setAtomId(atomTag)
1301 .writeInt(processMemoryState.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001302 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001303 .writeString(processMemoryState.processName)
1304 .writeInt(processMemoryState.oomScore)
1305 .writeLong(memoryStat.pgfault)
1306 .writeLong(memoryStat.pgmajfault)
1307 .writeLong(memoryStat.rssInBytes)
1308 .writeLong(memoryStat.cacheInBytes)
1309 .writeLong(memoryStat.swapInBytes)
1310 .writeLong(-1) // unused
1311 .writeLong(-1) // unused
1312 .writeInt(-1) // unused
1313 .build();
1314 pulledData.add(e);
1315 }
1316 return StatsManager.PULL_SUCCESS;
1317 }
1318
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001319 private static boolean isAppUid(int uid) {
1320 return uid >= MIN_APP_UID;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001321 }
1322
1323 private void registerProcessMemoryHighWaterMark() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001324 int tagId = FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK;
Tej Singh72a70a82020-02-26 23:46:29 -08001325 mStatsManager.setPullAtomCallback(
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001326 tagId,
1327 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001328 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001329 mStatsCallbackImpl
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001330 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001331 }
1332
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001333 int pullProcessMemoryHighWaterMark(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001334 List<ProcessMemoryState> managedProcessList =
1335 LocalServices.getService(ActivityManagerInternal.class)
1336 .getMemoryStateForProcesses();
1337 for (ProcessMemoryState managedProcess : managedProcessList) {
1338 final MemorySnapshot snapshot = readMemorySnapshotFromProcfs(managedProcess.pid);
1339 if (snapshot == null) {
1340 continue;
1341 }
1342 StatsEvent e = StatsEvent.newBuilder()
1343 .setAtomId(atomTag)
1344 .writeInt(managedProcess.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001345 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001346 .writeString(managedProcess.processName)
1347 // RSS high-water mark in bytes.
1348 .writeLong(snapshot.rssHighWaterMarkInKilobytes * 1024L)
1349 .writeInt(snapshot.rssHighWaterMarkInKilobytes)
1350 .build();
1351 pulledData.add(e);
1352 }
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001353 // Complement the data with native system processes
1354 SparseArray<String> processCmdlines = getProcessCmdlines();
1355 managedProcessList.forEach(managedProcess -> processCmdlines.delete(managedProcess.pid));
1356 int size = processCmdlines.size();
1357 for (int i = 0; i < size; ++i) {
1358 final MemorySnapshot snapshot = readMemorySnapshotFromProcfs(processCmdlines.keyAt(i));
1359 if (snapshot == null || isAppUid(snapshot.uid)) {
1360 continue;
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001361 }
1362 StatsEvent e = StatsEvent.newBuilder()
1363 .setAtomId(atomTag)
1364 .writeInt(snapshot.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001365 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001366 .writeString(processCmdlines.valueAt(i))
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001367 // RSS high-water mark in bytes.
1368 .writeLong(snapshot.rssHighWaterMarkInKilobytes * 1024L)
1369 .writeInt(snapshot.rssHighWaterMarkInKilobytes)
1370 .build();
1371 pulledData.add(e);
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001372 }
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001373 // Invoke rss_hwm_reset binary to reset RSS HWM counters for all processes.
1374 SystemProperties.set("sys.rss_hwm_reset.on", "1");
1375 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001376 }
1377
1378 private void registerProcessMemorySnapshot() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001379 int tagId = FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT;
Tej Singh72a70a82020-02-26 23:46:29 -08001380 mStatsManager.setPullAtomCallback(
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001381 tagId,
1382 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001383 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001384 mStatsCallbackImpl
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001385 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001386 }
1387
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001388 int pullProcessMemorySnapshot(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001389 List<ProcessMemoryState> managedProcessList =
1390 LocalServices.getService(ActivityManagerInternal.class)
1391 .getMemoryStateForProcesses();
1392 for (ProcessMemoryState managedProcess : managedProcessList) {
1393 final MemorySnapshot snapshot = readMemorySnapshotFromProcfs(managedProcess.pid);
1394 if (snapshot == null) {
1395 continue;
1396 }
1397 StatsEvent e = StatsEvent.newBuilder()
Ioannis Ilkosda5d8812020-01-27 16:04:10 +00001398 .setAtomId(atomTag)
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001399 .writeInt(managedProcess.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001400 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001401 .writeString(managedProcess.processName)
1402 .writeInt(managedProcess.pid)
1403 .writeInt(managedProcess.oomScore)
1404 .writeInt(snapshot.rssInKilobytes)
1405 .writeInt(snapshot.anonRssInKilobytes)
1406 .writeInt(snapshot.swapInKilobytes)
1407 .writeInt(snapshot.anonRssInKilobytes + snapshot.swapInKilobytes)
1408 .build();
1409 pulledData.add(e);
1410 }
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001411 // Complement the data with native system processes. Given these measurements can be taken
1412 // in response to LMKs happening, we want to first collect the managed app stats (to
1413 // maximize the probability that a heavyweight process will be sampled before it dies).
1414 SparseArray<String> processCmdlines = getProcessCmdlines();
1415 managedProcessList.forEach(managedProcess -> processCmdlines.delete(managedProcess.pid));
1416 int size = processCmdlines.size();
1417 for (int i = 0; i < size; ++i) {
1418 int pid = processCmdlines.keyAt(i);
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001419 final MemorySnapshot snapshot = readMemorySnapshotFromProcfs(pid);
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001420 if (snapshot == null || isAppUid(snapshot.uid)) {
1421 continue;
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001422 }
1423 StatsEvent e = StatsEvent.newBuilder()
1424 .setAtomId(atomTag)
1425 .writeInt(snapshot.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001426 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001427 .writeString(processCmdlines.valueAt(i))
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001428 .writeInt(pid)
1429 .writeInt(-1001) // Placeholder for native processes, OOM_SCORE_ADJ_MIN - 1.
1430 .writeInt(snapshot.rssInKilobytes)
1431 .writeInt(snapshot.anonRssInKilobytes)
1432 .writeInt(snapshot.swapInKilobytes)
1433 .writeInt(snapshot.anonRssInKilobytes + snapshot.swapInKilobytes)
1434 .build();
1435 pulledData.add(e);
Ioannis Ilkos754eb072020-01-27 16:42:24 +00001436 }
Jeffrey Huangb1c16342020-01-15 15:36:42 -08001437 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001438 }
1439
1440 private void registerSystemIonHeapSize() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001441 int tagId = FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE;
Tej Singh72a70a82020-02-26 23:46:29 -08001442 mStatsManager.setPullAtomCallback(
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001443 tagId,
1444 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001445 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001446 mStatsCallbackImpl
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001447 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001448 }
1449
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001450 int pullSystemIonHeapSize(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001451 final long systemIonHeapSizeInBytes = readSystemIonHeapSizeFromDebugfs();
1452 StatsEvent e = StatsEvent.newBuilder()
1453 .setAtomId(atomTag)
1454 .writeLong(systemIonHeapSizeInBytes)
1455 .build();
1456 pulledData.add(e);
1457 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001458 }
1459
Rafal Slawikbdd5a502020-01-14 14:14:29 +00001460 private void registerIonHeapSize() {
Rafal Slawikded83052020-02-28 13:20:13 +00001461 if (!new File("/sys/kernel/ion/total_heaps_kb").exists()) {
1462 return;
1463 }
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001464 int tagId = FrameworkStatsLog.ION_HEAP_SIZE;
Tej Singh72a70a82020-02-26 23:46:29 -08001465 mStatsManager.setPullAtomCallback(
Rafal Slawikbdd5a502020-01-14 14:14:29 +00001466 tagId,
1467 /* PullAtomMetadata */ null,
Tej Singh6b979832020-01-02 15:23:02 -08001468 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001469 mStatsCallbackImpl
Rafal Slawikbdd5a502020-01-14 14:14:29 +00001470 );
1471 }
1472
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001473 int pullIonHeapSize(int atomTag, List<StatsEvent> pulledData) {
Rafal Slawikbdd5a502020-01-14 14:14:29 +00001474 int ionHeapSizeInKilobytes = (int) getIonHeapsSizeKb();
1475 StatsEvent e = StatsEvent.newBuilder()
1476 .setAtomId(atomTag)
1477 .writeInt(ionHeapSizeInKilobytes)
1478 .build();
1479 pulledData.add(e);
1480 return StatsManager.PULL_SUCCESS;
1481 }
1482
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001483 private void registerProcessSystemIonHeapSize() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001484 int tagId = FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE;
Tej Singh72a70a82020-02-26 23:46:29 -08001485 mStatsManager.setPullAtomCallback(
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001486 tagId,
1487 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001488 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001489 mStatsCallbackImpl
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001490 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001491 }
1492
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001493 int pullProcessSystemIonHeapSize(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001494 List<IonAllocations> result = readProcessSystemIonHeapSizesFromDebugfs();
1495 for (IonAllocations allocations : result) {
1496 StatsEvent e = StatsEvent.newBuilder()
1497 .setAtomId(atomTag)
1498 .writeInt(getUidForPid(allocations.pid))
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001499 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huanga0e1cd22020-01-15 16:05:07 -08001500 .writeString(readCmdlineFromProcfs(allocations.pid))
1501 .writeInt((int) (allocations.totalSizeInBytes / 1024))
1502 .writeInt(allocations.count)
1503 .writeInt((int) (allocations.maxSizeInBytes / 1024))
1504 .build();
1505 pulledData.add(e);
1506 }
1507 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001508 }
1509
1510 private void registerTemperature() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001511 int tagId = FrameworkStatsLog.TEMPERATURE;
Tej Singh72a70a82020-02-26 23:46:29 -08001512 mStatsManager.setPullAtomCallback(
Jeffrey Huangb92de552020-01-15 16:50:07 -08001513 tagId,
1514 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001515 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001516 mStatsCallbackImpl
Jeffrey Huangb92de552020-01-15 16:50:07 -08001517 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001518 }
1519
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001520 int pullTemperature(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangb92de552020-01-15 16:50:07 -08001521 IThermalService thermalService = getIThermalService();
1522 if (thermalService == null) {
1523 return StatsManager.PULL_SKIP;
1524 }
1525 final long callingToken = Binder.clearCallingIdentity();
1526 try {
Chris Ye48dbcaa2020-02-10 13:29:01 -08001527 Temperature temperatures[] = thermalService.getCurrentTemperatures();
Jeffrey Huangb92de552020-01-15 16:50:07 -08001528 for (Temperature temp : temperatures) {
1529 StatsEvent e = StatsEvent.newBuilder()
1530 .setAtomId(atomTag)
1531 .writeInt(temp.getType())
1532 .writeString(temp.getName())
1533 .writeInt((int) (temp.getValue() * 10))
1534 .writeInt(temp.getStatus())
1535 .build();
1536 pulledData.add(e);
1537 }
1538 } catch (RemoteException e) {
1539 // Should not happen.
1540 Slog.e(TAG, "Disconnected from thermal service. Cannot pull temperatures.");
1541 return StatsManager.PULL_SKIP;
1542 } finally {
1543 Binder.restoreCallingIdentity(callingToken);
1544 }
1545 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001546 }
1547
1548 private void registerCoolingDevice() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001549 int tagId = FrameworkStatsLog.COOLING_DEVICE;
Tej Singh72a70a82020-02-26 23:46:29 -08001550 mStatsManager.setPullAtomCallback(
Jeffrey Huangb92de552020-01-15 16:50:07 -08001551 tagId,
1552 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001553 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001554 mStatsCallbackImpl
Jeffrey Huangb92de552020-01-15 16:50:07 -08001555 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001556 }
1557
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001558 int pullCooldownDevice(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangb92de552020-01-15 16:50:07 -08001559 IThermalService thermalService = getIThermalService();
1560 if (thermalService == null) {
1561 return StatsManager.PULL_SKIP;
1562 }
1563 final long callingToken = Binder.clearCallingIdentity();
1564 try {
Chris Ye48dbcaa2020-02-10 13:29:01 -08001565 CoolingDevice devices[] = thermalService.getCurrentCoolingDevices();
Jeffrey Huangb92de552020-01-15 16:50:07 -08001566 for (CoolingDevice device : devices) {
1567 StatsEvent e = StatsEvent.newBuilder()
1568 .setAtomId(atomTag)
1569 .writeInt(device.getType())
1570 .writeString(device.getName())
1571 .writeInt((int) (device.getValue()))
1572 .build();
1573 pulledData.add(e);
1574 }
1575 } catch (RemoteException e) {
1576 // Should not happen.
1577 Slog.e(TAG, "Disconnected from thermal service. Cannot pull temperatures.");
1578 return StatsManager.PULL_SKIP;
1579 } finally {
1580 Binder.restoreCallingIdentity(callingToken);
1581 }
1582 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001583 }
1584
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001585 private void registerBinderCallsStats() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001586 int tagId = FrameworkStatsLog.BINDER_CALLS;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001587 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001588 .setAdditiveFields(new int[] {4, 5, 6, 8, 12})
1589 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001590 mStatsManager.setPullAtomCallback(
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001591 tagId,
1592 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001593 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001594 mStatsCallbackImpl
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001595 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001596 }
1597
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001598 int pullBinderCallsStats(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001599 BinderCallsStatsService.Internal binderStats =
1600 LocalServices.getService(BinderCallsStatsService.Internal.class);
1601 if (binderStats == null) {
1602 Slog.e(TAG, "failed to get binderStats");
1603 return StatsManager.PULL_SKIP;
1604 }
1605
1606 List<ExportedCallStat> callStats = binderStats.getExportedCallStats();
1607 binderStats.reset();
1608 for (ExportedCallStat callStat : callStats) {
1609 StatsEvent e = StatsEvent.newBuilder()
1610 .setAtomId(atomTag)
1611 .writeInt(callStat.workSourceUid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001612 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001613 .writeString(callStat.className)
1614 .writeString(callStat.methodName)
1615 .writeLong(callStat.callCount)
1616 .writeLong(callStat.exceptionCount)
1617 .writeLong(callStat.latencyMicros)
1618 .writeLong(callStat.maxLatencyMicros)
1619 .writeLong(callStat.cpuTimeMicros)
1620 .writeLong(callStat.maxCpuTimeMicros)
1621 .writeLong(callStat.maxReplySizeBytes)
1622 .writeLong(callStat.maxRequestSizeBytes)
1623 .writeLong(callStat.recordedCallCount)
1624 .writeInt(callStat.screenInteractive ? 1 : 0)
1625 .writeInt(callStat.callingUid)
1626 .build();
1627 pulledData.add(e);
1628 }
1629 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001630 }
1631
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001632 private void registerBinderCallsStatsExceptions() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001633 int tagId = FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS;
Tej Singh72a70a82020-02-26 23:46:29 -08001634 mStatsManager.setPullAtomCallback(
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001635 tagId,
1636 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001637 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001638 mStatsCallbackImpl
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001639 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001640 }
1641
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001642 int pullBinderCallsStatsExceptions(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang877adfe2020-01-15 17:16:43 -08001643 BinderCallsStatsService.Internal binderStats =
1644 LocalServices.getService(BinderCallsStatsService.Internal.class);
1645 if (binderStats == null) {
1646 Slog.e(TAG, "failed to get binderStats");
1647 return StatsManager.PULL_SKIP;
1648 }
1649
1650 ArrayMap<String, Integer> exceptionStats = binderStats.getExportedExceptionStats();
1651 // TODO: decouple binder calls exceptions with the rest of the binder calls data so that we
1652 // can reset the exception stats.
1653 for (Map.Entry<String, Integer> entry : exceptionStats.entrySet()) {
1654 StatsEvent e = StatsEvent.newBuilder()
1655 .setAtomId(atomTag)
1656 .writeString(entry.getKey())
1657 .writeInt(entry.getValue())
1658 .build();
1659 pulledData.add(e);
1660 }
1661 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001662 }
1663
1664 private void registerLooperStats() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001665 int tagId = FrameworkStatsLog.LOOPER_STATS;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001666 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangfd037c52020-01-16 10:42:59 -08001667 .setAdditiveFields(new int[] {5, 6, 7, 8, 9})
1668 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08001669 mStatsManager.setPullAtomCallback(
Jeffrey Huangfd037c52020-01-16 10:42:59 -08001670 tagId,
1671 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001672 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001673 mStatsCallbackImpl
Jeffrey Huangfd037c52020-01-16 10:42:59 -08001674 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001675 }
1676
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001677 int pullLooperStats(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangfd037c52020-01-16 10:42:59 -08001678 LooperStats looperStats = LocalServices.getService(LooperStats.class);
1679 if (looperStats == null) {
1680 return StatsManager.PULL_SKIP;
1681 }
1682
1683 List<LooperStats.ExportedEntry> entries = looperStats.getEntries();
1684 looperStats.reset();
1685 for (LooperStats.ExportedEntry entry : entries) {
1686 StatsEvent e = StatsEvent.newBuilder()
1687 .setAtomId(atomTag)
1688 .writeInt(entry.workSourceUid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07001689 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangfd037c52020-01-16 10:42:59 -08001690 .writeString(entry.handlerClassName)
1691 .writeString(entry.threadName)
1692 .writeString(entry.messageName)
1693 .writeLong(entry.messageCount)
1694 .writeLong(entry.exceptionCount)
1695 .writeLong(entry.recordedMessageCount)
1696 .writeLong(entry.totalLatencyMicros)
1697 .writeLong(entry.cpuUsageMicros)
1698 .writeBoolean(entry.isInteractive)
1699 .writeLong(entry.maxCpuUsageMicros)
1700 .writeLong(entry.maxLatencyMicros)
1701 .writeLong(entry.recordedDelayMessageCount)
1702 .writeLong(entry.delayMillis)
1703 .writeLong(entry.maxDelayMillis)
1704 .build();
1705 pulledData.add(e);
1706 }
1707 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001708 }
1709
1710 private void registerDiskStats() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001711 int tagId = FrameworkStatsLog.DISK_STATS;
Tej Singh72a70a82020-02-26 23:46:29 -08001712 mStatsManager.setPullAtomCallback(
Jeffrey Huang95765f02020-01-16 11:33:58 -08001713 tagId,
1714 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001715 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001716 mStatsCallbackImpl
Jeffrey Huang95765f02020-01-16 11:33:58 -08001717 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001718 }
1719
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001720 int pullDiskStats(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang95765f02020-01-16 11:33:58 -08001721 // Run a quick-and-dirty performance test: write 512 bytes
1722 byte[] junk = new byte[512];
1723 for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes
1724
1725 File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp");
1726 FileOutputStream fos = null;
1727 IOException error = null;
1728
1729 long before = SystemClock.elapsedRealtime();
1730 try {
1731 fos = new FileOutputStream(tmp);
1732 fos.write(junk);
1733 } catch (IOException e) {
1734 error = e;
1735 } finally {
1736 try {
1737 if (fos != null) fos.close();
1738 } catch (IOException e) {
1739 // Do nothing.
1740 }
1741 }
1742
1743 long latency = SystemClock.elapsedRealtime() - before;
1744 if (tmp.exists()) tmp.delete();
1745
1746 if (error != null) {
1747 Slog.e(TAG, "Error performing diskstats latency test");
1748 latency = -1;
1749 }
1750 // File based encryption.
1751 boolean fileBased = StorageManager.isFileEncryptedNativeOnly();
1752
1753 //Recent disk write speed. Binder call to storaged.
1754 int writeSpeed = -1;
1755 IStoraged storaged = getIStoragedService();
1756 if (storaged == null) {
1757 return StatsManager.PULL_SKIP;
1758 }
1759 try {
1760 writeSpeed = storaged.getRecentPerf();
1761 } catch (RemoteException e) {
1762 Slog.e(TAG, "storaged not found");
1763 }
1764
1765 // Add info pulledData.
1766 StatsEvent e = StatsEvent.newBuilder()
1767 .setAtomId(atomTag)
1768 .writeLong(latency)
1769 .writeBoolean(fileBased)
1770 .writeInt(writeSpeed)
1771 .build();
1772 pulledData.add(e);
1773 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001774 }
1775
1776 private void registerDirectoryUsage() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001777 int tagId = FrameworkStatsLog.DIRECTORY_USAGE;
Tej Singh72a70a82020-02-26 23:46:29 -08001778 mStatsManager.setPullAtomCallback(
Jeffrey Huang95765f02020-01-16 11:33:58 -08001779 tagId,
1780 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001781 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001782 mStatsCallbackImpl
Jeffrey Huang95765f02020-01-16 11:33:58 -08001783 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001784 }
1785
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001786 int pullDirectoryUsage(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang95765f02020-01-16 11:33:58 -08001787 StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath());
1788 StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath());
1789 StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath());
1790
1791 StatsEvent e = StatsEvent.newBuilder()
1792 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001793 .writeInt(FrameworkStatsLog.DIRECTORY_USAGE__DIRECTORY__DATA)
Jeffrey Huang95765f02020-01-16 11:33:58 -08001794 .writeLong(statFsData.getAvailableBytes())
1795 .writeLong(statFsData.getTotalBytes())
1796 .build();
1797 pulledData.add(e);
1798
1799 e = StatsEvent.newBuilder()
1800 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001801 .writeInt(FrameworkStatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE)
Jeffrey Huang95765f02020-01-16 11:33:58 -08001802 .writeLong(statFsCache.getAvailableBytes())
1803 .writeLong(statFsCache.getTotalBytes())
1804 .build();
1805 pulledData.add(e);
1806
1807 e = StatsEvent.newBuilder()
1808 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001809 .writeInt(FrameworkStatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM)
Jeffrey Huang95765f02020-01-16 11:33:58 -08001810 .writeLong(statFsSystem.getAvailableBytes())
1811 .writeLong(statFsSystem.getTotalBytes())
1812 .build();
1813 pulledData.add(e);
1814 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001815 }
1816
1817 private void registerAppSize() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001818 int tagId = FrameworkStatsLog.APP_SIZE;
Tej Singh72a70a82020-02-26 23:46:29 -08001819 mStatsManager.setPullAtomCallback(
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001820 tagId,
1821 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001822 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001823 mStatsCallbackImpl
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001824 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001825 }
1826
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001827 int pullAppSize(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001828 try {
1829 String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH);
1830 JSONObject json = new JSONObject(jsonStr);
1831 long cache_time = json.optLong(DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, -1L);
1832 JSONArray pkg_names = json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY);
1833 JSONArray app_sizes = json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY);
1834 JSONArray app_data_sizes = json.getJSONArray(DiskStatsFileLogger.APP_DATA_KEY);
1835 JSONArray app_cache_sizes = json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY);
1836 // Sanity check: Ensure all 4 lists have the same length.
1837 int length = pkg_names.length();
1838 if (app_sizes.length() != length || app_data_sizes.length() != length
1839 || app_cache_sizes.length() != length) {
1840 Slog.e(TAG, "formatting error in diskstats cache file!");
1841 return StatsManager.PULL_SKIP;
1842 }
1843 for (int i = 0; i < length; i++) {
1844 StatsEvent e = StatsEvent.newBuilder()
1845 .setAtomId(atomTag)
1846 .writeString(pkg_names.getString(i))
1847 .writeLong(app_sizes.optLong(i, /* fallback */ -1L))
1848 .writeLong(app_data_sizes.optLong(i, /* fallback */ -1L))
1849 .writeLong(app_cache_sizes.optLong(i, /* fallback */ -1L))
1850 .writeLong(cache_time)
1851 .build();
1852 pulledData.add(e);
1853 }
1854 } catch (IOException | JSONException e) {
1855 Slog.e(TAG, "exception reading diskstats cache file", e);
1856 return StatsManager.PULL_SKIP;
1857 }
1858 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001859 }
1860
1861 private void registerCategorySize() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001862 int tagId = FrameworkStatsLog.CATEGORY_SIZE;
Tej Singh72a70a82020-02-26 23:46:29 -08001863 mStatsManager.setPullAtomCallback(
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001864 tagId,
1865 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001866 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001867 mStatsCallbackImpl
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001868 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001869 }
1870
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001871 int pullCategorySize(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001872 try {
1873 String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH);
1874 JSONObject json = new JSONObject(jsonStr);
1875 long cacheTime = json.optLong(
1876 DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, /* fallback */ -1L);
1877
1878 StatsEvent e = StatsEvent.newBuilder()
1879 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001880 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__APP_SIZE)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001881 .writeLong(json.optLong(
1882 DiskStatsFileLogger.APP_SIZE_AGG_KEY, /* fallback */ -1L))
1883 .writeLong(cacheTime)
1884 .build();
1885 pulledData.add(e);
1886
1887 e = StatsEvent.newBuilder()
1888 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001889 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__APP_DATA_SIZE)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001890 .writeLong(json.optLong(
1891 DiskStatsFileLogger.APP_DATA_SIZE_AGG_KEY, /* fallback */ -1L))
1892 .writeLong(cacheTime)
1893 .build();
1894 pulledData.add(e);
1895
1896 e = StatsEvent.newBuilder()
1897 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001898 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__APP_CACHE_SIZE)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001899 .writeLong(json.optLong(
1900 DiskStatsFileLogger.APP_CACHE_AGG_KEY, /* fallback */ -1L))
1901 .writeLong(cacheTime)
1902 .build();
1903 pulledData.add(e);
1904
1905 e = StatsEvent.newBuilder()
1906 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001907 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__PHOTOS)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001908 .writeLong(json.optLong(
1909 DiskStatsFileLogger.PHOTOS_KEY, /* fallback */ -1L))
1910 .writeLong(cacheTime)
1911 .build();
1912 pulledData.add(e);
1913
1914 e = StatsEvent.newBuilder()
1915 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001916 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__VIDEOS)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001917 .writeLong(
1918 json.optLong(DiskStatsFileLogger.VIDEOS_KEY, /* fallback */ -1L))
1919 .writeLong(cacheTime)
1920 .build();
1921 pulledData.add(e);
1922
1923 e = StatsEvent.newBuilder()
1924 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001925 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__AUDIO)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001926 .writeLong(json.optLong(
1927 DiskStatsFileLogger.AUDIO_KEY, /* fallback */ -1L))
1928 .writeLong(cacheTime)
1929 .build();
1930 pulledData.add(e);
1931
1932 e = StatsEvent.newBuilder()
1933 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001934 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__DOWNLOADS)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001935 .writeLong(
1936 json.optLong(DiskStatsFileLogger.DOWNLOADS_KEY, /* fallback */ -1L))
1937 .writeLong(cacheTime)
1938 .build();
1939 pulledData.add(e);
1940
1941 e = StatsEvent.newBuilder()
Tej Singh5dd1dc92020-01-29 20:44:42 -08001942 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001943 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__SYSTEM)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001944 .writeLong(json.optLong(
1945 DiskStatsFileLogger.SYSTEM_KEY, /* fallback */ -1L))
1946 .writeLong(cacheTime)
1947 .build();
1948 pulledData.add(e);
1949
1950 e = StatsEvent.newBuilder()
1951 .setAtomId(atomTag)
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001952 .writeInt(FrameworkStatsLog.CATEGORY_SIZE__CATEGORY__OTHER)
Jeffrey Huange85d7ad2020-01-16 13:02:22 -08001953 .writeLong(json.optLong(
1954 DiskStatsFileLogger.MISC_KEY, /* fallback */ -1L))
1955 .writeLong(cacheTime)
1956 .build();
1957 pulledData.add(e);
1958 } catch (IOException | JSONException e) {
1959 Slog.e(TAG, "exception reading diskstats cache file", e);
1960 return StatsManager.PULL_SKIP;
1961 }
1962 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001963 }
1964
1965 private void registerNumFingerprintsEnrolled() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001966 int tagId = FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED;
Tej Singh72a70a82020-02-26 23:46:29 -08001967 mStatsManager.setPullAtomCallback(
Jeffrey Huang597a8862020-01-16 14:56:37 -08001968 tagId,
1969 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001970 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001971 mStatsCallbackImpl
Jeffrey Huang597a8862020-01-16 14:56:37 -08001972 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001973 }
1974
1975 private void registerNumFacesEnrolled() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08001976 int tagId = FrameworkStatsLog.NUM_FACES_ENROLLED;
Tej Singh72a70a82020-02-26 23:46:29 -08001977 mStatsManager.setPullAtomCallback(
Jeffrey Huang597a8862020-01-16 14:56:37 -08001978 tagId,
1979 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08001980 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08001981 mStatsCallbackImpl
Jeffrey Huang597a8862020-01-16 14:56:37 -08001982 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08001983 }
1984
Jeffrey Huang597a8862020-01-16 14:56:37 -08001985 private int pullNumBiometricsEnrolled(int modality, int atomTag, List<StatsEvent> pulledData) {
1986 final PackageManager pm = mContext.getPackageManager();
1987 FingerprintManager fingerprintManager = null;
1988 FaceManager faceManager = null;
1989
1990 if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
1991 fingerprintManager = mContext.getSystemService(FingerprintManager.class);
1992 }
1993 if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) {
1994 faceManager = mContext.getSystemService(FaceManager.class);
1995 }
1996
1997 if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT && fingerprintManager == null) {
1998 return StatsManager.PULL_SKIP;
1999 }
2000 if (modality == BiometricsProtoEnums.MODALITY_FACE && faceManager == null) {
2001 return StatsManager.PULL_SKIP;
2002 }
2003 UserManager userManager = mContext.getSystemService(UserManager.class);
2004 if (userManager == null) {
2005 return StatsManager.PULL_SKIP;
2006 }
2007
2008 final long token = Binder.clearCallingIdentity();
2009 try {
2010 for (UserInfo user : userManager.getUsers()) {
2011 final int userId = user.getUserHandle().getIdentifier();
2012 int numEnrolled = 0;
2013 if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT) {
2014 numEnrolled = fingerprintManager.getEnrolledFingerprints(userId).size();
2015 } else if (modality == BiometricsProtoEnums.MODALITY_FACE) {
2016 numEnrolled = faceManager.getEnrolledFaces(userId).size();
2017 } else {
2018 return StatsManager.PULL_SKIP;
2019 }
2020 StatsEvent e = StatsEvent.newBuilder()
2021 .setAtomId(atomTag)
2022 .writeInt(userId)
2023 .writeInt(numEnrolled)
2024 .build();
2025 pulledData.add(e);
2026 }
2027 } finally {
2028 Binder.restoreCallingIdentity(token);
2029 }
2030 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002031 }
2032
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002033 private void registerProcStats() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002034 int tagId = FrameworkStatsLog.PROC_STATS;
Tej Singh72a70a82020-02-26 23:46:29 -08002035 mStatsManager.setPullAtomCallback(
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002036 tagId,
2037 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002038 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002039 mStatsCallbackImpl
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002040 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002041 }
2042
2043 private void registerProcStatsPkgProc() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002044 int tagId = FrameworkStatsLog.PROC_STATS_PKG_PROC;
Tej Singh72a70a82020-02-26 23:46:29 -08002045 mStatsManager.setPullAtomCallback(
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002046 tagId,
2047 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002048 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002049 mStatsCallbackImpl
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002050 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002051 }
2052
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002053 private int pullProcStats(int section, int atomTag, List<StatsEvent> pulledData) {
2054 IProcessStats processStatsService = getIProcessStatsService();
2055 if (processStatsService == null) {
2056 return StatsManager.PULL_SKIP;
2057 }
2058
2059 synchronized (mProcessStatsLock) {
2060 final long token = Binder.clearCallingIdentity();
2061 try {
Richard Gaywood863a7212020-03-16 17:49:54 +00002062 // force procstats to flush & combine old files into one store
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002063 long lastHighWaterMark = readProcStatsHighWaterMark(section);
2064 List<ParcelFileDescriptor> statsFiles = new ArrayList<>();
Richard Gaywood863a7212020-03-16 17:49:54 +00002065
2066 ProcessStats procStats = new ProcessStats(false);
2067 long highWaterMark = processStatsService.getCommittedStatsMerged(
2068 lastHighWaterMark, section, true, statsFiles, procStats);
2069
2070 // aggregate the data together for westworld consumption
2071 ProtoOutputStream proto = new ProtoOutputStream();
2072 procStats.dumpAggregatedProtoForStatsd(proto);
2073
2074 StatsEvent e = StatsEvent.newBuilder()
2075 .setAtomId(atomTag)
2076 .writeByteArray(proto.getBytes())
2077 .build();
2078 pulledData.add(e);
2079
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002080 new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + lastHighWaterMark)
2081 .delete();
2082 new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + highWaterMark)
2083 .createNewFile();
Richard Gaywood863a7212020-03-16 17:49:54 +00002084 } catch (RemoteException | IOException e) {
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002085 Slog.e(TAG, "Getting procstats failed: ", e);
2086 return StatsManager.PULL_SKIP;
2087 } finally {
2088 Binder.restoreCallingIdentity(token);
2089 }
2090 }
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002091 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002092 }
2093
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002094 // read high watermark for section
2095 private long readProcStatsHighWaterMark(int section) {
2096 try {
2097 File[] files = mBaseDir.listFiles((d, name) -> {
2098 return name.toLowerCase().startsWith(String.valueOf(section) + '_');
2099 });
2100 if (files == null || files.length == 0) {
2101 return 0;
2102 }
2103 if (files.length > 1) {
2104 Slog.e(TAG, "Only 1 file expected for high water mark. Found " + files.length);
2105 }
2106 return Long.valueOf(files[0].getName().split("_")[1]);
2107 } catch (SecurityException e) {
2108 Slog.e(TAG, "Failed to get procstats high watermark file.", e);
2109 } catch (NumberFormatException e) {
2110 Slog.e(TAG, "Failed to parse file name.", e);
2111 }
2112 return 0;
2113 }
2114
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002115 private void registerDiskIO() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002116 int tagId = FrameworkStatsLog.DISK_IO;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002117 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002118 .setAdditiveFields(new int[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11})
Tej Singh72a70a82020-02-26 23:46:29 -08002119 .setCoolDownMillis(3 * MILLIS_PER_SEC)
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002120 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08002121 mStatsManager.setPullAtomCallback(
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002122 tagId,
2123 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002124 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002125 mStatsCallbackImpl
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002126 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002127 }
2128
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002129 int pullDiskIO(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002130 mStoragedUidIoStatsReader.readAbsolute((uid, fgCharsRead, fgCharsWrite, fgBytesRead,
2131 fgBytesWrite, bgCharsRead, bgCharsWrite, bgBytesRead, bgBytesWrite,
2132 fgFsync, bgFsync) -> {
2133 StatsEvent e = StatsEvent.newBuilder()
2134 .setAtomId(atomTag)
2135 .writeInt(uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002136 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huangfdc53692020-01-14 15:17:30 -08002137 .writeLong(fgCharsRead)
2138 .writeLong(fgCharsWrite)
2139 .writeLong(fgBytesRead)
2140 .writeLong(fgBytesWrite)
2141 .writeLong(bgCharsRead)
2142 .writeLong(bgCharsWrite)
2143 .writeLong(bgBytesRead)
2144 .writeLong(bgBytesWrite)
2145 .writeLong(fgFsync)
2146 .writeLong(bgFsync)
2147 .build();
2148 pulledData.add(e);
2149 });
2150 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002151 }
2152
2153 private void registerPowerProfile() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002154 int tagId = FrameworkStatsLog.POWER_PROFILE;
Tej Singh72a70a82020-02-26 23:46:29 -08002155 mStatsManager.setPullAtomCallback(
Jeffrey Huang1a3935c2020-01-13 10:51:17 -08002156 tagId,
2157 /* PullAtomMetadata */ null,
Tej Singh6b979832020-01-02 15:23:02 -08002158 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002159 mStatsCallbackImpl
Jeffrey Huang1a3935c2020-01-13 10:51:17 -08002160 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002161 }
2162
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002163 int pullPowerProfile(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang1a3935c2020-01-13 10:51:17 -08002164 PowerProfile powerProfile = new PowerProfile(mContext);
2165 ProtoOutputStream proto = new ProtoOutputStream();
2166 powerProfile.dumpDebug(proto);
2167 proto.flush();
2168 StatsEvent e = StatsEvent.newBuilder()
2169 .setAtomId(atomTag)
2170 .writeByteArray(proto.getBytes())
2171 .build();
2172 pulledData.add(e);
2173 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002174 }
2175
2176 private void registerProcessCpuTime() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002177 int tagId = FrameworkStatsLog.PROCESS_CPU_TIME;
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002178 // Min cool-down is 5 sec, in line with what ActivityManagerService uses.
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002179 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Tej Singh72a70a82020-02-26 23:46:29 -08002180 .setCoolDownMillis(5 * MILLIS_PER_SEC)
Jeffrey Huang7a9ae132020-01-14 15:44:58 -08002181 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08002182 mStatsManager.setPullAtomCallback(
Jeffrey Huang7a9ae132020-01-14 15:44:58 -08002183 tagId,
2184 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002185 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002186 mStatsCallbackImpl
Jeffrey Huang7a9ae132020-01-14 15:44:58 -08002187 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002188 }
2189
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002190 int pullProcessCpuTime(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang7a9ae132020-01-14 15:44:58 -08002191 synchronized (mCpuTrackerLock) {
2192 if (mProcessCpuTracker == null) {
2193 mProcessCpuTracker = new ProcessCpuTracker(false);
2194 mProcessCpuTracker.init();
2195 }
2196 mProcessCpuTracker.update();
2197 for (int i = 0; i < mProcessCpuTracker.countStats(); i++) {
2198 ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i);
2199 StatsEvent e = StatsEvent.newBuilder()
2200 .setAtomId(atomTag)
2201 .writeInt(st.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002202 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Jeffrey Huang7a9ae132020-01-14 15:44:58 -08002203 .writeString(st.name)
2204 .writeLong(st.base_utime)
2205 .writeLong(st.base_stime)
2206 .build();
2207 pulledData.add(e);
2208 }
2209 }
2210 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002211 }
2212
2213 private void registerCpuTimePerThreadFreq() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002214 int tagId = FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002215 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Jeffrey Huangbf4eef82020-01-16 15:38:58 -08002216 .setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21})
2217 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08002218 mStatsManager.setPullAtomCallback(
Jeffrey Huangbf4eef82020-01-16 15:38:58 -08002219 tagId,
2220 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002221 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002222 mStatsCallbackImpl
Jeffrey Huangbf4eef82020-01-16 15:38:58 -08002223 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002224 }
2225
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002226 int pullCpuTimePerThreadFreq(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huangbf4eef82020-01-16 15:38:58 -08002227 if (this.mKernelCpuThreadReader == null) {
2228 Slog.e(TAG, "mKernelCpuThreadReader is null");
2229 return StatsManager.PULL_SKIP;
2230 }
2231 ArrayList<KernelCpuThreadReader.ProcessCpuUsage> processCpuUsages =
2232 this.mKernelCpuThreadReader.getProcessCpuUsageDiffed();
2233 if (processCpuUsages == null) {
2234 Slog.e(TAG, "processCpuUsages is null");
2235 return StatsManager.PULL_SKIP;
2236 }
2237 int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz();
2238 if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) {
2239 String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES
2240 + " frequencies, but got " + cpuFrequencies.length;
2241 Slog.w(TAG, message);
2242 return StatsManager.PULL_SKIP;
2243 }
2244 for (int i = 0; i < processCpuUsages.size(); i++) {
2245 KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i);
2246 ArrayList<KernelCpuThreadReader.ThreadCpuUsage> threadCpuUsages =
2247 processCpuUsage.threadCpuUsages;
2248 for (int j = 0; j < threadCpuUsages.size(); j++) {
2249 KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j);
2250 if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) {
2251 String message = "Unexpected number of usage times,"
2252 + " expected " + cpuFrequencies.length
2253 + " but got " + threadCpuUsage.usageTimesMillis.length;
2254 Slog.w(TAG, message);
2255 return StatsManager.PULL_SKIP;
2256 }
2257
2258 StatsEvent.Builder e = StatsEvent.newBuilder();
2259 e.setAtomId(atomTag);
2260 e.writeInt(processCpuUsage.uid);
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002261 e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true);
Jeffrey Huangbf4eef82020-01-16 15:38:58 -08002262 e.writeInt(processCpuUsage.processId);
2263 e.writeInt(threadCpuUsage.threadId);
2264 e.writeString(processCpuUsage.processName);
2265 e.writeString(threadCpuUsage.threadName);
2266 for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) {
2267 if (k < cpuFrequencies.length) {
2268 e.writeInt(cpuFrequencies[k]);
2269 e.writeInt(threadCpuUsage.usageTimesMillis[k]);
2270 } else {
2271 // If we have no more frequencies to write, we still must write empty data.
2272 // We know that this data is empty (and not just zero) because all
2273 // frequencies are expected to be greater than zero
2274 e.writeInt(0);
2275 e.writeInt(0);
2276 }
2277 }
2278 pulledData.add(e.build());
2279 }
2280 }
2281 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002282 }
2283
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002284 private BatteryStatsHelper getBatteryStatsHelper() {
2285 if (mBatteryStatsHelper == null) {
2286 final long callingToken = Binder.clearCallingIdentity();
2287 try {
2288 // clearCallingIdentity required for BatteryStatsHelper.checkWifiOnly().
2289 mBatteryStatsHelper = new BatteryStatsHelper(mContext, false);
2290 } finally {
2291 Binder.restoreCallingIdentity(callingToken);
2292 }
2293 mBatteryStatsHelper.create((Bundle) null);
2294 }
2295 long currentTime = SystemClock.elapsedRealtime();
2296 if (currentTime - mBatteryStatsHelperTimestampMs >= MAX_BATTERY_STATS_HELPER_FREQUENCY_MS) {
2297 // Load BatteryStats and do all the calculations.
2298 mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.USER_ALL);
2299 // Calculations are done so we don't need to save the raw BatteryStats data in RAM.
2300 mBatteryStatsHelper.clearStats();
2301 mBatteryStatsHelperTimestampMs = currentTime;
2302 }
2303 return mBatteryStatsHelper;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002304 }
2305
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002306 private long milliAmpHrsToNanoAmpSecs(double mAh) {
2307 return (long) (mAh * MILLI_AMP_HR_TO_NANO_AMP_SECS + 0.5);
2308 }
2309
2310 private void registerDeviceCalculatedPowerUse() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002311 int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE;
Tej Singh72a70a82020-02-26 23:46:29 -08002312 mStatsManager.setPullAtomCallback(
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002313 tagId,
2314 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002315 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002316 mStatsCallbackImpl
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002317 );
2318 }
2319
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002320 int pullDeviceCalculatedPowerUse(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002321 BatteryStatsHelper bsHelper = getBatteryStatsHelper();
2322 StatsEvent e = StatsEvent.newBuilder()
2323 .setAtomId(atomTag)
2324 .writeLong(milliAmpHrsToNanoAmpSecs(bsHelper.getComputedPower()))
2325 .build();
2326 pulledData.add(e);
2327 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002328 }
2329
2330 private void registerDeviceCalculatedPowerBlameUid() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002331 int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID;
Tej Singh72a70a82020-02-26 23:46:29 -08002332 mStatsManager.setPullAtomCallback(
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002333 tagId,
2334 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002335 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002336 mStatsCallbackImpl
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002337 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002338 }
2339
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002340 int pullDeviceCalculatedPowerBlameUid(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002341 final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
2342 if (sippers == null) {
2343 return StatsManager.PULL_SKIP;
2344 }
2345
2346 for (BatterySipper bs : sippers) {
2347 if (bs.drainType != bs.drainType.APP) {
2348 continue;
2349 }
2350 StatsEvent e = StatsEvent.newBuilder()
2351 .setAtomId(atomTag)
2352 .writeInt(bs.uidObj.getUid())
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002353 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002354 .writeLong(milliAmpHrsToNanoAmpSecs(bs.totalPowerMah))
2355 .build();
2356 pulledData.add(e);
2357 }
2358 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002359 }
2360
2361 private void registerDeviceCalculatedPowerBlameOther() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002362 int tagId = FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER;
Tej Singh72a70a82020-02-26 23:46:29 -08002363 mStatsManager.setPullAtomCallback(
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002364 tagId,
2365 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002366 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002367 mStatsCallbackImpl
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002368 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002369 }
2370
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002371 int pullDeviceCalculatedPowerBlameOther(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi5ea31632020-01-13 16:42:12 -08002372 final List<BatterySipper> sippers = getBatteryStatsHelper().getUsageList();
2373 if (sippers == null) {
2374 return StatsManager.PULL_SKIP;
2375 }
2376
2377 for (BatterySipper bs : sippers) {
2378 if (bs.drainType == bs.drainType.APP) {
2379 continue; // This is a separate atom; see pullDeviceCalculatedPowerBlameUid().
2380 }
2381 if (bs.drainType == bs.drainType.USER) {
2382 continue; // This is not supported. We purposefully calculate over USER_ALL.
2383 }
2384 StatsEvent e = StatsEvent.newBuilder()
2385 .setAtomId(atomTag)
2386 .writeInt(bs.drainType.ordinal())
2387 .writeLong(milliAmpHrsToNanoAmpSecs(bs.totalPowerMah))
2388 .build();
2389 pulledData.add(e);
2390 }
2391 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002392 }
2393
2394 private void registerDebugElapsedClock() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002395 int tagId = FrameworkStatsLog.DEBUG_ELAPSED_CLOCK;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002396 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002397 .setAdditiveFields(new int[] {1, 2, 3, 4})
2398 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08002399 mStatsManager.setPullAtomCallback(
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002400 tagId,
2401 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002402 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002403 mStatsCallbackImpl
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002404 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002405 }
2406
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002407 int pullDebugElapsedClock(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002408 final long elapsedMillis = SystemClock.elapsedRealtime();
2409
2410 synchronized (mDebugElapsedClockLock) {
2411 final long clockDiffMillis = mDebugElapsedClockPreviousValue == 0
2412 ? 0 : elapsedMillis - mDebugElapsedClockPreviousValue;
2413
2414 StatsEvent e = StatsEvent.newBuilder()
2415 .setAtomId(atomTag)
2416 .writeLong(mDebugElapsedClockPullCount)
2417 .writeLong(elapsedMillis)
2418 // Log it twice to be able to test multi-value aggregation from ValueMetric.
2419 .writeLong(elapsedMillis)
2420 .writeLong(clockDiffMillis)
2421 .writeInt(1 /* always set */)
2422 .build();
2423 pulledData.add(e);
2424
2425 if (mDebugElapsedClockPullCount % 2 == 1) {
2426 StatsEvent e2 = StatsEvent.newBuilder()
2427 .setAtomId(atomTag)
2428 .writeLong(mDebugElapsedClockPullCount)
2429 .writeLong(elapsedMillis)
2430 // Log it twice to be able to test multi-value aggregation from ValueMetric.
2431 .writeLong(elapsedMillis)
2432 .writeLong(clockDiffMillis)
2433 .writeInt(2 /* set on odd pulls */)
2434 .build();
2435 pulledData.add(e2);
2436 }
2437
2438 mDebugElapsedClockPullCount++;
2439 mDebugElapsedClockPreviousValue = elapsedMillis;
2440 }
2441
2442 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002443 }
2444
2445 private void registerDebugFailingElapsedClock() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002446 int tagId = FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK;
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002447 PullAtomMetadata metadata = new PullAtomMetadata.Builder()
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002448 .setAdditiveFields(new int[] {1, 2, 3, 4})
2449 .build();
Tej Singh72a70a82020-02-26 23:46:29 -08002450 mStatsManager.setPullAtomCallback(
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002451 tagId,
2452 metadata,
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002453 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002454 mStatsCallbackImpl
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002455 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002456 }
2457
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002458 int pullDebugFailingElapsedClock(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogid428dfb2020-01-14 16:51:55 -08002459 final long elapsedMillis = SystemClock.elapsedRealtime();
2460
2461 synchronized (mDebugFailingElapsedClockLock) {
2462 // Fails every 5 buckets.
2463 if (mDebugFailingElapsedClockPullCount++ % 5 == 0) {
2464 mDebugFailingElapsedClockPreviousValue = elapsedMillis;
2465 Slog.e(TAG, "Failing debug elapsed clock");
2466 return StatsManager.PULL_SKIP;
2467 }
2468
2469 StatsEvent e = StatsEvent.newBuilder()
2470 .setAtomId(atomTag)
2471 .writeLong(mDebugFailingElapsedClockPullCount)
2472 .writeLong(elapsedMillis)
2473 // Log it twice to be able to test multi-value aggregation from ValueMetric.
2474 .writeLong(elapsedMillis)
2475 .writeLong(mDebugFailingElapsedClockPreviousValue == 0
2476 ? 0 : elapsedMillis - mDebugFailingElapsedClockPreviousValue)
2477 .build();
2478 pulledData.add(e);
2479
2480 mDebugFailingElapsedClockPreviousValue = elapsedMillis;
2481 }
2482
2483 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002484 }
2485
2486 private void registerBuildInformation() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002487 int tagId = FrameworkStatsLog.BUILD_INFORMATION;
Tej Singh72a70a82020-02-26 23:46:29 -08002488 mStatsManager.setPullAtomCallback(
Ruchir Rastogi425d8362020-01-14 23:51:46 -08002489 tagId,
2490 null, // use default PullAtomMetadata values
Tej Singh6b979832020-01-02 15:23:02 -08002491 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002492 mStatsCallbackImpl
Ruchir Rastogi425d8362020-01-14 23:51:46 -08002493 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002494 }
2495
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002496 int pullBuildInformation(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi425d8362020-01-14 23:51:46 -08002497 StatsEvent e = StatsEvent.newBuilder()
2498 .setAtomId(atomTag)
2499 .writeString(Build.FINGERPRINT)
2500 .writeString(Build.BRAND)
2501 .writeString(Build.PRODUCT)
2502 .writeString(Build.DEVICE)
Dianne Hackborndb007452019-10-28 16:34:22 -07002503 .writeString(Build.VERSION.RELEASE_OR_CODENAME)
Ruchir Rastogi425d8362020-01-14 23:51:46 -08002504 .writeString(Build.ID)
2505 .writeString(Build.VERSION.INCREMENTAL)
2506 .writeString(Build.TYPE)
2507 .writeString(Build.TAGS)
2508 .build();
2509 pulledData.add(e);
2510 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002511 }
2512
2513 private void registerRoleHolder() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002514 int tagId = FrameworkStatsLog.ROLE_HOLDER;
Tej Singh72a70a82020-02-26 23:46:29 -08002515 mStatsManager.setPullAtomCallback(
Ruchir Rastogie4fd3212020-01-15 00:39:12 -08002516 tagId,
2517 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002518 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002519 mStatsCallbackImpl
Ruchir Rastogie4fd3212020-01-15 00:39:12 -08002520 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002521 }
2522
Ruchir Rastogie4fd3212020-01-15 00:39:12 -08002523 // Add a RoleHolder atom for each package that holds a role.
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002524 int pullRoleHolder(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogie4fd3212020-01-15 00:39:12 -08002525 long callingToken = Binder.clearCallingIdentity();
2526 try {
2527 PackageManager pm = mContext.getPackageManager();
2528 RoleManagerInternal rmi = LocalServices.getService(RoleManagerInternal.class);
2529
2530 List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
2531
2532 int numUsers = users.size();
2533 for (int userNum = 0; userNum < numUsers; userNum++) {
2534 int userId = users.get(userNum).getUserHandle().getIdentifier();
2535
2536 ArrayMap<String, ArraySet<String>> roles = rmi.getRolesAndHolders(userId);
2537
2538 int numRoles = roles.size();
2539 for (int roleNum = 0; roleNum < numRoles; roleNum++) {
2540 String roleName = roles.keyAt(roleNum);
2541 ArraySet<String> holders = roles.valueAt(roleNum);
2542
2543 int numHolders = holders.size();
2544 for (int holderNum = 0; holderNum < numHolders; holderNum++) {
2545 String holderName = holders.valueAt(holderNum);
2546
2547 PackageInfo pkg;
2548 try {
2549 pkg = pm.getPackageInfoAsUser(holderName, 0, userId);
2550 } catch (PackageManager.NameNotFoundException e) {
2551 Slog.w(TAG, "Role holder " + holderName + " not found");
2552 return StatsManager.PULL_SKIP;
2553 }
2554
2555 StatsEvent e = StatsEvent.newBuilder()
2556 .setAtomId(atomTag)
2557 .writeInt(pkg.applicationInfo.uid)
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002558 .addBooleanAnnotation(ANNOTATION_ID_IS_UID, true)
Ruchir Rastogie4fd3212020-01-15 00:39:12 -08002559 .writeString(holderName)
2560 .writeString(roleName)
2561 .build();
2562 pulledData.add(e);
2563 }
2564 }
2565 }
2566 } finally {
2567 Binder.restoreCallingIdentity(callingToken);
2568 }
2569 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002570 }
2571
2572 private void registerDangerousPermissionState() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002573 int tagId = FrameworkStatsLog.DANGEROUS_PERMISSION_STATE;
Tej Singh72a70a82020-02-26 23:46:29 -08002574 mStatsManager.setPullAtomCallback(
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002575 tagId,
2576 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002577 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002578 mStatsCallbackImpl
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002579 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002580 }
2581
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002582 int pullDangerousPermissionState(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002583 final long token = Binder.clearCallingIdentity();
2584 Set<Integer> reportedUids = new HashSet<>();
2585 try {
2586 PackageManager pm = mContext.getPackageManager();
2587
2588 List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
2589
2590 int numUsers = users.size();
2591 for (int userNum = 0; userNum < numUsers; userNum++) {
2592 UserHandle user = users.get(userNum).getUserHandle();
2593
2594 List<PackageInfo> pkgs = pm.getInstalledPackagesAsUser(
2595 PackageManager.GET_PERMISSIONS, user.getIdentifier());
2596
2597 int numPkgs = pkgs.size();
2598 for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
2599 PackageInfo pkg = pkgs.get(pkgNum);
2600
2601 if (pkg.requestedPermissions == null) {
2602 continue;
2603 }
2604
2605 if (reportedUids.contains(pkg.applicationInfo.uid)) {
2606 // do not report same uid twice
2607 continue;
2608 }
2609 reportedUids.add(pkg.applicationInfo.uid);
2610
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002611 if (atomTag == FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED
Stanislav Zholnin39307b02020-01-28 15:47:43 +00002612 && ThreadLocalRandom.current().nextFloat() > 0.01f) {
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002613 continue;
2614 }
2615
2616 int numPerms = pkg.requestedPermissions.length;
2617 for (int permNum = 0; permNum < numPerms; permNum++) {
2618 String permName = pkg.requestedPermissions[permNum];
2619
2620 PermissionInfo permissionInfo;
2621 int permissionFlags = 0;
2622 try {
2623 permissionInfo = pm.getPermissionInfo(permName, 0);
2624 permissionFlags =
2625 pm.getPermissionFlags(permName, pkg.packageName, user);
2626 } catch (PackageManager.NameNotFoundException ignored) {
2627 continue;
2628 }
2629
2630 if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) {
2631 continue;
2632 }
2633
Stanislav Zholnindbcf85e2020-02-24 18:17:55 +00002634 if (permName.startsWith(COMMON_PERMISSION_PREFIX)) {
2635 permName = permName.substring(COMMON_PERMISSION_PREFIX.length());
2636 }
2637
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002638 StatsEvent.Builder e = StatsEvent.newBuilder();
2639 e.setAtomId(atomTag);
2640 e.writeString(permName);
2641 e.writeInt(pkg.applicationInfo.uid);
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002642 e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true);
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002643 if (atomTag == FrameworkStatsLog.DANGEROUS_PERMISSION_STATE) {
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08002644 e.writeString("");
2645 }
2646 e.writeBoolean((pkg.requestedPermissionsFlags[permNum]
2647 & REQUESTED_PERMISSION_GRANTED) != 0);
2648 e.writeInt(permissionFlags);
2649
2650 pulledData.add(e.build());
2651 }
2652 }
2653 }
2654 } catch (Throwable t) {
2655 Log.e(TAG, "Could not read permissions", t);
2656 return StatsManager.PULL_SKIP;
2657 } finally {
2658 Binder.restoreCallingIdentity(token);
2659 }
2660 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002661 }
2662
2663 private void registerTimeZoneDataInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002664 int tagId = FrameworkStatsLog.TIME_ZONE_DATA_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08002665 mStatsManager.setPullAtomCallback(
Ruchir Rastogibd2c4ba2020-01-15 14:48:36 -08002666 tagId,
2667 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002668 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002669 mStatsCallbackImpl
Ruchir Rastogibd2c4ba2020-01-15 14:48:36 -08002670 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002671 }
2672
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002673 int pullTimeZoneDataInfo(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogibd2c4ba2020-01-15 14:48:36 -08002674 String tzDbVersion = "Unknown";
2675 try {
2676 tzDbVersion = android.icu.util.TimeZone.getTZDataVersion();
2677 } catch (MissingResourceException e) {
2678 Slog.e(TAG, "Getting tzdb version failed: ", e);
2679 return StatsManager.PULL_SKIP;
2680 }
2681
2682 StatsEvent e = StatsEvent.newBuilder()
2683 .setAtomId(atomTag)
2684 .writeString(tzDbVersion)
2685 .build();
2686 pulledData.add(e);
2687 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002688 }
2689
2690 private void registerExternalStorageInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002691 int tagId = FrameworkStatsLog.EXTERNAL_STORAGE_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08002692 mStatsManager.setPullAtomCallback(
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002693 tagId,
2694 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002695 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002696 mStatsCallbackImpl
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002697 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002698 }
2699
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002700 int pullExternalStorageInfo(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002701 if (mStorageManager == null) {
2702 return StatsManager.PULL_SKIP;
2703 }
2704
2705 List<VolumeInfo> volumes = mStorageManager.getVolumes();
2706 for (VolumeInfo vol : volumes) {
2707 final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
2708 final DiskInfo diskInfo = vol.getDisk();
2709 if (diskInfo != null && envState.equals(Environment.MEDIA_MOUNTED)) {
2710 // Get the type of the volume, if it is adoptable or portable.
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002711 int volumeType = FrameworkStatsLog.EXTERNAL_STORAGE_INFO__VOLUME_TYPE__OTHER;
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002712 if (vol.getType() == TYPE_PUBLIC) {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002713 volumeType = FrameworkStatsLog.EXTERNAL_STORAGE_INFO__VOLUME_TYPE__PUBLIC;
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002714 } else if (vol.getType() == TYPE_PRIVATE) {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002715 volumeType = FrameworkStatsLog.EXTERNAL_STORAGE_INFO__VOLUME_TYPE__PRIVATE;
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002716 }
2717
2718 // Get the type of external storage inserted in the device (sd cards, usb, etc.)
2719 int externalStorageType;
2720 if (diskInfo.isSd()) {
2721 externalStorageType = StorageEnums.SD_CARD;
2722 } else if (diskInfo.isUsb()) {
2723 externalStorageType = StorageEnums.USB;
2724 } else {
2725 externalStorageType = StorageEnums.OTHER;
2726 }
2727
2728 StatsEvent e = StatsEvent.newBuilder()
2729 .setAtomId(atomTag)
2730 .writeInt(externalStorageType)
2731 .writeInt(volumeType)
2732 .writeLong(diskInfo.size)
2733 .build();
2734 pulledData.add(e);
2735 }
2736 }
2737 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002738 }
2739
2740 private void registerAppsOnExternalStorageInfo() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002741 int tagId = FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO;
Tej Singh72a70a82020-02-26 23:46:29 -08002742 mStatsManager.setPullAtomCallback(
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002743 tagId,
2744 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002745 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002746 mStatsCallbackImpl
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002747 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002748 }
2749
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002750 int pullAppsOnExternalStorageInfo(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi6fc44a82020-01-17 10:22:41 -08002751 if (mStorageManager == null) {
2752 return StatsManager.PULL_SKIP;
2753 }
2754
2755 PackageManager pm = mContext.getPackageManager();
2756 List<ApplicationInfo> apps = pm.getInstalledApplications(/*flags=*/ 0);
2757 for (ApplicationInfo appInfo : apps) {
2758 UUID storageUuid = appInfo.storageUuid;
2759 if (storageUuid == null) {
2760 continue;
2761 }
2762
2763 VolumeInfo volumeInfo = mStorageManager.findVolumeByUuid(
2764 appInfo.storageUuid.toString());
2765 if (volumeInfo == null) {
2766 continue;
2767 }
2768
2769 DiskInfo diskInfo = volumeInfo.getDisk();
2770 if (diskInfo == null) {
2771 continue;
2772 }
2773
2774 int externalStorageType = -1;
2775 if (diskInfo.isSd()) {
2776 externalStorageType = StorageEnums.SD_CARD;
2777 } else if (diskInfo.isUsb()) {
2778 externalStorageType = StorageEnums.USB;
2779 } else if (appInfo.isExternal()) {
2780 externalStorageType = StorageEnums.OTHER;
2781 }
2782
2783 // App is installed on external storage.
2784 if (externalStorageType != -1) {
2785 StatsEvent e = StatsEvent.newBuilder()
2786 .setAtomId(atomTag)
2787 .writeInt(externalStorageType)
2788 .writeString(appInfo.packageName)
2789 .build();
2790 pulledData.add(e);
2791 }
2792 }
2793 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002794 }
2795
2796 private void registerFaceSettings() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002797 int tagId = FrameworkStatsLog.FACE_SETTINGS;
Tej Singh72a70a82020-02-26 23:46:29 -08002798 mStatsManager.setPullAtomCallback(
Ruchir Rastogi329c7672020-01-17 15:33:05 -08002799 tagId,
2800 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002801 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002802 mStatsCallbackImpl
Ruchir Rastogi329c7672020-01-17 15:33:05 -08002803 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002804 }
2805
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002806 int pullFaceSettings(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi329c7672020-01-17 15:33:05 -08002807 final long callingToken = Binder.clearCallingIdentity();
2808 try {
2809 List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
2810 int numUsers = users.size();
2811 for (int userNum = 0; userNum < numUsers; userNum++) {
2812 int userId = users.get(userNum).getUserHandle().getIdentifier();
2813
2814 int unlockKeyguardEnabled = Settings.Secure.getIntForUser(
2815 mContext.getContentResolver(),
2816 Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED, 1, userId);
2817 int unlockDismissesKeyguard = Settings.Secure.getIntForUser(
2818 mContext.getContentResolver(),
2819 Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, 0, userId);
2820 int unlockAttentionRequired = Settings.Secure.getIntForUser(
2821 mContext.getContentResolver(),
2822 Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, 1, userId);
2823 int unlockAppEnabled = Settings.Secure.getIntForUser(
2824 mContext.getContentResolver(),
2825 Settings.Secure.FACE_UNLOCK_APP_ENABLED, 1, userId);
2826 int unlockAlwaysRequireConfirmation = Settings.Secure.getIntForUser(
2827 mContext.getContentResolver(),
2828 Settings.Secure.FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, 0, userId);
2829 int unlockDiversityRequired = Settings.Secure.getIntForUser(
2830 mContext.getContentResolver(),
2831 Settings.Secure.FACE_UNLOCK_DIVERSITY_REQUIRED, 1, userId);
2832
2833 StatsEvent e = StatsEvent.newBuilder()
2834 .setAtomId(atomTag)
2835 .writeBoolean(unlockKeyguardEnabled != 0)
2836 .writeBoolean(unlockDismissesKeyguard != 0)
2837 .writeBoolean(unlockAttentionRequired != 0)
2838 .writeBoolean(unlockAppEnabled != 0)
2839 .writeBoolean(unlockAlwaysRequireConfirmation != 0)
2840 .writeBoolean(unlockDiversityRequired != 0)
2841 .build();
2842 pulledData.add(e);
2843 }
2844 } finally {
2845 Binder.restoreCallingIdentity(callingToken);
2846 }
2847 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002848 }
2849
2850 private void registerAppOps() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08002851 int tagId = FrameworkStatsLog.APP_OPS;
Tej Singh72a70a82020-02-26 23:46:29 -08002852 mStatsManager.setPullAtomCallback(
Ruchir Rastogi97050e1c2020-01-15 17:25:00 -08002853 tagId,
2854 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08002855 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002856 mStatsCallbackImpl
Ruchir Rastogi97050e1c2020-01-15 17:25:00 -08002857 );
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002858 }
2859
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00002860 private void registerRuntimeAppOpAccessMessage() {
2861 int tagId = FrameworkStatsLog.RUNTIME_APP_OP_ACCESS;
Tej Singh72a70a82020-02-26 23:46:29 -08002862 mStatsManager.setPullAtomCallback(
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00002863 tagId,
2864 null, // use default PullAtomMetadata values
2865 BackgroundThread.getExecutor(),
2866 mStatsCallbackImpl
2867 );
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00002868 }
2869
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08002870 int pullAppOps(int atomTag, List<StatsEvent> pulledData) {
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08002871 final long token = Binder.clearCallingIdentity();
Ruchir Rastogi97050e1c2020-01-15 17:25:00 -08002872 try {
2873 AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
2874
2875 CompletableFuture<HistoricalOps> ops = new CompletableFuture<>();
Stanislav Zholnin050abc32020-02-17 14:14:52 +00002876 HistoricalOpsRequest histOpsRequest = new HistoricalOpsRequest.Builder(0,
2877 Long.MAX_VALUE).setFlags(OP_FLAGS_PULLED).build();
Ruchir Rastogi97050e1c2020-01-15 17:25:00 -08002878 appOps.getHistoricalOps(histOpsRequest, mContext.getMainExecutor(), ops::complete);
2879
2880 HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS,
2881 TimeUnit.MILLISECONDS);
Stanislav Zholnin59199132020-03-06 14:19:25 +00002882 processHistoricalOps(histOps, atomTag, pulledData);
Ruchir Rastogi97050e1c2020-01-15 17:25:00 -08002883 } catch (Throwable t) {
2884 // TODO: catch exceptions at a more granular level
2885 Slog.e(TAG, "Could not read appops", t);
2886 return StatsManager.PULL_SKIP;
2887 } finally {
2888 Binder.restoreCallingIdentity(token);
2889 }
2890 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08002891 }
2892
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002893 private void registerAttributedAppOps() {
2894 int tagId = FrameworkStatsLog.ATTRIBUTED_APP_OPS;
Tej Singh72a70a82020-02-26 23:46:29 -08002895 mStatsManager.setPullAtomCallback(
Stanislav Zholnin7dcc51d2020-01-29 16:53:24 +00002896 tagId,
2897 null, // use default PullAtomMetadata values
2898 BackgroundThread.getExecutor(),
2899 mStatsCallbackImpl
2900 );
2901 }
2902
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002903 int pullAttributedAppOps(int atomTag, List<StatsEvent> pulledData) {
Stanislav Zholnin7dcc51d2020-01-29 16:53:24 +00002904 final long token = Binder.clearCallingIdentity();
2905 try {
2906 AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
2907
2908 CompletableFuture<HistoricalOps> ops = new CompletableFuture<>();
2909 HistoricalOpsRequest histOpsRequest =
2910 new HistoricalOpsRequest.Builder(0, Long.MAX_VALUE).setFlags(
2911 OP_FLAGS_PULLED).build();
2912 appOps.getHistoricalOps(histOpsRequest, mContext.getMainExecutor(), ops::complete);
Stanislav Zholnin7dcc51d2020-01-29 16:53:24 +00002913 HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS,
2914 TimeUnit.MILLISECONDS);
Stanislav Zholnin59199132020-03-06 14:19:25 +00002915 if (mAppOpsSamplingRate == 0) {
2916 mAppOpsSamplingRate = constrain((5000 * 100) / estimateAppOpsSize(), 1, 100);
Stanislav Zholnin7dcc51d2020-01-29 16:53:24 +00002917 }
Stanislav Zholnin59199132020-03-06 14:19:25 +00002918 processHistoricalOps(histOps, atomTag, pulledData);
Stanislav Zholnin7dcc51d2020-01-29 16:53:24 +00002919 } catch (Throwable t) {
2920 // TODO: catch exceptions at a more granular level
2921 Slog.e(TAG, "Could not read appops", t);
2922 return StatsManager.PULL_SKIP;
2923 } finally {
2924 Binder.restoreCallingIdentity(token);
2925 }
2926 return StatsManager.PULL_SUCCESS;
2927 }
2928
Stanislav Zholnin59199132020-03-06 14:19:25 +00002929 private int estimateAppOpsSize() throws Exception {
2930 AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
2931
2932 CompletableFuture<HistoricalOps> ops = new CompletableFuture<>();
2933 HistoricalOpsRequest histOpsRequest =
2934 new HistoricalOpsRequest.Builder(
2935 Instant.now().minus(1, ChronoUnit.DAYS).toEpochMilli(),
2936 Long.MAX_VALUE).setFlags(
2937 OP_FLAGS_PULLED).build();
2938 appOps.getHistoricalOps(histOpsRequest, mContext.getMainExecutor(), ops::complete);
2939 HistoricalOps histOps = ops.get(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS,
2940 TimeUnit.MILLISECONDS);
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002941 return processHistoricalOps(histOps, FrameworkStatsLog.ATTRIBUTED_APP_OPS, null);
Stanislav Zholnin59199132020-03-06 14:19:25 +00002942 }
2943
2944 int processHistoricalOps(HistoricalOps histOps, int atomTag, List<StatsEvent> pulledData) {
2945 int counter = 0;
2946 for (int uidIdx = 0; uidIdx < histOps.getUidCount(); uidIdx++) {
2947 final HistoricalUidOps uidOps = histOps.getUidOpsAt(uidIdx);
2948 final int uid = uidOps.getUid();
2949 for (int pkgIdx = 0; pkgIdx < uidOps.getPackageCount(); pkgIdx++) {
2950 final HistoricalPackageOps packageOps = uidOps.getPackageOpsAt(pkgIdx);
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002951 if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) {
2952 for (int attributionIdx = 0;
2953 attributionIdx < packageOps.getAttributedOpsCount(); attributionIdx++) {
2954 final AppOpsManager.AttributedHistoricalOps attributedOps =
2955 packageOps.getAttributedOpsAt(attributionIdx);
2956 for (int opIdx = 0; opIdx < attributedOps.getOpCount(); opIdx++) {
2957 final AppOpsManager.HistoricalOp op = attributedOps.getOpAt(opIdx);
Stanislav Zholnin59199132020-03-06 14:19:25 +00002958 counter += processHistoricalOp(op, atomTag, pulledData, uid,
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002959 packageOps.getPackageName(), attributedOps.getTag());
Stanislav Zholnin59199132020-03-06 14:19:25 +00002960 }
2961 }
2962 } else if (atomTag == FrameworkStatsLog.APP_OPS) {
2963 for (int opIdx = 0; opIdx < packageOps.getOpCount(); opIdx++) {
2964 final AppOpsManager.HistoricalOp op = packageOps.getOpAt(opIdx);
2965 counter += processHistoricalOp(op, atomTag, pulledData, uid,
2966 packageOps.getPackageName(), null);
2967 }
2968 }
2969 }
2970 }
2971 return counter;
2972 }
2973
2974 private int processHistoricalOp(AppOpsManager.HistoricalOp op, int atomTag,
2975 @Nullable List<StatsEvent> pulledData, int uid, String packageName,
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002976 @Nullable String attributionTag) {
2977 if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) {
Stanislav Zholnin59199132020-03-06 14:19:25 +00002978 if (pulledData == null) { // this is size estimation call
2979 if (op.getForegroundAccessCount(OP_FLAGS_PULLED) + op.getBackgroundAccessCount(
2980 OP_FLAGS_PULLED) == 0) {
2981 return 0;
2982 } else {
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002983 return 32 + packageName.length() + (attributionTag == null ? 1
2984 : attributionTag.length());
Stanislav Zholnin59199132020-03-06 14:19:25 +00002985 }
2986 } else {
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002987 if (abs((op.getOpCode() + attributionTag + packageName).hashCode() + RANDOM_SEED)
2988 % 100 >= mAppOpsSamplingRate) {
Stanislav Zholnin59199132020-03-06 14:19:25 +00002989 return 0;
2990 }
2991 }
2992 }
2993
2994 StatsEvent.Builder e = StatsEvent.newBuilder();
2995 e.setAtomId(atomTag);
2996 e.writeInt(uid);
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07002997 e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true);
Stanislav Zholnin59199132020-03-06 14:19:25 +00002998 e.writeString(packageName);
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08002999 if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) {
3000 e.writeString(attributionTag);
Stanislav Zholnin59199132020-03-06 14:19:25 +00003001 }
Stanislav Zholnind5378e92020-03-15 18:37:12 +00003002 e.writeInt(op.getOpCode());
Stanislav Zholnin59199132020-03-06 14:19:25 +00003003 e.writeLong(op.getForegroundAccessCount(OP_FLAGS_PULLED));
3004 e.writeLong(op.getBackgroundAccessCount(OP_FLAGS_PULLED));
3005 e.writeLong(op.getForegroundRejectCount(OP_FLAGS_PULLED));
3006 e.writeLong(op.getBackgroundRejectCount(OP_FLAGS_PULLED));
3007 e.writeLong(op.getForegroundAccessDuration(OP_FLAGS_PULLED));
3008 e.writeLong(op.getBackgroundAccessDuration(OP_FLAGS_PULLED));
3009
3010 String perm = AppOpsManager.opToPermission(op.getOpCode());
3011 if (perm == null) {
3012 e.writeBoolean(false);
3013 } else {
3014 PermissionInfo permInfo;
3015 try {
3016 permInfo = mContext.getPackageManager().getPermissionInfo(
3017 perm,
3018 0);
3019 e.writeBoolean(
3020 permInfo.getProtection() == PROTECTION_DANGEROUS);
3021 } catch (PackageManager.NameNotFoundException exception) {
3022 e.writeBoolean(false);
3023 }
3024 }
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08003025 if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) {
Stanislav Zholnin59199132020-03-06 14:19:25 +00003026 e.writeInt(mAppOpsSamplingRate);
3027 }
3028 pulledData.add(e.build());
3029 return 0;
3030 }
3031
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00003032 int pullRuntimeAppOpAccessMessage(int atomTag, List<StatsEvent> pulledData) {
3033 final long token = Binder.clearCallingIdentity();
3034 try {
3035 AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class);
3036
3037 RuntimeAppOpAccessMessage message = appOps.collectRuntimeAppOpAccessMessage();
3038 if (message == null) {
3039 Slog.i(TAG, "No runtime appop access message collected");
3040 return StatsManager.PULL_SUCCESS;
3041 }
3042
3043 StatsEvent.Builder e = StatsEvent.newBuilder();
3044 e.setAtomId(atomTag);
3045 e.writeInt(message.getUid());
Muhammad Qureshi22e52da2020-03-30 21:14:21 -07003046 e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true);
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00003047 e.writeString(message.getPackageName());
Stanislav Zholnin3a2a6e42020-03-30 10:44:51 +01003048 e.writeString("");
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08003049 if (message.getAttributionTag() == null) {
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00003050 e.writeString("");
3051 } else {
Philip P. Moltmann12ac3f42020-03-05 15:01:29 -08003052 e.writeString(message.getAttributionTag());
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00003053 }
3054 e.writeString(message.getMessage());
3055 e.writeInt(message.getSamplingStrategy());
Stanislav Zholnin3a2a6e42020-03-30 10:44:51 +01003056 e.writeInt(AppOpsManager.strOpToOp(message.getOp()));
Stanislav Zholnindf3eeac2020-02-17 18:06:07 +00003057
3058 pulledData.add(e.build());
3059 } catch (Throwable t) {
3060 // TODO: catch exceptions at a more granular level
3061 Slog.e(TAG, "Could not read runtime appop access message", t);
3062 return StatsManager.PULL_SKIP;
3063 } finally {
3064 Binder.restoreCallingIdentity(token);
3065 }
3066 return StatsManager.PULL_SUCCESS;
3067 }
3068
Jeffrey Huang730bf962020-01-16 15:59:52 -08003069 static void unpackStreamedData(int atomTag, List<StatsEvent> pulledData,
3070 List<ParcelFileDescriptor> statsFiles) throws IOException {
3071 InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(statsFiles.get(0));
3072 int[] len = new int[1];
3073 byte[] stats = readFully(stream, len);
3074 StatsEvent e = StatsEvent.newBuilder()
3075 .setAtomId(atomTag)
3076 .writeByteArray(Arrays.copyOf(stats, len[0]))
3077 .build();
3078 pulledData.add(e);
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08003079 }
3080
Jeffrey Huang730bf962020-01-16 15:59:52 -08003081 static byte[] readFully(InputStream stream, int[] outLen) throws IOException {
3082 int pos = 0;
3083 final int initialAvail = stream.available();
3084 byte[] data = new byte[initialAvail > 0 ? (initialAvail + 1) : 16384];
3085 while (true) {
3086 int amt = stream.read(data, pos, data.length - pos);
3087 if (DEBUG) {
3088 Slog.i(TAG, "Read " + amt + " bytes at " + pos + " of avail " + data.length);
3089 }
3090 if (amt < 0) {
3091 if (DEBUG) {
3092 Slog.i(TAG, "**** FINISHED READING: pos=" + pos + " len=" + data.length);
3093 }
3094 outLen[0] = pos;
3095 return data;
3096 }
3097 pos += amt;
3098 if (pos >= data.length) {
3099 byte[] newData = new byte[pos + 16384];
3100 if (DEBUG) {
3101 Slog.i(TAG, "Copying " + pos + " bytes to new array len " + newData.length);
3102 }
3103 System.arraycopy(data, 0, newData, 0, pos);
3104 data = newData;
3105 }
3106 }
3107 }
3108
3109 private void registerNotificationRemoteViews() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08003110 int tagId = FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS;
Tej Singh72a70a82020-02-26 23:46:29 -08003111 mStatsManager.setPullAtomCallback(
Jeffrey Huang730bf962020-01-16 15:59:52 -08003112 tagId,
3113 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08003114 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08003115 mStatsCallbackImpl
Jeffrey Huang730bf962020-01-16 15:59:52 -08003116 );
3117 }
3118
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08003119 int pullNotificationRemoteViews(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang730bf962020-01-16 15:59:52 -08003120 INotificationManager notificationManagerService = getINotificationManagerService();
3121 if (notificationManagerService == null) {
3122 return StatsManager.PULL_SKIP;
3123 }
3124 final long callingToken = Binder.clearCallingIdentity();
3125 try {
Ruchir Rastogi92cf9a22020-01-17 15:55:39 -08003126 // determine last pull tine. Copy file trick from pullProcStats?
Jeffrey Huang730bf962020-01-16 15:59:52 -08003127 long wallClockNanos = SystemClock.currentTimeMicro() * 1000L;
3128 long lastNotificationStatsNs = wallClockNanos -
3129 TimeUnit.NANOSECONDS.convert(1, TimeUnit.DAYS);
3130
3131 List<ParcelFileDescriptor> statsFiles = new ArrayList<>();
3132 notificationManagerService.pullStats(lastNotificationStatsNs,
3133 NotificationManagerService.REPORT_REMOTE_VIEWS, true, statsFiles);
3134 if (statsFiles.size() != 1) {
3135 return StatsManager.PULL_SKIP;
3136 }
3137 unpackStreamedData(atomTag, pulledData, statsFiles);
3138 } catch (IOException e) {
3139 Slog.e(TAG, "Getting notistats failed: ", e);
3140 return StatsManager.PULL_SKIP;
3141 } catch (RemoteException e) {
3142 Slog.e(TAG, "Getting notistats failed: ", e);
3143 return StatsManager.PULL_SKIP;
3144 } catch (SecurityException e) {
3145 Slog.e(TAG, "Getting notistats failed: ", e);
3146 return StatsManager.PULL_SKIP;
3147 } finally {
3148 Binder.restoreCallingIdentity(callingToken);
3149 }
3150 return StatsManager.PULL_SUCCESS;
Jeffrey Huangfdd3c7c2020-01-09 13:54:24 -08003151 }
3152
3153 private void registerDangerousPermissionStateSampled() {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08003154 int tagId = FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED;
Tej Singh72a70a82020-02-26 23:46:29 -08003155 mStatsManager.setPullAtomCallback(
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08003156 tagId,
3157 null, // use default PullAtomMetadata values
Jeffrey Huanga85d8f92020-01-24 13:28:45 -08003158 BackgroundThread.getExecutor(),
Jeffrey Huang8fb5b832020-01-27 13:20:16 -08003159 mStatsCallbackImpl
Jeffrey Huang7f9fe502020-01-16 16:47:22 -08003160 );
Tej Singh953ad862020-01-03 12:47:07 -08003161 }
Jeffrey Huangbf130832020-01-22 15:48:26 -08003162
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003163 private void registerBatteryLevel() {
3164 int tagId = FrameworkStatsLog.BATTERY_LEVEL;
Tej Singh72a70a82020-02-26 23:46:29 -08003165 mStatsManager.setPullAtomCallback(
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003166 tagId,
3167 null, // use default PullAtomMetadata values
3168 BackgroundThread.getExecutor(),
3169 mStatsCallbackImpl
3170 );
3171 }
3172
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003173 private void registerRemainingBatteryCapacity() {
3174 int tagId = FrameworkStatsLog.REMAINING_BATTERY_CAPACITY;
Tej Singh72a70a82020-02-26 23:46:29 -08003175 mStatsManager.setPullAtomCallback(
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003176 tagId,
3177 null, // use default PullAtomMetadata values
3178 BackgroundThread.getExecutor(),
3179 mStatsCallbackImpl
3180 );
3181 }
3182
3183 private void registerFullBatteryCapacity() {
3184 int tagId = FrameworkStatsLog.FULL_BATTERY_CAPACITY;
Tej Singh72a70a82020-02-26 23:46:29 -08003185 mStatsManager.setPullAtomCallback(
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003186 tagId,
3187 null, // use default PullAtomMetadata values
3188 BackgroundThread.getExecutor(),
3189 mStatsCallbackImpl
3190 );
3191 }
3192
3193 private void registerBatteryVoltage() {
3194 int tagId = FrameworkStatsLog.BATTERY_VOLTAGE;
Tej Singh72a70a82020-02-26 23:46:29 -08003195 mStatsManager.setPullAtomCallback(
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003196 tagId,
3197 null, // use default PullAtomMetadata values
3198 BackgroundThread.getExecutor(),
3199 mStatsCallbackImpl
3200 );
3201 }
3202
3203 private void registerBatteryCycleCount() {
3204 int tagId = FrameworkStatsLog.BATTERY_CYCLE_COUNT;
Tej Singh72a70a82020-02-26 23:46:29 -08003205 mStatsManager.setPullAtomCallback(
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003206 tagId,
3207 null, // use default PullAtomMetadata values
3208 BackgroundThread.getExecutor(),
3209 mStatsCallbackImpl
3210 );
3211 }
3212
3213 int pullHealthHal(int atomTag, List<StatsEvent> pulledData) {
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003214 IHealth healthService = mHealthService.getLastService();
3215 if (healthService == null) {
3216 return StatsManager.PULL_SKIP;
3217 }
3218 try {
3219 healthService.getHealthInfo((result, value) -> {
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003220 int pulledValue;
3221 switch(atomTag) {
3222 case FrameworkStatsLog.BATTERY_LEVEL:
3223 pulledValue = value.legacy.batteryLevel;
3224 break;
3225 case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY:
3226 pulledValue = value.legacy.batteryChargeCounter;
3227 break;
3228 case FrameworkStatsLog.FULL_BATTERY_CAPACITY:
3229 pulledValue = value.legacy.batteryFullCharge;
3230 break;
3231 case FrameworkStatsLog.BATTERY_VOLTAGE:
3232 pulledValue = value.legacy.batteryVoltage;
3233 break;
3234 case FrameworkStatsLog.BATTERY_CYCLE_COUNT:
3235 pulledValue = value.legacy.batteryCycleCount;
3236 break;
3237 default:
3238 throw new IllegalStateException("Invalid atomTag in healthHal puller: "
3239 + atomTag);
3240 }
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003241 StatsEvent e = StatsEvent.newBuilder()
3242 .setAtomId(atomTag)
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003243 .writeInt(pulledValue)
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003244 .build();
3245 pulledData.add(e);
3246 });
Jeffrey Huang43f4d262020-01-30 14:03:31 -08003247 } catch (RemoteException | IllegalStateException e) {
Jeffrey Huang9a3c1b62020-01-27 17:33:13 -08003248 return StatsManager.PULL_SKIP;
3249 }
3250 return StatsManager.PULL_SUCCESS;
3251 }
Jeffrey Huangbf130832020-01-22 15:48:26 -08003252
Raff Tsai87cefd42020-04-07 14:25:02 +08003253 private void registerSettingsStats() {
3254 int tagId = FrameworkStatsLog.SETTING_SNAPSHOT;
3255 mStatsManager.setPullAtomCallback(
3256 tagId,
3257 null, // use default PullAtomMetadata values
3258 BackgroundThread.getExecutor(),
3259 mStatsCallbackImpl
3260 );
3261 }
3262
3263 int pullSettingsStats(int atomTag, List<StatsEvent> pulledData) {
3264 UserManager userManager = mContext.getSystemService(UserManager.class);
3265 if (userManager == null) {
3266 return StatsManager.PULL_SKIP;
3267 }
3268
3269 final long token = Binder.clearCallingIdentity();
3270 try {
3271 for (UserInfo user : userManager.getUsers()) {
3272 final int userId = user.getUserHandle().getIdentifier();
3273
3274 if (userId == UserHandle.USER_SYSTEM) {
3275 pulledData.addAll(SettingsStatsUtil.logGlobalSettings(mContext, atomTag,
3276 UserHandle.USER_SYSTEM));
3277 }
3278 pulledData.addAll(SettingsStatsUtil.logSystemSettings(mContext, atomTag, userId));
3279 pulledData.addAll(SettingsStatsUtil.logSecureSettings(mContext, atomTag, userId));
3280 }
3281 } catch (Exception e) {
3282 Slog.e(TAG, "failed to pullSettingsStats", e);
3283 return StatsManager.PULL_SKIP;
3284 } finally {
3285 Binder.restoreCallingIdentity(token);
3286 }
3287 return StatsManager.PULL_SUCCESS;
3288 }
3289
Jeffrey Huangbf130832020-01-22 15:48:26 -08003290 // Thermal event received from vendor thermal management subsystem
3291 private static final class ThermalEventListener extends IThermalEventListener.Stub {
3292 @Override
3293 public void notifyThrottling(Temperature temp) {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08003294 FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_THROTTLING_SEVERITY_STATE_CHANGED,
3295 temp.getType(), temp.getName(), (int) (temp.getValue() * 10), temp.getStatus());
Jeffrey Huangbf130832020-01-22 15:48:26 -08003296 }
3297 }
3298
3299 private static final class ConnectivityStatsCallback extends
3300 ConnectivityManager.NetworkCallback {
3301 @Override
3302 public void onAvailable(Network network) {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08003303 FrameworkStatsLog.write(FrameworkStatsLog.CONNECTIVITY_STATE_CHANGED, network.netId,
3304 FrameworkStatsLog.CONNECTIVITY_STATE_CHANGED__STATE__CONNECTED);
Jeffrey Huangbf130832020-01-22 15:48:26 -08003305 }
3306
3307 @Override
3308 public void onLost(Network network) {
Muhammad Qureshi4e4c44f2020-01-27 17:18:52 -08003309 FrameworkStatsLog.write(FrameworkStatsLog.CONNECTIVITY_STATE_CHANGED, network.netId,
3310 FrameworkStatsLog.CONNECTIVITY_STATE_CHANGED__STATE__DISCONNECTED);
Jeffrey Huangbf130832020-01-22 15:48:26 -08003311 }
3312 }
Tej Singh953ad862020-01-03 12:47:07 -08003313}