diff options
4 files changed, 141 insertions, 1 deletions
diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java index f7b77422cdce..5e3c5dfe6bdc 100644 --- a/core/java/com/android/internal/os/ProcessCpuTracker.java +++ b/core/java/com/android/internal/os/ProcessCpuTracker.java @@ -24,6 +24,7 @@ import static android.os.Process.PROC_PARENS; import static android.os.Process.PROC_SPACE_TERM; import android.compat.annotation.UnsupportedAppUsage; +import android.os.CpuUsageProto; import android.os.Process; import android.os.StrictMode; import android.os.SystemClock; @@ -31,10 +32,12 @@ import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; import android.util.Slog; +import android.util.proto.ProtoOutputStream; import com.android.internal.util.FastPrintWriter; import java.io.File; +import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; import java.text.SimpleDateFormat; @@ -740,6 +743,63 @@ public class ProcessCpuTracker { return mWorkingProcs.get(index); } + /** Dump cpuinfo in protobuf format. */ + public final void dumpProto(FileDescriptor fd) { + final long now = SystemClock.uptimeMillis(); + final ProtoOutputStream proto = new ProtoOutputStream(fd); + final long currentLoadToken = proto.start(CpuUsageProto.CURRENT_LOAD); + proto.write(CpuUsageProto.Load.LOAD1, mLoad1); + proto.write(CpuUsageProto.Load.LOAD5, mLoad5); + proto.write(CpuUsageProto.Load.LOAD15, mLoad15); + proto.end(currentLoadToken); + + proto.write(CpuUsageProto.NOW, now); + proto.write(CpuUsageProto.LAST_SAMPLE_TIME, mLastSampleTime); + proto.write(CpuUsageProto.CURRENT_SAMPLE_TIME, mCurrentSampleTime); + proto.write(CpuUsageProto.LAST_SAMPLE_REAL_TIME, mLastSampleRealTime); + proto.write(CpuUsageProto.CURRENT_SAMPLE_REAL_TIME, mCurrentSampleRealTime); + proto.write(CpuUsageProto.LAST_SAMPLE_WALL_TIME, mLastSampleWallTime); + proto.write(CpuUsageProto.CURRENT_SAMPLE_WALL_TIME, mCurrentSampleWallTime); + + proto.write(CpuUsageProto.TOTAL_USER_TIME, mRelUserTime); + proto.write(CpuUsageProto.TOTAL_SYSTEM_TIME, mRelSystemTime); + proto.write(CpuUsageProto.TOTAL_IOWAIT_TIME, mRelIoWaitTime); + proto.write(CpuUsageProto.TOTAL_IRQ_TIME, mRelIrqTime); + proto.write(CpuUsageProto.TOTAL_SOFT_IRQ_TIME, mRelSoftIrqTime); + proto.write(CpuUsageProto.TOTAL_IDLE_TIME, mRelIdleTime); + final int totalTime = mRelUserTime + mRelSystemTime + mRelIoWaitTime + + mRelIrqTime + mRelSoftIrqTime + mRelIdleTime; + proto.write(CpuUsageProto.TOTAL_TIME, totalTime); + + for (Stats st : mWorkingProcs) { + dumpProcessCpuProto(proto, st, null); + if (!st.removed && st.workingThreads != null) { + for (Stats tst : st.workingThreads) { + dumpProcessCpuProto(proto, tst, st); + } + } + } + proto.flush(); + } + + private static void dumpProcessCpuProto(ProtoOutputStream proto, Stats st, Stats proc) { + long statToken = proto.start(CpuUsageProto.PROCESSES); + proto.write(CpuUsageProto.Stat.UID, st.uid); + proto.write(CpuUsageProto.Stat.PID, st.pid); + proto.write(CpuUsageProto.Stat.NAME, st.name); + proto.write(CpuUsageProto.Stat.ADDED, st.added); + proto.write(CpuUsageProto.Stat.REMOVED, st.removed); + proto.write(CpuUsageProto.Stat.UPTIME, st.rel_uptime); + proto.write(CpuUsageProto.Stat.USER_TIME, st.rel_utime); + proto.write(CpuUsageProto.Stat.SYSTEM_TIME, st.rel_stime); + proto.write(CpuUsageProto.Stat.MINOR_FAULTS, st.rel_minfaults); + proto.write(CpuUsageProto.Stat.MAJOR_FAULTS, st.rel_majfaults); + if (proc != null) { + proto.write(CpuUsageProto.Stat.PARENT_PID, proc.pid); + } + proto.end(statToken); + } + final public String printCurrentLoad() { StringWriter sw = new StringWriter(); PrintWriter pw = new FastPrintWriter(sw, false, 128); diff --git a/core/proto/android/os/cpu_usage.proto b/core/proto/android/os/cpu_usage.proto new file mode 100644 index 000000000000..ac9890028ba4 --- /dev/null +++ b/core/proto/android/os/cpu_usage.proto @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +syntax = "proto2"; + +option java_multiple_files = true; + +import "frameworks/base/core/proto/android/privacy.proto"; + +package android.os; + +message CpuUsageProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + message Load { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional float load1 = 1; + optional float load5 = 2; + optional float load15 = 3; + } + optional Load current_load = 1; + + optional int64 now = 2; + optional int64 last_sample_time = 3; + optional int64 current_sample_time = 4; + optional int64 last_sample_real_time = 5; + optional int64 current_sample_real_time = 6; + optional int64 last_sample_wall_time = 7; + optional int64 current_sample_wall_time = 8; + + optional int32 total_user_time = 9; + optional int32 total_system_time = 10; + optional int32 total_iowait_time = 11; + optional int32 total_irq_time = 12; + optional int32 total_soft_irq_time = 13; + optional int32 total_idle_time = 14; + optional int32 total_time = 15; + + message Stat { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 uid = 1; + optional int32 pid = 2; + optional string name = 3; + optional bool added = 4; + optional bool removed = 5; + optional int32 uptime = 6; + optional int32 user_time = 7; + optional int32 system_time = 8; + optional int32 minor_faults = 9; + optional int32 major_faults = 10; + optional int32 parent_pid = 11; + } + repeated Stat processes = 16; + + // Next tag: 17 +} diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 6cf9424b8682..8f9c041b4ad2 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -21,6 +21,7 @@ import "frameworks/base/core/proto/android/os/backtrace.proto"; import "frameworks/base/core/proto/android/os/batterytype.proto"; import "frameworks/base/core/proto/android/os/cpufreq.proto"; import "frameworks/base/core/proto/android/os/cpuinfo.proto"; +import "frameworks/base/core/proto/android/os/cpu_usage.proto"; import "frameworks/base/core/proto/android/os/data.proto"; import "frameworks/base/core/proto/android/os/header.proto"; import "frameworks/base/core/proto/android/os/kernelwake.proto"; @@ -469,6 +470,11 @@ message IncidentProto { (section).args = "dropbox --proto SubsystemRestart" ]; + optional CpuUsageProto process_cpu_usage = 3047 [ + (section).type = SECTION_DUMPSYS, + (section).args = "cpuinfo --proto" + ]; + // Reserved for OEMs. extensions 50000 to 100000; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 585f37153a0b..a8b9562c384b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2176,10 +2176,13 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void dumpCritical(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) { - if (asProto) return; if (!DumpUtils.checkDumpAndUsageStatsPermission(mActivityManagerService.mContext, "cpuinfo", pw)) return; synchronized (mActivityManagerService.mProcessCpuTracker) { + if (asProto) { + mActivityManagerService.mProcessCpuTracker.dumpProto(fd); + return; + } pw.print(mActivityManagerService.mProcessCpuTracker.printCurrentLoad()); pw.print(mActivityManagerService.mProcessCpuTracker.printCurrentState( SystemClock.uptimeMillis())); |