summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AconfigFlags.bp7
-rw-r--r--core/java/android/os/PowerManager.java11
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java17
-rw-r--r--services/core/java/com/android/server/power/feature/PowerManagerFlags.java12
-rw-r--r--services/core/java/com/android/server/power/feature/power_flags.aconfig11
-rw-r--r--services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java41
6 files changed, 95 insertions, 4 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 834398e5c2c2..ac756ea1d624 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -1573,6 +1573,13 @@ java_aconfig_library {
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+java_aconfig_library {
+ name: "power_flags_lib_host",
+ aconfig_declarations: "power_flags",
+ host_supported: true,
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
// Content
aconfig_declarations {
name: "android.content.flags-aconfig",
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index e769abec7dd9..5129af6be442 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -4213,6 +4213,17 @@ public final class PowerManager {
else mFlags &= ~UNIMPORTANT_FOR_LOGGING;
}
+ /** @hide */
+ public void updateUids(int[] uids) {
+ synchronized (mToken) {
+ try {
+ mService.updateWakeLockUids(mToken, uids);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
@Override
public String toString() {
synchronized (mToken) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 090707db50a5..8fae875eb29b 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -5979,10 +5979,19 @@ public final class PowerManagerService extends SystemService
if (uids != null) {
ws = new WorkSource();
- // XXX should WorkSource have a way to set uids as an int[] instead of adding them
- // one at a time?
- for (int uid : uids) {
- ws.add(uid);
+ if (mFeatureFlags.isWakelockAttributionViaWorkchainEnabled()) {
+ int callingUid = Binder.getCallingUid();
+ for (int uid : uids) {
+ WorkChain workChain = ws.createWorkChain();
+ workChain.addNode(uid, null);
+ workChain.addNode(callingUid, null);
+ }
+ } else {
+ // XXX should WorkSource have a way to set uids as an int[] instead of
+ // adding them one at a time?
+ for (int uid : uids) {
+ ws.add(uid);
+ }
}
}
updateWakeLockWorkSource(lock, ws, null);
diff --git a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
index 42b44013bea2..ebc50fd85f24 100644
--- a/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
+++ b/services/core/java/com/android/server/power/feature/PowerManagerFlags.java
@@ -63,6 +63,10 @@ public class PowerManagerFlags {
private final FlagState mMoveWscLoggingToNotifier =
new FlagState(Flags.FLAG_MOVE_WSC_LOGGING_TO_NOTIFIER, Flags::moveWscLoggingToNotifier);
+ private final FlagState mWakelockAttributionViaWorkchain =
+ new FlagState(Flags.FLAG_WAKELOCK_ATTRIBUTION_VIA_WORKCHAIN,
+ Flags::wakelockAttributionViaWorkchain);
+
/** Returns whether early-screen-timeout-detector is enabled on not. */
public boolean isEarlyScreenTimeoutDetectorEnabled() {
return mEarlyScreenTimeoutDetectorFlagState.isEnabled();
@@ -110,6 +114,13 @@ public class PowerManagerFlags {
}
/**
+ * @return Whether the wakelock attribution via workchain is enabled
+ */
+ public boolean isWakelockAttributionViaWorkchainEnabled() {
+ return mWakelockAttributionViaWorkchain.isEnabled();
+ }
+
+ /**
* dumps all flagstates
* @param pw printWriter
*/
@@ -120,6 +131,7 @@ public class PowerManagerFlags {
pw.println(" " + mPerDisplayWakeByTouch);
pw.println(" " + mFrameworkWakelockInfo);
pw.println(" " + mMoveWscLoggingToNotifier);
+ pw.println(" " + mWakelockAttributionViaWorkchain);
}
private static class FlagState {
diff --git a/services/core/java/com/android/server/power/feature/power_flags.aconfig b/services/core/java/com/android/server/power/feature/power_flags.aconfig
index 613daf820e34..fefe195dc337 100644
--- a/services/core/java/com/android/server/power/feature/power_flags.aconfig
+++ b/services/core/java/com/android/server/power/feature/power_flags.aconfig
@@ -23,6 +23,17 @@ flag {
}
flag {
+ name: "wakelock_attribution_via_workchain"
+ namespace: "power"
+ description: "Enables the attribution of wakelocks via WorkChain for updateWakelockUids"
+ bug: "331304805"
+ is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "improve_wakelock_latency"
namespace: "power"
description: "Feature flag for tracking the optimizations to improve the latency of acquiring and releasing a wakelock."
diff --git a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
index 6b138b986fe7..29a17e1c85ab 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -89,9 +89,13 @@ import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.UserHandle;
+import android.os.WorkSource;
import android.os.test.TestLooper;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.provider.Settings;
@@ -200,6 +204,9 @@ public class PowerManagerServiceTest {
@Rule public SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
private PowerManagerService mService;
private ContextWrapper mContextSpy;
private BatteryReceiver mBatteryReceiver;
@@ -3045,6 +3052,40 @@ public class PowerManagerServiceTest {
}
/**
+ * Test IPowerManager.updateWakeLockUids() updates the workchain with the new uids
+ */
+ @Test
+ @RequiresFlagsEnabled({Flags.FLAG_WAKELOCK_ATTRIBUTION_VIA_WORKCHAIN})
+ public void test_updateWakelockUids_updatesWorkchain() {
+ createService();
+ startSystem();
+ final String tag = "wakelock1";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+ int flags = PowerManager.PARTIAL_WAKE_LOCK;
+ final IWakeLockCallback callback1 = Mockito.mock(IWakeLockCallback.class);
+ final IBinder callbackBinder1 = Mockito.mock(Binder.class);
+ when(callback1.asBinder()).thenReturn(callbackBinder1);
+ WorkSource oldWorksource = new WorkSource();
+ oldWorksource.createWorkChain().addNode(1000, null);
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ oldWorksource, null /* historyTag */, Display.INVALID_DISPLAY, callback1);
+ verify(mNotifierMock).onWakeLockAcquired(anyInt(), eq(tag), eq(packageName),
+ anyInt(), anyInt(), eq(oldWorksource), any(), same(callback1));
+
+ WorkSource newWorksource = new WorkSource();
+ newWorksource.createWorkChain().addNode(1011, null)
+ .addNode(Binder.getCallingUid(), null);
+ newWorksource.createWorkChain().addNode(1012, null)
+ .addNode(Binder.getCallingUid(), null);
+ mService.getBinderServiceInstance().updateWakeLockUids(token, new int[]{1011, 1012});
+ verify(mNotifierMock).onWakeLockChanging(anyInt(), eq(tag), eq(packageName),
+ anyInt(), anyInt(), eq(oldWorksource), any(), any(),
+ anyInt(), eq(tag), eq(packageName), anyInt(), anyInt(), eq(newWorksource), any(),
+ any());
+ }
+
+ /**
* Test IPowerManager.updateWakeLockCallback() with a new IWakeLockCallback.
*/
@Test