Merge "[DO NOT MERGE] Add Atom logging for ADPF Telemetry" into tm-qpr-dev
This commit is contained in:
@@ -16,9 +16,11 @@
|
|||||||
|
|
||||||
package com.android.server.power.hint;
|
package com.android.server.power.hint;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.ActivityManagerInternal;
|
import android.app.ActivityManagerInternal;
|
||||||
import android.app.IUidObserver;
|
import android.app.IUidObserver;
|
||||||
|
import android.app.StatsManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -26,13 +28,17 @@ import android.os.IHintManager;
|
|||||||
import android.os.IHintSession;
|
import android.os.IHintSession;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
import android.os.SystemProperties;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
import android.util.StatsEvent;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.os.BackgroundThread;
|
||||||
import com.android.internal.util.DumpUtils;
|
import com.android.internal.util.DumpUtils;
|
||||||
|
import com.android.internal.util.FrameworkStatsLog;
|
||||||
import com.android.internal.util.Preconditions;
|
import com.android.internal.util.Preconditions;
|
||||||
import com.android.server.FgThread;
|
import com.android.server.FgThread;
|
||||||
import com.android.server.LocalServices;
|
import com.android.server.LocalServices;
|
||||||
@@ -52,7 +58,7 @@ public final class HintManagerService extends SystemService {
|
|||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
@VisibleForTesting final long mHintSessionPreferredRate;
|
@VisibleForTesting final long mHintSessionPreferredRate;
|
||||||
|
|
||||||
// Multi-levle map storing all active AppHintSessions.
|
// Multi-level map storing all active AppHintSessions.
|
||||||
// First level is keyed by the UID of the client process creating the session.
|
// First level is keyed by the UID of the client process creating the session.
|
||||||
// Second level is keyed by an IBinder passed from client process. This is used to observe
|
// Second level is keyed by an IBinder passed from client process. This is used to observe
|
||||||
// when the process exits. The client generally uses the same IBinder object across multiple
|
// when the process exits. The client generally uses the same IBinder object across multiple
|
||||||
@@ -69,6 +75,11 @@ public final class HintManagerService extends SystemService {
|
|||||||
|
|
||||||
private final ActivityManagerInternal mAmInternal;
|
private final ActivityManagerInternal mAmInternal;
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
private static final String PROPERTY_SF_ENABLE_CPU_HINT = "debug.sf.enable_adpf_cpu_hint";
|
||||||
|
private static final String PROPERTY_HWUI_ENABLE_HINT_MANAGER = "debug.hwui.use_hint_manager";
|
||||||
|
|
||||||
@VisibleForTesting final IHintManager.Stub mService = new BinderService();
|
@VisibleForTesting final IHintManager.Stub mService = new BinderService();
|
||||||
|
|
||||||
public HintManagerService(Context context) {
|
public HintManagerService(Context context) {
|
||||||
@@ -78,6 +89,7 @@ public final class HintManagerService extends SystemService {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
HintManagerService(Context context, Injector injector) {
|
HintManagerService(Context context, Injector injector) {
|
||||||
super(context);
|
super(context);
|
||||||
|
mContext = context;
|
||||||
mActiveSessions = new ArrayMap<>();
|
mActiveSessions = new ArrayMap<>();
|
||||||
mNativeWrapper = injector.createNativeWrapper();
|
mNativeWrapper = injector.createNativeWrapper();
|
||||||
mNativeWrapper.halInit();
|
mNativeWrapper.halInit();
|
||||||
@@ -108,6 +120,9 @@ public final class HintManagerService extends SystemService {
|
|||||||
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
|
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
|
||||||
systemReady();
|
systemReady();
|
||||||
}
|
}
|
||||||
|
if (phase == SystemService.PHASE_BOOT_COMPLETED) {
|
||||||
|
registerStatsCallbacks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void systemReady() {
|
private void systemReady() {
|
||||||
@@ -122,6 +137,30 @@ public final class HintManagerService extends SystemService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerStatsCallbacks() {
|
||||||
|
final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
|
||||||
|
statsManager.setPullAtomCallback(
|
||||||
|
FrameworkStatsLog.ADPF_SYSTEM_COMPONENT_INFO,
|
||||||
|
null, // use default PullAtomMetadata values
|
||||||
|
BackgroundThread.getExecutor(),
|
||||||
|
this::onPullAtom);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
|
||||||
|
if (atomTag == FrameworkStatsLog.ADPF_SYSTEM_COMPONENT_INFO) {
|
||||||
|
final boolean isSurfaceFlingerUsingCpuHint =
|
||||||
|
SystemProperties.getBoolean(PROPERTY_SF_ENABLE_CPU_HINT, false);
|
||||||
|
final boolean isHwuiHintManagerEnabled =
|
||||||
|
SystemProperties.getBoolean(PROPERTY_HWUI_ENABLE_HINT_MANAGER, false);
|
||||||
|
|
||||||
|
data.add(FrameworkStatsLog.buildStatsEvent(
|
||||||
|
FrameworkStatsLog.ADPF_SYSTEM_COMPONENT_INFO,
|
||||||
|
isSurfaceFlingerUsingCpuHint,
|
||||||
|
isHwuiHintManagerEnabled));
|
||||||
|
}
|
||||||
|
return android.app.StatsManager.PULL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper around the static-native methods from native.
|
* Wrapper around the static-native methods from native.
|
||||||
*
|
*
|
||||||
@@ -326,6 +365,7 @@ public final class HintManagerService extends SystemService {
|
|||||||
|
|
||||||
AppHintSession hs = new AppHintSession(callingUid, callingTgid, tids, token,
|
AppHintSession hs = new AppHintSession(callingUid, callingTgid, tids, token,
|
||||||
halSessionPtr, durationNanos);
|
halSessionPtr, durationNanos);
|
||||||
|
logPerformanceHintSessionAtom(callingUid, halSessionPtr, durationNanos, tids);
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
ArrayMap<IBinder, ArraySet<AppHintSession>> tokenMap =
|
ArrayMap<IBinder, ArraySet<AppHintSession>> tokenMap =
|
||||||
mActiveSessions.get(callingUid);
|
mActiveSessions.get(callingUid);
|
||||||
@@ -374,6 +414,12 @@ public final class HintManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void logPerformanceHintSessionAtom(int uid, long sessionId,
|
||||||
|
long targetDuration, int[] tids) {
|
||||||
|
FrameworkStatsLog.write(FrameworkStatsLog.PERFORMANCE_HINT_SESSION_REPORTED, uid,
|
||||||
|
sessionId, targetDuration, tids.length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|||||||
Reference in New Issue
Block a user