Uses PMI.PackageListObserver in AMS to listen to new packages.

PackageMonitor is BroadcastReceiver-based and occasionally takes a while
(30+seconds) before being notified about new packages, especially during
high-activity moments like CTS.

PMI.PackageListObserver is a way for system_server services to
directly listen to package changes without relying on broadcasts and does not suffer the same delays.

Bug: 261217661
Test: go/abtd to check flakiness in CtsAccessibilityServiceTestCases
Change-Id: I8b77c25de2f7f128f921f83ace9013e53dee1a6e
This commit is contained in:
Daniel Norman
2023-01-27 13:48:18 -08:00
parent 48ae0d867f
commit e04eb4fa34

View File

@@ -611,6 +611,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
private void onSomePackagesChangedLocked() {
final AccessibilityUserState userState = getCurrentUserStateLocked();
// Reload the installed services since some services may have different attributes
// or resolve info (does not support equals), etc. Remove them then to force reload.
userState.mInstalledServices.clear();
if (readConfigurationForUserStateLocked(userState)) {
onUserStateChangedLocked(userState);
}
}
private void registerBroadcastReceivers() {
PackageMonitor monitor = new PackageMonitor() {
@Override
@@ -626,15 +636,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
if (getChangingUserId() != mCurrentUserId) {
return;
}
// We will update when the automation service dies.
final AccessibilityUserState userState = getCurrentUserStateLocked();
// We have to reload the installed services since some services may
// have different attributes, resolve info (does not support equals),
// etc. Remove them then to force reload.
userState.mInstalledServices.clear();
if (readConfigurationForUserStateLocked(userState)) {
onUserStateChangedLocked(userState);
}
onSomePackagesChangedLocked();
}
}
@@ -766,6 +768,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
// package changes
monitor.register(mContext, null, UserHandle.ALL, true);
// Register an additional observer for new packages using PackageManagerInternal, which
// generally notifies observers much sooner than the BroadcastReceiver-based PackageMonitor.
final PackageManagerInternal pm = LocalServices.getService(
PackageManagerInternal.class);
if (pm != null) {
pm.getPackageList(new PackageManagerInternal.PackageListObserver() {
@Override
public void onPackageAdded(String packageName, int uid) {
final int userId = UserHandle.getUserId(uid);
synchronized (mLock) {
if (userId == mCurrentUserId) {
onSomePackagesChangedLocked();
}
}
}
});
}
// user change and unlock
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);