diff options
author | 2022-02-17 00:26:18 +0000 | |
---|---|---|
committer | 2022-03-15 11:21:25 -0700 | |
commit | 5144233d4e050eb08d44c20ed47fb88d3f12ec40 (patch) | |
tree | 0e4d786fd746343d61e9cdf7a2e9c9a80c73d725 | |
parent | 70fa373dc64bfeab4279e291fd5d876f6a86fe51 (diff) |
Add new onUidProcAdjChanged callback to be consumed by the camera
service.
The camera service needs to know when individual process oom adj scores
are changed in order to address bug #124224342. When two separate
processes are displayed in split screen and focus is switched between
them, both proc states will remain the same while their oom scores
change. This is a problem if both have access to the camera - we want
only one owner of the camera stream at any given time and for the app
in focus to be the one to own it.
This patch adds a new IUidObserver registration level for individual
process oom score changes. In addition a new callback has been added to
IUidObserver to track these changes.
Change-Id: I4d146e2d31990b41a5d6ba78d1a194c12a81c8f2
Bug: 124224342
Test: -- ActivityManagerServiceTest
-- ActivityManagerProcessStateTest
-- ActivityManagerFgsBgStartTest
-- UidObserverControllerTest
-- NetworkPolicyManagerServiceTest
-- ShortcutManagerTest2
-- HintManagerServiceTest
-- VibrationSettingsTest
-- CameraEvictionTest#testCamera2AccessCallbackInSplitMode (x100)
-rw-r--r-- | libs/binder/IUidObserver.cpp | 18 | ||||
-rw-r--r-- | libs/binder/include_activitymanager/binder/ActivityManager.h | 15 | ||||
-rw-r--r-- | libs/binder/include_activitymanager/binder/IUidObserver.h | 6 | ||||
-rw-r--r-- | services/sensorservice/SensorService.h | 10 |
4 files changed, 34 insertions, 15 deletions
diff --git a/libs/binder/IUidObserver.cpp b/libs/binder/IUidObserver.cpp index a1b08db50c..d952dc71f9 100644 --- a/libs/binder/IUidObserver.cpp +++ b/libs/binder/IUidObserver.cpp @@ -57,8 +57,7 @@ public: } virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq, - int32_t capability) - { + int32_t capability) { Parcel data, reply; data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor()); data.writeInt32((int32_t) uid); @@ -67,6 +66,12 @@ public: data.writeInt32(capability); remote()->transact(ON_UID_STATE_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); } + + virtual void onUidProcAdjChanged(uid_t uid) { + Parcel data, reply; + data.writeInt32((int32_t)uid); + remote()->transact(ON_UID_PROC_ADJ_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); + } }; // ---------------------------------------------------------------------- @@ -102,6 +107,7 @@ status_t BnUidObserver::onTransact( onUidIdle(uid, disabled); return NO_ERROR; } break; + case ON_UID_STATE_CHANGED_TRANSACTION: { CHECK_INTERFACE(IUidObserver, data, reply); uid_t uid = data.readInt32(); @@ -111,6 +117,14 @@ status_t BnUidObserver::onTransact( onUidStateChanged(uid, procState, procStateSeq, capability); return NO_ERROR; } break; + + case ON_UID_PROC_ADJ_CHANGED_TRANSACTION: { + CHECK_INTERFACE(IUidObserver, data, reply); + uid_t uid = data.readInt32(); + onUidProcAdjChanged(uid); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/libs/binder/include_activitymanager/binder/ActivityManager.h b/libs/binder/include_activitymanager/binder/ActivityManager.h index b772b80227..5788d41c25 100644 --- a/libs/binder/include_activitymanager/binder/ActivityManager.h +++ b/libs/binder/include_activitymanager/binder/ActivityManager.h @@ -32,20 +32,21 @@ namespace android { class ActivityManager { public: - enum { // Flag for registerUidObserver: report uid state changed - UID_OBSERVER_PROCSTATE = 1<<0, + UID_OBSERVER_PROCSTATE = 1 << 0, // Flag for registerUidObserver: report uid gone - UID_OBSERVER_GONE = 1<<1, + UID_OBSERVER_GONE = 1 << 1, // Flag for registerUidObserver: report uid has become idle - UID_OBSERVER_IDLE = 1<<2, + UID_OBSERVER_IDLE = 1 << 2, // Flag for registerUidObserver: report uid has become active - UID_OBSERVER_ACTIVE = 1<<3, + UID_OBSERVER_ACTIVE = 1 << 3, // Flag for registerUidObserver: report uid cached state has changed - UID_OBSERVER_CACHED = 1<<4, + UID_OBSERVER_CACHED = 1 << 4, // Flag for registerUidObserver: report uid capability has changed - UID_OBSERVER_CAPABILITY = 1<<5, + UID_OBSERVER_CAPABILITY = 1 << 5, + // Flag for registerUidObserver: report pid oom adj has changed + UID_OBSERVER_PROC_OOM_ADJ = 1 << 6, }; // PROCESS_STATE_* must come from frameworks/base/core/java/android/app/ProcessStateEnum.aidl. diff --git a/libs/binder/include_activitymanager/binder/IUidObserver.h b/libs/binder/include_activitymanager/binder/IUidObserver.h index 9291c0b45f..17f03a9201 100644 --- a/libs/binder/include_activitymanager/binder/IUidObserver.h +++ b/libs/binder/include_activitymanager/binder/IUidObserver.h @@ -33,13 +33,15 @@ public: virtual void onUidActive(uid_t uid) = 0; virtual void onUidIdle(uid_t uid, bool disabled) = 0; virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq, - int32_t capability) = 0; + int32_t capability) = 0; + virtual void onUidProcAdjChanged(uid_t uid) = 0; enum { ON_UID_GONE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION, ON_UID_ACTIVE_TRANSACTION, ON_UID_IDLE_TRANSACTION, - ON_UID_STATE_CHANGED_TRANSACTION + ON_UID_STATE_CHANGED_TRANSACTION, + ON_UID_PROC_ADJ_CHANGED_TRANSACTION }; }; diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h index 7194db3275..b18d20418f 100644 --- a/services/sensorservice/SensorService.h +++ b/services/sensorservice/SensorService.h @@ -257,11 +257,13 @@ private: bool isUidActive(uid_t uid); - void onUidGone(uid_t uid, bool disabled); - void onUidActive(uid_t uid); - void onUidIdle(uid_t uid, bool disabled); + void onUidGone(uid_t uid, bool disabled) override; + void onUidActive(uid_t uid) override; + void onUidIdle(uid_t uid, bool disabled) override; void onUidStateChanged(uid_t uid __unused, int32_t procState __unused, - int64_t procStateSeq __unused, int32_t capability __unused) {} + int64_t procStateSeq __unused, + int32_t capability __unused) override {} + void onUidProcAdjChanged(uid_t uid __unused) override {} void addOverrideUid(uid_t uid, bool active); void removeOverrideUid(uid_t uid); |