Merge "Use the UID as the package name in procstat assoc proto dump" into rvc-dev am: d29532e699 am: 8143d27be9
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11725049 Change-Id: I595b0dc8a02c7c5870efd2024396a68e3ac4f9b2
This commit is contained in:
@@ -5804,7 +5804,7 @@ message ProcessStatsProto {
|
||||
optional string process = 1;
|
||||
|
||||
// Uid of the process.
|
||||
optional int32 uid = 2;
|
||||
optional int32 uid = 2 [(is_uid) = true];
|
||||
|
||||
// Information about how often kills occurred
|
||||
message Kill {
|
||||
@@ -5831,13 +5831,16 @@ message ProcessStatsProto {
|
||||
repeated ProcessStatsAssociationProto assocs = 7;
|
||||
}
|
||||
|
||||
// Next Tag: 5
|
||||
// Next Tag: 6
|
||||
message ProcessStatsAssociationProto {
|
||||
// Procss Name of the associated process (client process of service binding)
|
||||
optional string assoc_process_name = 1;
|
||||
|
||||
// Package Name of the associated package (client package of service binding)
|
||||
optional string assoc_package_name = 2;
|
||||
optional string assoc_package_name = 2 [deprecated = true];
|
||||
|
||||
// UID of the associated process/package (client package of service binding)
|
||||
optional int32 assoc_uid = 5 [(is_uid) = true];
|
||||
|
||||
// Total count of the times this association (service binding) appeared.
|
||||
optional int32 total_count = 3;
|
||||
|
||||
@@ -49,12 +49,14 @@ import android.os.SystemClock;
|
||||
import android.os.UserHandle;
|
||||
import android.service.procstats.ProcessStatsProto;
|
||||
import android.service.procstats.ProcessStatsStateProto;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.ArraySet;
|
||||
import android.util.DebugUtils;
|
||||
import android.util.Log;
|
||||
import android.util.LongSparseArray;
|
||||
import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.util.SparseLongArray;
|
||||
import android.util.TimeUtils;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
@@ -1420,10 +1422,38 @@ public final class ProcessState {
|
||||
proto.end(token);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assume the atom already includes a UID field, write the process name only if
|
||||
* it's different from the package name; and only write the suffix if possible.
|
||||
*/
|
||||
static void writeCompressedProcessName(final ProtoOutputStream proto, final long fieldId,
|
||||
final String procName, final String packageName, final boolean sharedUid) {
|
||||
if (sharedUid) {
|
||||
// This UID has multiple packages running, write the full process name here
|
||||
proto.write(fieldId, procName);
|
||||
return;
|
||||
}
|
||||
if (TextUtils.equals(procName, packageName)) {
|
||||
// Same name, don't bother to write the process name here.
|
||||
return;
|
||||
}
|
||||
if (procName.startsWith(packageName)) {
|
||||
final int pkgLength = packageName.length();
|
||||
if (procName.charAt(pkgLength) == ':') {
|
||||
// Only write the suffix starting with ':'
|
||||
proto.write(fieldId, procName.substring(pkgLength));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Write the full process name
|
||||
proto.write(fieldId, procName);
|
||||
}
|
||||
|
||||
/** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */
|
||||
public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto, long fieldId,
|
||||
String procName, int uid, long now,
|
||||
final ProcessMap<ArraySet<PackageState>> procToPkgMap) {
|
||||
final ProcessMap<ArraySet<PackageState>> procToPkgMap,
|
||||
final SparseArray<ArraySet<String>> uidToPkgMap) {
|
||||
// Group proc stats by aggregated type (only screen state + process state)
|
||||
SparseLongArray durationByState = new SparseLongArray();
|
||||
boolean didCurState = false;
|
||||
@@ -1503,7 +1533,8 @@ public final class ProcessState {
|
||||
|
||||
// build the output
|
||||
final long token = proto.start(fieldId);
|
||||
proto.write(ProcessStatsProto.PROCESS, procName);
|
||||
writeCompressedProcessName(proto, ProcessStatsProto.PROCESS, procName, mPackage,
|
||||
mMultiPackage || (uidToPkgMap.get(mUid).size() > 1));
|
||||
proto.write(ProcessStatsProto.UID, uid);
|
||||
|
||||
for (int i = 0; i < durationByState.size(); i++) {
|
||||
@@ -1528,7 +1559,7 @@ public final class ProcessState {
|
||||
}
|
||||
|
||||
mStats.dumpFilteredAssociationStatesProtoForProc(proto, ProcessStatsProto.ASSOCS,
|
||||
now, this, procToPkgMap);
|
||||
now, this, procToPkgMap, uidToPkgMap);
|
||||
proto.end(token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2235,8 +2235,9 @@ public final class ProcessStats implements Parcelable {
|
||||
public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto) {
|
||||
dumpProtoPreamble(proto);
|
||||
final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
|
||||
final ProcessMap<ArraySet<PackageState>> procToPkgMap =
|
||||
collectProcessPackageMaps(null, false);
|
||||
final ProcessMap<ArraySet<PackageState>> procToPkgMap = new ProcessMap<>();
|
||||
final SparseArray<ArraySet<String>> uidToPkgMap = new SparseArray<>();
|
||||
collectProcessPackageMaps(null, false, procToPkgMap, uidToPkgMap);
|
||||
for (int ip = 0; ip < procMap.size(); ip++) {
|
||||
final String procName = procMap.keyAt(ip);
|
||||
final SparseArray<ProcessState> uids = procMap.valueAt(ip);
|
||||
@@ -2245,7 +2246,8 @@ public final class ProcessStats implements Parcelable {
|
||||
final ProcessState procState = uids.valueAt(iu);
|
||||
procState.dumpAggregatedProtoForStatsd(proto,
|
||||
ProcessStatsSectionProto.PROCESS_STATS,
|
||||
procName, uid, mTimePeriodEndRealtime, procToPkgMap);
|
||||
procName, uid, mTimePeriodEndRealtime,
|
||||
procToPkgMap, uidToPkgMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2279,10 +2281,9 @@ public final class ProcessStats implements Parcelable {
|
||||
/**
|
||||
* Walk through the known processes and build up the process -> packages map if necessary.
|
||||
*/
|
||||
public ProcessMap<ArraySet<PackageState>> collectProcessPackageMaps(
|
||||
String reqPackage, boolean activeOnly) {
|
||||
final ProcessMap<ArraySet<PackageState>> map = new ProcessMap<>();
|
||||
|
||||
private void collectProcessPackageMaps(String reqPackage, boolean activeOnly,
|
||||
final ProcessMap<ArraySet<PackageState>> procToPkgMap,
|
||||
final SparseArray<ArraySet<String>> uidToPkgMap) {
|
||||
final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap =
|
||||
mPackages.getMap();
|
||||
for (int ip = pkgMap.size() - 1; ip >= 0; ip--) {
|
||||
@@ -2304,17 +2305,22 @@ public final class ProcessStats implements Parcelable {
|
||||
|
||||
final String name = proc.getName();
|
||||
final int uid = proc.getUid();
|
||||
ArraySet<PackageState> pkgStates = map.get(name, uid);
|
||||
ArraySet<PackageState> pkgStates = procToPkgMap.get(name, uid);
|
||||
if (pkgStates == null) {
|
||||
pkgStates = new ArraySet<>();
|
||||
map.put(name, uid, pkgStates);
|
||||
procToPkgMap.put(name, uid, pkgStates);
|
||||
}
|
||||
pkgStates.add(state);
|
||||
ArraySet<String> packages = uidToPkgMap.get(uid);
|
||||
if (packages == null) {
|
||||
packages = new ArraySet<>();
|
||||
uidToPkgMap.put(uid, packages);
|
||||
}
|
||||
packages.add(state.mPackageName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2329,10 +2335,12 @@ public final class ProcessStats implements Parcelable {
|
||||
* @param now The timestamp when the dump was initiated.
|
||||
* @param procState The target process where its association states should be dumped.
|
||||
* @param proc2Pkg The map between process to packages running within it.
|
||||
* @param uidToPkgMap The map between UID to packages with this UID
|
||||
*/
|
||||
public void dumpFilteredAssociationStatesProtoForProc(ProtoOutputStream proto,
|
||||
long fieldId, long now, ProcessState procState,
|
||||
final ProcessMap<ArraySet<PackageState>> proc2Pkg) {
|
||||
final ProcessMap<ArraySet<PackageState>> proc2Pkg,
|
||||
final SparseArray<ArraySet<String>> uidToPkgMap) {
|
||||
if (procState.isMultiPackage() && procState.getCommonProcess() != procState) {
|
||||
// It's a per-package process state, don't bother to write into statsd
|
||||
return;
|
||||
@@ -2395,8 +2403,11 @@ public final class ProcessStats implements Parcelable {
|
||||
final SourceKey key = assocVals.keyAt(i);
|
||||
final long[] vals = assocVals.valueAt(i);
|
||||
final long token = proto.start(fieldId);
|
||||
proto.write(ProcessStatsAssociationProto.ASSOC_PROCESS_NAME, key.mProcess);
|
||||
proto.write(ProcessStatsAssociationProto.ASSOC_PACKAGE_NAME, key.mPackage);
|
||||
ProcessState.writeCompressedProcessName(proto,
|
||||
ProcessStatsAssociationProto.ASSOC_PROCESS_NAME,
|
||||
key.mProcess, key.mPackage,
|
||||
uidToPkgMap.get(key.mUid).size() > 1);
|
||||
proto.write(ProcessStatsAssociationProto.ASSOC_UID, key.mUid);
|
||||
proto.write(ProcessStatsAssociationProto.TOTAL_COUNT, (int) vals[1]);
|
||||
proto.write(ProcessStatsAssociationProto.TOTAL_DURATION_SECS,
|
||||
(int) (vals[0] / 1000));
|
||||
|
||||
@@ -179,13 +179,16 @@ message ProcessStatsProto {
|
||||
repeated ProcessStatsAssociationProto assocs = 7;
|
||||
}
|
||||
|
||||
// Next Tag: 5
|
||||
// Next Tag: 6
|
||||
message ProcessStatsAssociationProto {
|
||||
// Procss Name of the associated process/package
|
||||
optional string assoc_process_name = 1;
|
||||
|
||||
// Package Name of the associated process/package
|
||||
optional string assoc_package_name = 2;
|
||||
optional string assoc_package_name = 2 [deprecated = true];
|
||||
|
||||
// UID of the associated process/package
|
||||
optional int32 assoc_uid = 5;
|
||||
|
||||
// Total count of the times this association appeared.
|
||||
optional int32 total_count = 3;
|
||||
|
||||
Reference in New Issue
Block a user