19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1745ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackbornpackage com.android.internal.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static android.os.Process.*; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 228e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackbornimport android.os.StrictMode; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 248a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.StringWriter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator; 33e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport java.util.StringTokenizer; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ProcessStats { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "ProcessStats"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 3843a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato private static final boolean localLOGV = DEBUG || false; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] PROCESS_STATS_FORMAT = new int[] { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 426b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn PROC_SPACE_TERM|PROC_PARENS, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 50151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 9: minor faults 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 52151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 11: major faults 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 13: utime 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG // 14: stime 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn static final int PROCESS_STAT_MINOR_FAULTS = 0; 59151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn static final int PROCESS_STAT_MAJOR_FAULTS = 1; 60151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn static final int PROCESS_STAT_UTIME = 2; 61151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn static final int PROCESS_STAT_STIME = 3; 62151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn 63eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** Stores user time and system time in 100ths of a second. */ 64151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn private final long[] mProcessStatsData = new long[4]; 65eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani /** Stores user time and system time in 100ths of a second. */ 66151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn private final long[] mSinglePidStatsData = new long[4]; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] PROCESS_FULL_STATS_FORMAT = new int[] { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_PARENS|PROC_OUT_STRING, // 1: name 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 786b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 9: minor faults 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 806b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 11: major faults 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 13: utime 83287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 14: stime 84287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 85287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 86287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 87287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 88287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 89287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM, 90287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROC_SPACE_TERM|PROC_OUT_LONG, // 21: vsize 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 936b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn static final int PROCESS_FULL_STAT_MINOR_FAULTS = 1; 946b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn static final int PROCESS_FULL_STAT_MAJOR_FAULTS = 2; 956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn static final int PROCESS_FULL_STAT_UTIME = 3; 966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn static final int PROCESS_FULL_STAT_STIME = 4; 97287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn static final int PROCESS_FULL_STAT_VSIZE = 5; 986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 99287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private final String[] mProcessFullStatsStringData = new String[6]; 100287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn private final long[] mProcessFullStatsData = new long[6]; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] SYSTEM_CPU_FORMAT = new int[] { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_COMBINE, 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 1: user time 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 2: nice time 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 3: sys time 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 4: idle time 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 5: iowait time 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG, // 6: irq time 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_LONG // 7: softirq time 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final long[] mSystemCpuData = new long[7]; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] LOAD_AVERAGE_FORMAT = new int[] { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_FLOAT, // 0: 1 min 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_FLOAT, // 1: 5 mins 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROC_SPACE_TERM|PROC_OUT_FLOAT // 2: 15 mins 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final float[] mLoadAverageData = new float[3]; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final boolean mIncludeThreads; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mLoad1 = 0; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mLoad5 = 0; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mLoad15 = 0; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mCurrentSampleTime; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mLastSampleTime; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn private long mCurrentSampleRealTime; 1336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn private long mLastSampleRealTime; 1346b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseUserTime; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseSystemTime; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseIoWaitTime; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseIrqTime; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseSoftIrqTime; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mBaseIdleTime; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelUserTime; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelSystemTime; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelIoWaitTime; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelIrqTime; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelSoftIrqTime; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRelIdleTime; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mCurPids; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mCurThreadPids; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ArrayList<Stats> mProcStats = new ArrayList<Stats>(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ArrayList<Stats> mWorkingProcs = new ArrayList<Stats>(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mWorkingProcsSorted; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFirst = true; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 157ca894b396b93344ac255746e12730cb269d4d856Martin Wallgren private byte[] mBuffer = new byte[4096]; 158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** 160e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * The time in microseconds that the CPU has been running at each speed. 161e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani */ 162e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private long[] mCpuSpeedTimes; 163e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 164e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** 165e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * The relative time in microseconds that the CPU has been running at each speed. 166e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani */ 167e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private long[] mRelCpuSpeedTimes; 168e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 169e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** 170e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * The different speeds that the CPU can be running at. 171e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani */ 172e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private long[] mCpuSpeeds; 173e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Stats { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int pid; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String statFile; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String cmdlineFile; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String threadsDir; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Stats> threadStats; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Stats> workingThreads; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 182287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean interesting; 183287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String baseName; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String name; 18645ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackborn public int nameWidth; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1886b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn public long base_uptime; 1896b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn public long rel_uptime; 1906b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long base_utime; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long base_stime; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int rel_utime; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int rel_stime; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 196151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn public long base_minfaults; 197151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn public long base_majfaults; 198151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn public int rel_minfaults; 199151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn public int rel_majfaults; 200151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean active; 2026b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn public boolean working; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean added; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removed; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stats(int _pid, int parentPid, boolean includeThreads) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pid = _pid; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parentPid < 0) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final File procDir = new File("/proc", Integer.toString(pid)); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statFile = new File(procDir, "stat").toString(); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cmdlineFile = new File(procDir, "cmdline").toString(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threadsDir = (new File(procDir, "task")).toString(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (includeThreads) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threadStats = new ArrayList<Stats>(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project workingThreads = new ArrayList<Stats>(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threadStats = null; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project workingThreads = null; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final File procDir = new File("/proc", Integer.toString( 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parentPid)); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final File taskDir = new File( 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new File(procDir, "task"), Integer.toString(pid)); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project statFile = new File(taskDir, "stat").toString(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cmdlineFile = null; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threadsDir = null; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project threadStats = null; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project workingThreads = null; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static Comparator<Stats> sLoadComparator = new Comparator<Stats>() { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int 2366b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn compare(Stats sta, Stats stb) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ta = sta.rel_utime + sta.rel_stime; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tb = stb.rel_utime + stb.rel_stime; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ta != tb) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ta > tb ? -1 : 1; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sta.added != stb.added) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sta.added ? -1 : 1; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sta.removed != stb.removed) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sta.added ? -1 : 1; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ProcessStats(boolean includeThreads) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIncludeThreads = includeThreads; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onLoadChanged(float load1, float load5, float load15) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int onMeasureProcessName(String name) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void init() { 2656b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v(TAG, "Init: " + this); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirst = true; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update() { 2716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v(TAG, "Update: " + this); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastSampleTime = mCurrentSampleTime; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentSampleTime = SystemClock.uptimeMillis(); 2746b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mLastSampleRealTime = mCurrentSampleRealTime; 2756b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mCurrentSampleRealTime = SystemClock.elapsedRealtime(); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long[] sysCpu = mSystemCpuData; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, sysCpu, null)) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Total user time is user + nice time. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long usertime = sysCpu[0]+sysCpu[1]; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Total system time is simply system time. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long systemtime = sysCpu[2]; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Total idle time is simply idle time. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long idletime = sysCpu[3]; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Total irq time is iowait + irq + softirq time. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long iowaittime = sysCpu[4]; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long irqtime = sysCpu[5]; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long softirqtime = sysCpu[6]; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelUserTime = (int)(usertime - mBaseUserTime); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelSystemTime = (int)(systemtime - mBaseSystemTime); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelIoWaitTime = (int)(iowaittime - mBaseIoWaitTime); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelIrqTime = (int)(irqtime - mBaseIrqTime); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelSoftIrqTime = (int)(softirqtime - mBaseSoftIrqTime); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRelIdleTime = (int)(idletime - mBaseIdleTime); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) { 2998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1] 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " S:" + sysCpu[2] + " I:" + sysCpu[3] 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " W:" + sysCpu[4] + " Q:" + sysCpu[5] 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " O:" + sysCpu[6]); 3038a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i("Load", "Rel U:" + mRelUserTime + " S:" + mRelSystemTime 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " I:" + mRelIdleTime + " Q:" + mRelIrqTime); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseUserTime = usertime; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseSystemTime = systemtime; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseIoWaitTime = iowaittime; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseIrqTime = irqtime; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseSoftIrqTime = softirqtime; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBaseIdleTime = idletime; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3156b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats); 3166b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 3176b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final float[] loadAverages = mLoadAverageData; 3186b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (Process.readProcFile("/proc/loadavg", LOAD_AVERAGE_FORMAT, 3196b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn null, null, loadAverages)) { 3206b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn float load1 = loadAverages[0]; 3216b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn float load5 = loadAverages[1]; 3226b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn float load15 = loadAverages[2]; 3236b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (load1 != mLoad1 || load5 != mLoad5 || load15 != mLoad15) { 3246b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mLoad1 = load1; 3256b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mLoad5 = load5; 3266b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mLoad15 = load15; 3276b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn onLoadChanged(load1, load5, load15); 3286b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 3296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 3306b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 3316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.i(TAG, "*** TIME TO COLLECT STATS: " 3326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + (SystemClock.uptimeMillis()-mCurrentSampleTime)); 3336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkingProcsSorted = false; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFirst = false; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] collectStats(String statsFile, int parentPid, boolean first, 3396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn int[] curPids, ArrayList<Stats> allProcs) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] pids = Process.getPids(statsFile, curPids); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = (pids == null) ? 0 : pids.length; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NS = allProcs.size(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int curStatsIndex = 0; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NP; i++) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pid = pids[i]; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pid < 0) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = pid; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stats st = curStatsIndex < NS ? allProcs.get(curStatsIndex) : null; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st != null && st.pid == pid) { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update an existing process... 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.added = false; 3566b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.working = false; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curStatsIndex++; 3586b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v(TAG, "Existing " 3596b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + (parentPid < 0 ? "process" : "thread") 3606b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + " pid " + pid + ": " + st); 3616b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 362287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (st.interesting) { 363287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long uptime = SystemClock.uptimeMillis(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 365287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long[] procStats = mProcessStatsData; 366287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (!Process.readProcFile(st.statFile.toString(), 367287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn PROCESS_STATS_FORMAT, null, procStats, null)) { 368287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn continue; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 371287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long minfaults = procStats[PROCESS_STAT_MINOR_FAULTS]; 372287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long majfaults = procStats[PROCESS_STAT_MAJOR_FAULTS]; 373287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long utime = procStats[PROCESS_STAT_UTIME]; 374287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final long stime = procStats[PROCESS_STAT_STIME]; 375287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 376287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (utime == st.base_utime && stime == st.base_stime) { 377287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_utime = 0; 378287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_stime = 0; 379287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_minfaults = 0; 380287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_majfaults = 0; 381287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (st.active) { 382287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.active = false; 383287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 384287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn continue; 385287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 387287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (!st.active) { 388287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.active = true; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 390287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 391287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (parentPid < 0) { 392287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn getName(st, st.cmdlineFile); 393287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (st.threadStats != null) { 394287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mCurThreadPids = collectStats(st.threadsDir, pid, false, 395287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mCurThreadPids, st.threadStats); 396287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 397287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 398287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 399287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (DEBUG) Slog.v("Load", "Stats changed " + st.name + " pid=" + st.pid 400287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn + " utime=" + utime + "-" + st.base_utime 401287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn + " stime=" + stime + "-" + st.base_stime 402287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn + " minfaults=" + minfaults + "-" + st.base_minfaults 403287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn + " majfaults=" + majfaults + "-" + st.base_majfaults); 404287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 405287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_uptime = uptime - st.base_uptime; 406287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_uptime = uptime; 407287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_utime = (int)(utime - st.base_utime); 408287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_stime = (int)(stime - st.base_stime); 409287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_utime = utime; 410287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_stime = stime; 411287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_minfaults = (int)(minfaults - st.base_minfaults); 412287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.rel_majfaults = (int)(majfaults - st.base_majfaults); 413287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_minfaults = minfaults; 414287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_majfaults = majfaults; 415287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.working = true; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st == null || st.pid > pid) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We have a new process! 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st = new Stats(pid, parentPid, mIncludeThreads); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allProcs.add(curStatsIndex, st); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curStatsIndex++; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NS++; 4276b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v(TAG, "New " 4286b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + (parentPid < 0 ? "process" : "thread") 4296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + " pid " + pid + ": " + st); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String[] procStatsString = mProcessFullStatsStringData; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long[] procStats = mProcessFullStatsData; 4336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.base_uptime = SystemClock.uptimeMillis(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Process.readProcFile(st.statFile.toString(), 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PROCESS_FULL_STATS_FORMAT, procStatsString, 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project procStats, null)) { 437287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn // This is a possible way to filter out processes that 438287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn // are actually kernel threads... do we want to? Some 439287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn // of them do use CPU, but there can be a *lot* that are 440287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn // not doing anything. 441287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (true || procStats[PROCESS_FULL_STAT_VSIZE] != 0) { 442287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.interesting = true; 443287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.baseName = procStatsString[0]; 444287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_minfaults = procStats[PROCESS_FULL_STAT_MINOR_FAULTS]; 445287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_majfaults = procStats[PROCESS_FULL_STAT_MAJOR_FAULTS]; 446287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_utime = procStats[PROCESS_FULL_STAT_UTIME]; 447287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.base_stime = procStats[PROCESS_FULL_STAT_STIME]; 448287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else { 449287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Slog.i(TAG, "Skipping kernel process pid " + pid 450287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn + " name " + procStatsString[0]); 451287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn st.baseName = procStatsString[0]; 452287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 454287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn Slog.w(TAG, "Skipping unknown process pid " + pid); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.baseName = "<unknown>"; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.base_utime = st.base_stime = 0; 457151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.base_minfaults = st.base_majfaults = 0; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parentPid < 0) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getName(st, st.cmdlineFile); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st.threadStats != null) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurThreadPids = collectStats(st.threadsDir, pid, true, 4646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mCurThreadPids, st.threadStats); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 466287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } else if (st.interesting) { 4676b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.name = st.baseName; 4686b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.nameWidth = onMeasureProcessName(st.name); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4706b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 4716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v("Load", "Stats added " + st.name + " pid=" + st.pid 4726b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + " utime=" + st.base_utime + " stime=" + st.base_stime 4736b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + " minfaults=" + st.base_minfaults + " majfaults=" + st.base_majfaults); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_utime = 0; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_stime = 0; 477151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_minfaults = 0; 478151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_majfaults = 0; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.added = true; 480287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (!first && st.interesting) { 4816b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.working = true; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This process has gone away! 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_utime = 0; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_stime = 0; 489151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_minfaults = 0; 490151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_majfaults = 0; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.removed = true; 4926b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.working = true; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allProcs.remove(curStatsIndex); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NS--; 4956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.v(TAG, "Removed " 4966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + (parentPid < 0 ? "process" : "thread") 4976b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + " pid " + pid + ": " + st); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Decrement the loop counter so that we process the current pid 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // again the next time through the loop. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i--; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (curStatsIndex < NS) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This process has gone away! 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Stats st = allProcs.get(curStatsIndex); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_utime = 0; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.rel_stime = 0; 509151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_minfaults = 0; 510151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn st.rel_majfaults = 0; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.removed = true; 5126b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.working = true; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project allProcs.remove(curStatsIndex); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NS--; 5158a9b22056b13477f59df934928c00c58b5871c95Joe Onorato if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pids; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 520eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 521eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani public long getCpuTimeForPid(int pid) { 522eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani final String statFile = "/proc/" + pid + "/stat"; 523eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani final long[] statsData = mSinglePidStatsData; 524eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT, 525eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani null, statsData, null)) { 526151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn long time = statsData[PROCESS_STAT_UTIME] 527151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn + statsData[PROCESS_STAT_STIME]; 528eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return time; 529eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 530eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani return 0; 531eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani } 532eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani 533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani /** 534e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * Returns the times spent at each CPU speed, since the last call to this method. If this 535e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * is the first time, it will return 1 for each value. 536e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani * @return relative times spent at different speed steps. 537e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani */ 538e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani public long[] getLastCpuSpeedTimes() { 539e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (mCpuSpeedTimes == null) { 540e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mCpuSpeedTimes = getCpuSpeedTimes(null); 541e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mRelCpuSpeedTimes = new long[mCpuSpeedTimes.length]; 542e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mCpuSpeedTimes.length; i++) { 543e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mRelCpuSpeedTimes[i] = 1; // Initialize 544e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 545e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } else { 546e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani getCpuSpeedTimes(mRelCpuSpeedTimes); 547e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani for (int i = 0; i < mCpuSpeedTimes.length; i++) { 548e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani long temp = mRelCpuSpeedTimes[i]; 549e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mRelCpuSpeedTimes[i] -= mCpuSpeedTimes[i]; 550e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mCpuSpeedTimes[i] = temp; 551e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 552e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 553e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return mRelCpuSpeedTimes; 554e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 555e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 556e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani private long[] getCpuSpeedTimes(long[] out) { 557e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani long[] tempTimes = out; 558e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani long[] tempSpeeds = mCpuSpeeds; 559ca894b396b93344ac255746e12730cb269d4d856Martin Wallgren final int MAX_SPEEDS = 60; 560e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (out == null) { 561e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani tempTimes = new long[MAX_SPEEDS]; // Hopefully no more than that 562e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani tempSpeeds = new long[MAX_SPEEDS]; 563e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 564e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani int speed = 0; 565e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani String file = readFile("/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state", '\0'); 5662eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick // Note: file may be null on kernels without cpufreq (i.e. the emulator's) 5672eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick if (file != null) { 5682eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick StringTokenizer st = new StringTokenizer(file, "\n "); 5692eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick while (st.hasMoreElements()) { 5702eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick String token = st.nextToken(); 5712eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick try { 5722eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick long val = Long.parseLong(token); 5732eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick tempSpeeds[speed] = val; 5742eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick token = st.nextToken(); 5752eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick val = Long.parseLong(token); 5762eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick tempTimes[speed] = val; 5772eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick speed++; 5782eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick if (speed == MAX_SPEEDS) break; // No more 5792eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick if (localLOGV && out == null) { 5808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.v(TAG, "First time : Speed/Time = " + tempSpeeds[speed - 1] 5812eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick + "\t" + tempTimes[speed - 1]); 5822eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick } 5832eb239f92dbde5cd0fb6b8f665009878cbc63356Brad Fitzpatrick } catch (NumberFormatException nfe) { 5848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "Unable to parse time_in_state"); 585e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 586e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 587e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 588e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani if (out == null) { 589e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani out = new long[speed]; 590e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mCpuSpeeds = new long[speed]; 591e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani System.arraycopy(tempSpeeds, 0, mCpuSpeeds, 0, speed); 592e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani System.arraycopy(tempTimes, 0, out, 0, speed); 593e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 594e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani return out; 595e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani } 596e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastUserTime() { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelUserTime; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastSystemTime() { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelSystemTime; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastIoWaitTime() { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelIoWaitTime; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastIrqTime() { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelIrqTime; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastSoftIrqTime() { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelSoftIrqTime; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public int getLastIdleTime() { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mRelIdleTime; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public float getTotalCpuPercent() { 622cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn int denom = mRelUserTime+mRelSystemTime+mRelIrqTime+mRelIdleTime; 623cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn if (denom <= 0) { 624cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn return 0; 625cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn } 626cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn return ((float)(mRelUserTime+mRelSystemTime+mRelIrqTime)*100) / denom; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6296b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final void buildWorkingProcs() { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mWorkingProcsSorted) { 6316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mWorkingProcs.clear(); 6326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final int N = mProcStats.size(); 6336b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn for (int i=0; i<N; i++) { 6346b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn Stats stats = mProcStats.get(i); 6356b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (stats.working) { 6366b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn mWorkingProcs.add(stats); 6376b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (stats.threadStats != null && stats.threadStats.size() > 1) { 6386b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn stats.workingThreads.clear(); 6396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final int M = stats.threadStats.size(); 6406b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn for (int j=0; j<M; j++) { 6416b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn Stats tstats = stats.threadStats.get(j); 6426b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (tstats.working) { 6436b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn stats.workingThreads.add(tstats); 6446b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6456b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6466b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn Collections.sort(stats.workingThreads, sLoadComparator); 6476b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6486b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6496b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(mWorkingProcs, sLoadComparator); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWorkingProcsSorted = true; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6536b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6546b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 655287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final public int countStats() { 656287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mProcStats.size(); 657287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 658287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 659287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn final public Stats getStats(int index) { 660287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return mProcStats.get(index); 661287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 662287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn 6636b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final public int countWorkingStats() { 6646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn buildWorkingProcs(); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWorkingProcs.size(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final public Stats getWorkingStats(int index) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWorkingProcs.get(index); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6726b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final public String printCurrentLoad() { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringWriter sw = new StringWriter(); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(sw); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("Load: "); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(mLoad1); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(" / "); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(mLoad5); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(" / "); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(mLoad15); 6816b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn return sw.toString(); 6826b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 6836b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 6846b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn final public String printCurrentState(long now) { 6856b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn buildWorkingProcs(); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6876b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn StringWriter sw = new StringWriter(); 6886b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn PrintWriter pw = new PrintWriter(sw); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("CPU usage from "); 6916b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (now > mLastSampleTime) { 6926b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(now-mLastSampleTime); 6936b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("ms to "); 6946b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(now-mCurrentSampleTime); 6956b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("ms ago"); 6966b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } else { 6976b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(mLastSampleTime-now); 6986b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("ms to "); 6996b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(mCurrentSampleTime-now); 7006b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("ms later"); 7016b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7026b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 7036b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn long sampleTime = mCurrentSampleTime - mLastSampleTime; 7046b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn long sampleRealTime = mCurrentSampleRealTime - mLastSampleRealTime; 705cdadee630e09fc2aa966244a71bf22236f9a30a4Dianne Hackborn long percAwake = sampleRealTime > 0 ? ((sampleTime*100) / sampleRealTime) : 0; 7066b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (percAwake != 100) { 7076b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(" with "); 7086b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(percAwake); 7096b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("% awake"); 7106b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7116b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.println(":"); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 713151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime 714151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7166b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (DEBUG) Slog.i(TAG, "totalTime " + totalTime + " over sample time " 7176b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn + (mCurrentSampleTime-mLastSampleTime)); 7186b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = mWorkingProcs.size(); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stats st = mWorkingProcs.get(i); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printProcessCPU(pw, st.added ? " +" : (st.removed ? " -": " "), 7236b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.pid, st.name, (int)(st.rel_uptime+5)/10, 7246b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn st.rel_utime, st.rel_stime, 0, 0, 0, st.rel_minfaults, st.rel_majfaults); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!st.removed && st.workingThreads != null) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = st.workingThreads.size(); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<M; j++) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Stats tst = st.workingThreads.get(j); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printProcessCPU(pw, 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tst.added ? " +" : (tst.removed ? " -": " "), 7316b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn tst.pid, tst.name, (int)(st.rel_uptime+5)/10, 7326b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn tst.rel_utime, tst.rel_stime, 0, 0, 0, 0, 0); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7376b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printProcessCPU(pw, "", -1, "TOTAL", totalTime, mRelUserTime, mRelSystemTime, 738151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn mRelIoWaitTime, mRelIrqTime, mRelSoftIrqTime, 0, 0); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sw.toString(); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7436b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn private void printRatio(PrintWriter pw, long numerator, long denominator) { 7446b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn long thousands = (numerator*1000)/denominator; 7456b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn long hundreds = thousands/10; 7466b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(hundreds); 7476b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (hundreds < 10) { 7486b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn long remainder = thousands - (hundreds*10); 7496b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (remainder != 0) { 7506b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print('.'); 7516b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(remainder); 7526b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7536b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7546b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7556b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn 7566b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn private void printProcessCPU(PrintWriter pw, String prefix, int pid, String label, 7576b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn int totalTime, int user, int system, int iowait, int irq, int softIrq, 7586b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn int minFaults, int majFaults) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(prefix); 7606b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (totalTime == 0) totalTime = 1; 7616b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, user+system+iowait+irq+softIrq, totalTime); 7626b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("% "); 7636b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (pid >= 0) { 7646b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print(pid); 7656b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn pw.print("/"); 7666b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(label); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(": "); 7696b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, user, totalTime); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("% user + "); 7716b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, system, totalTime); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("% kernel"); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iowait > 0) { 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(" + "); 7756b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, iowait, totalTime); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("% iowait"); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (irq > 0) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(" + "); 7806b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, irq, totalTime); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("% irq"); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (softIrq > 0) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(" + "); 7856b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn printRatio(pw, softIrq, totalTime); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print("% softirq"); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 788151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn if (minFaults > 0 || majFaults > 0) { 789151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(" / faults:"); 790151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn if (minFaults > 0) { 791151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(" "); 792151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(minFaults); 793151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(" minor"); 794151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn } 795151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn if (majFaults > 0) { 796151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(" "); 797151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(majFaults); 798151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn pw.print(" major"); 799151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn } 800151ceb96911bfec7ec57bfc26f591baec31a497fDianne Hackborn } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String readFile(String file, char endChar) { 8058e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn // Permit disk reads here, as /proc/meminfo isn't really "on 8068e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn // disk" and should be fast. TODO: make BlockGuard ignore 8078e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn // /proc/ and /sys/ files perhaps? 8088e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 8096689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick FileInputStream is = null; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8116689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick is = new FileInputStream(file); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = is.read(mBuffer); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len > 0) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<len; i++) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBuffer[i] == endChar) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8224136c98ecc25861da5462d1364f1c4bfd7bd5c31Christian Mehlmauer return new String(mBuffer, 0, i); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.io.FileNotFoundException e) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.io.IOException e) { 8266689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick } finally { 8276689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick if (is != null) { 8286689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick try { 8296689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick is.close(); 8306689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick } catch (java.io.IOException e) { 8316689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick } 8326689ac8a56a4e64c6f0ab4fa521e7ec3e28c02dfBrad Fitzpatrick } 8338e8d65ff5fdef12c6af3d003dfef19aadc39bea9Dianne Hackborn StrictMode.setThreadPolicy(savedPolicy); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void getName(Stats st, String cmdlineFile) { 8396b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn String newName = st.name; 840287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (st.name == null || st.name.equals("app_process") 841287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn || st.name.equals("<pre-initialized>")) { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cmdName = readFile(cmdlineFile, '\0'); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cmdName != null && cmdName.length() > 1) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newName = cmdName; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = newName.lastIndexOf("/"); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i > 0 && i < newName.length()-1) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newName = newName.substring(i+1); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8506b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn if (newName == null) { 8516b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn newName = st.baseName; 8526b1afebdaca6c27d49a243c4283e5e2e4924de8cDianne Hackborn } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st.name == null || !newName.equals(st.name)) { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.name = newName; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project st.nameWidth = onMeasureProcessName(st.name); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 860