Make PSS profiling configurable
Make PSS profiling in ActivityManager configurable. This way it can be
selectively disabled on low resource devices to save CPU cycles.
Bug: 288595599, 288137640
Test: Build, boot and verified traces.
Change-Id: I4a6cdcc68496ccde25592887b033e41b21c1e845
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7300772..38da090 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -6587,4 +6587,7 @@
vibrations for the customized haptic feedback IDs, and continue to use the system defaults
for the non-customized ones. -->
<string name="config_hapticFeedbackCustomizationFile" />
+
+ <!-- Whether or not ActivityManager PSS profiling is disabled. -->
+ <bool name="config_am_disablePssProfiling">false</bool>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 391d7bd..d6ee57c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -5184,4 +5184,7 @@
<java-symbol type="bool" name="config_enable_a11y_magnification_single_panning" />
<java-symbol type="string" name="config_hapticFeedbackCustomizationFile" />
+
+ <!-- For ActivityManager PSS profiling configurability -->
+ <java-symbol type="bool" name="config_am_disablePssProfiling" />
</resources>
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index faf1900a..c20f0aa 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -46,6 +46,7 @@
import android.util.KeyValueListParser;
import android.util.Slog;
+import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import dalvik.annotation.optimization.NeverCompile;
@@ -1065,6 +1066,16 @@
/** @see #KEY_ENABLE_NEW_OOMADJ */
public boolean ENABLE_NEW_OOMADJ = DEFAULT_ENABLE_NEW_OOM_ADJ;
+ /**
+ * Indicates whether PSS profiling in AppProfiler is disabled or not.
+ */
+ static final String KEY_DISABLE_APP_PROFILER_PSS_PROFILING =
+ "disable_app_profiler_pss_profiling";
+
+ private final boolean mDefaultDisableAppProfilerPssProfiling;
+
+ public boolean APP_PROFILER_PSS_PROFILING_DISABLED;
+
private final OnPropertiesChangedListener mOnDeviceConfigChangedListener =
new OnPropertiesChangedListener() {
@Override
@@ -1240,6 +1251,9 @@
case KEY_USE_MODERN_TRIM:
updateUseModernTrim();
break;
+ case KEY_DISABLE_APP_PROFILER_PSS_PROFILING:
+ updateDisableAppProfilerPssProfiling();
+ break;
default:
updateFGSPermissionEnforcementFlagsIfNecessary(name);
break;
@@ -1321,8 +1335,10 @@
CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses / 2;
CUR_TRIM_CACHED_PROCESSES = (Integer.min(CUR_MAX_CACHED_PROCESSES, MAX_CACHED_PROCESSES)
- rawMaxEmptyProcesses) / 3;
-
loadNativeBootDeviceConfigConstants();
+ mDefaultDisableAppProfilerPssProfiling = context.getResources().getBoolean(
+ R.bool.config_am_disablePssProfiling);
+ APP_PROFILER_PSS_PROFILING_DISABLED = mDefaultDisableAppProfilerPssProfiling;
}
public void start(ContentResolver resolver) {
@@ -2026,7 +2042,13 @@
private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) {
ForegroundServiceTypePolicy.getDefaultPolicy()
- .updatePermissionEnforcementFlagIfNecessary(name);
+ .updatePermissionEnforcementFlagIfNecessary(name);
+ }
+
+ private void updateDisableAppProfilerPssProfiling() {
+ APP_PROFILER_PSS_PROFILING_DISABLED = DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_DISABLE_APP_PROFILER_PSS_PROFILING,
+ mDefaultDisableAppProfilerPssProfiling);
}
@NeverCompile // Avoid size overhead of debugging code.
@@ -2217,6 +2239,9 @@
pw.print(" "); pw.print(KEY_ENABLE_NEW_OOMADJ);
pw.print("="); pw.println(ENABLE_NEW_OOMADJ);
+ pw.print(" "); pw.print(KEY_DISABLE_APP_PROFILER_PSS_PROFILING);
+ pw.print("="); pw.println(APP_PROFILER_PSS_PROFILING_DISABLED);
+
pw.println();
if (mOverrideMaxCachedProcesses >= 0) {
pw.print(" mOverrideMaxCachedProcesses="); pw.println(mOverrideMaxCachedProcesses);
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 16f2226..e7f4bf9 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -633,16 +633,20 @@
return st.vsize > 0 && st.uid < FIRST_APPLICATION_UID;
});
}
- final int numOfStats = stats.size();
- for (int j = 0; j < numOfStats; j++) {
- synchronized (mService.mPidsSelfLocked) {
- if (mService.mPidsSelfLocked.indexOfKey(stats.get(j).pid) >= 0) {
- // This is one of our own processes; skip it.
- continue;
+
+ if (!mService.mConstants.APP_PROFILER_PSS_PROFILING_DISABLED) {
+ final int numOfStats = stats.size();
+ for (int j = 0; j < numOfStats; j++) {
+ synchronized (mService.mPidsSelfLocked) {
+ if (mService.mPidsSelfLocked.indexOfKey(stats.get(j).pid) >= 0) {
+ // This is one of our own processes; skip it.
+ continue;
+ }
}
+ nativeTotalPss += Debug.getPss(stats.get(j).pid, null, null);
}
- nativeTotalPss += Debug.getPss(stats.get(j).pid, null, null);
}
+
memInfo.readMemInfo();
synchronized (mService.mProcessStats.mLock) {
if (DEBUG_PSS) {
@@ -706,7 +710,8 @@
final boolean skipPSSCollection =
(profile.mApp.mOptRecord != null
&& profile.mApp.mOptRecord.skipPSSCollectionBecauseFrozen())
- || mService.isCameraActiveForUid(profile.mApp.uid);
+ || mService.isCameraActiveForUid(profile.mApp.uid)
+ || mService.mConstants.APP_PROFILER_PSS_PROFILING_DISABLED;
long pss = skipPSSCollection ? 0 : Debug.getPss(pid, tmp, null);
long endTime = SystemClock.currentThreadTimeMillis();
synchronized (mProfilerLock) {