summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/infra/AbstractMasterSystemService.java389
1 files changed, 198 insertions, 191 deletions
diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
index 6e5e0fd5224f..af065861f1ae 100644
--- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
+++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java
@@ -193,6 +193,8 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
@Nullable
private UserManagerInternal mUm;
+ private final MyPackageMonitor mPackageMonitor;
+
/**
* Default constructor.
*
@@ -289,6 +291,7 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
}
});
}
+ mPackageMonitor = new MyPackageMonitor(/* supportsPackageRestartQuery */ true);
startTrackingPackageChanges();
}
@@ -986,260 +989,264 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
}
}
- private void startTrackingPackageChanges() {
- final PackageMonitor monitor = new PackageMonitor(true) {
+ private class MyPackageMonitor extends PackageMonitor {
+ MyPackageMonitor(boolean supportsPackageRestartQuery) {
+ super(supportsPackageRestartQuery);
+ }
- @Override
- public void onPackageUpdateStarted(@NonNull String packageName, int uid) {
- if (verbose) Slog.v(mTag, "onPackageUpdateStarted(): " + packageName);
+ @Override
+ public void onPackageUpdateStarted(@NonNull String packageName, int uid) {
+ if (verbose) Slog.v(mTag, "onPackageUpdateStarted(): " + packageName);
+ synchronized (mLock) {
final String activePackageName = getActiveServicePackageNameLocked();
if (!packageName.equals(activePackageName)) return;
final int userId = getChangingUserId();
- synchronized (mLock) {
- if (mUpdatingPackageNames == null) {
- mUpdatingPackageNames = new SparseArray<String>(mServicesCacheList.size());
+
+ if (mUpdatingPackageNames == null) {
+ mUpdatingPackageNames = new SparseArray<String>(mServicesCacheList.size());
+ }
+ mUpdatingPackageNames.put(userId, packageName);
+ onServicePackageUpdatingLocked(userId);
+ if ((mServicePackagePolicyFlags & PACKAGE_UPDATE_POLICY_NO_REFRESH) != 0) {
+ if (debug) {
+ Slog.d(mTag, "Holding service for user " + userId + " while package "
+ + activePackageName + " is being updated");
}
- mUpdatingPackageNames.put(userId, packageName);
- onServicePackageUpdatingLocked(userId);
- if ((mServicePackagePolicyFlags & PACKAGE_UPDATE_POLICY_NO_REFRESH) != 0) {
- if (debug) {
- Slog.d(mTag, "Holding service for user " + userId + " while package "
- + activePackageName + " is being updated");
- }
- } else {
- if (debug) {
- Slog.d(mTag, "Removing service for user " + userId
- + " because package " + activePackageName
- + " is being updated");
- }
- removeCachedServiceListLocked(userId);
+ } else {
+ if (debug) {
+ Slog.d(mTag, "Removing service for user " + userId
+ + " because package " + activePackageName
+ + " is being updated");
+ }
+ removeCachedServiceListLocked(userId);
- if ((mServicePackagePolicyFlags & PACKAGE_UPDATE_POLICY_REFRESH_EAGER)
- != 0) {
- if (debug) {
- Slog.d(mTag, "Eagerly recreating service for user "
- + userId);
- }
- getServiceForUserLocked(userId);
+ if ((mServicePackagePolicyFlags & PACKAGE_UPDATE_POLICY_REFRESH_EAGER)
+ != 0) {
+ if (debug) {
+ Slog.d(mTag, "Eagerly recreating service for user "
+ + userId);
}
+ getServiceForUserLocked(userId);
}
}
}
+ }
- @Override
- public void onPackageUpdateFinished(@NonNull String packageName, int uid) {
- if (verbose) Slog.v(mTag, "onPackageUpdateFinished(): " + packageName);
- final int userId = getChangingUserId();
- synchronized (mLock) {
- final String activePackageName = mUpdatingPackageNames == null ? null
- : mUpdatingPackageNames.get(userId);
- if (packageName.equals(activePackageName)) {
- if (mUpdatingPackageNames != null) {
- mUpdatingPackageNames.remove(userId);
- if (mUpdatingPackageNames.size() == 0) {
- mUpdatingPackageNames = null;
- }
+ @Override
+ public void onPackageUpdateFinished(@NonNull String packageName, int uid) {
+ if (verbose) Slog.v(mTag, "onPackageUpdateFinished(): " + packageName);
+ final int userId = getChangingUserId();
+ synchronized (mLock) {
+ final String activePackageName = mUpdatingPackageNames == null ? null
+ : mUpdatingPackageNames.get(userId);
+ if (packageName.equals(activePackageName)) {
+ if (mUpdatingPackageNames != null) {
+ mUpdatingPackageNames.remove(userId);
+ if (mUpdatingPackageNames.size() == 0) {
+ mUpdatingPackageNames = null;
}
- onServicePackageUpdatedLocked(userId);
- } else {
- handlePackageUpdateLocked(packageName);
}
+ onServicePackageUpdatedLocked(userId);
+ } else {
+ handlePackageUpdateLocked(packageName);
}
}
+ }
- @Override
- public void onPackageRemoved(String packageName, int uid) {
- if (mServiceNameResolver != null
- && mServiceNameResolver.isConfiguredInMultipleMode()) {
- final int userId = getChangingUserId();
- synchronized (mLock) {
- handlePackageRemovedMultiModeLocked(packageName, userId);
- }
- return;
+ @Override
+ public void onPackageRemoved(String packageName, int uid) {
+ if (mServiceNameResolver != null
+ && mServiceNameResolver.isConfiguredInMultipleMode()) {
+ final int userId = getChangingUserId();
+ synchronized (mLock) {
+ handlePackageRemovedMultiModeLocked(packageName, userId);
}
+ return;
+ }
- synchronized (mLock) {
- final int userId = getChangingUserId();
- final S service = peekServiceForUserLocked(userId);
- if (service != null) {
- final ComponentName componentName = service.getServiceComponentName();
- if (componentName != null) {
- if (packageName.equals(componentName.getPackageName())) {
- handleActiveServiceRemoved(userId);
- }
+ synchronized (mLock) {
+ final int userId = getChangingUserId();
+ final S service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ final ComponentName componentName = service.getServiceComponentName();
+ if (componentName != null) {
+ if (packageName.equals(componentName.getPackageName())) {
+ handleActiveServiceRemoved(userId);
}
}
}
}
+ }
- @Override
- public boolean onHandleForceStop(Intent intent, String[] packages,
- int uid, boolean doit) {
- synchronized (mLock) {
- final String activePackageName = getActiveServicePackageNameLocked();
- for (String pkg : packages) {
- if (pkg.equals(activePackageName)) {
- if (!doit) {
- return true;
- }
- final String action = intent.getAction();
- final int userId = getChangingUserId();
- if (Intent.ACTION_PACKAGE_RESTARTED.equals(action)) {
- handleActiveServiceRestartedLocked(activePackageName, userId);
- } else {
- removeCachedServiceListLocked(userId);
- }
+ @Override
+ public boolean onHandleForceStop(Intent intent, String[] packages,
+ int uid, boolean doit) {
+ synchronized (mLock) {
+ final String activePackageName = getActiveServicePackageNameLocked();
+ for (String pkg : packages) {
+ if (pkg.equals(activePackageName)) {
+ if (!doit) {
+ return true;
+ }
+ final String action = intent.getAction();
+ final int userId = getChangingUserId();
+ if (Intent.ACTION_PACKAGE_RESTARTED.equals(action)) {
+ handleActiveServiceRestartedLocked(activePackageName, userId);
} else {
- handlePackageUpdateLocked(pkg);
+ removeCachedServiceListLocked(userId);
}
+ } else {
+ handlePackageUpdateLocked(pkg);
}
}
- return false;
}
+ return false;
+ }
- @Override
- public void onPackageDataCleared(String packageName, int uid) {
- if (verbose) Slog.v(mTag, "onPackageDataCleared(): " + packageName);
- final int userId = getChangingUserId();
+ @Override
+ public void onPackageDataCleared(String packageName, int uid) {
+ if (verbose) Slog.v(mTag, "onPackageDataCleared(): " + packageName);
+ final int userId = getChangingUserId();
- if (mServiceNameResolver != null
- && mServiceNameResolver.isConfiguredInMultipleMode()) {
- synchronized (mLock) {
- onServicePackageDataClearedMultiModeLocked(packageName, userId);
- }
- return;
+ if (mServiceNameResolver != null
+ && mServiceNameResolver.isConfiguredInMultipleMode()) {
+ synchronized (mLock) {
+ onServicePackageDataClearedMultiModeLocked(packageName, userId);
}
+ return;
+ }
- synchronized (mLock) {
- final S service = peekServiceForUserLocked(userId);
- if (service != null) {
- final ComponentName componentName = service.getServiceComponentName();
- if (componentName != null) {
- if (packageName.equals(componentName.getPackageName())) {
- onServicePackageDataClearedLocked(userId);
- }
+ synchronized (mLock) {
+ final S service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ final ComponentName componentName = service.getServiceComponentName();
+ if (componentName != null) {
+ if (packageName.equals(componentName.getPackageName())) {
+ onServicePackageDataClearedLocked(userId);
}
}
}
}
+ }
- private void handleActiveServiceRemoved(@UserIdInt int userId) {
- synchronized (mLock) {
- removeCachedServiceListLocked(userId);
+ private void handleActiveServiceRemoved(@UserIdInt int userId) {
+ synchronized (mLock) {
+ removeCachedServiceListLocked(userId);
+ }
+ final String serviceSettingsProperty = getServiceSettingsProperty();
+ if (serviceSettingsProperty != null) {
+ Settings.Secure.putStringForUser(getContext().getContentResolver(),
+ serviceSettingsProperty, null, userId);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void handleActiveServiceRestartedLocked(String activePackageName,
+ @UserIdInt int userId) {
+ if ((mServicePackagePolicyFlags & PACKAGE_RESTART_POLICY_NO_REFRESH) != 0) {
+ if (debug) {
+ Slog.d(mTag, "Holding service for user " + userId + " while package "
+ + activePackageName + " is being restarted");
}
- final String serviceSettingsProperty = getServiceSettingsProperty();
- if (serviceSettingsProperty != null) {
- Settings.Secure.putStringForUser(getContext().getContentResolver(),
- serviceSettingsProperty, null, userId);
+ } else {
+ if (debug) {
+ Slog.d(mTag, "Removing service for user " + userId
+ + " because package " + activePackageName
+ + " is being restarted");
}
- }
+ removeCachedServiceListLocked(userId);
- @GuardedBy("mLock")
- private void handleActiveServiceRestartedLocked(String activePackageName,
- @UserIdInt int userId) {
- if ((mServicePackagePolicyFlags & PACKAGE_RESTART_POLICY_NO_REFRESH) != 0) {
+ if ((mServicePackagePolicyFlags & PACKAGE_RESTART_POLICY_REFRESH_EAGER) != 0) {
if (debug) {
- Slog.d(mTag, "Holding service for user " + userId + " while package "
- + activePackageName + " is being restarted");
- }
- } else {
- if (debug) {
- Slog.d(mTag, "Removing service for user " + userId
- + " because package " + activePackageName
- + " is being restarted");
- }
- removeCachedServiceListLocked(userId);
-
- if ((mServicePackagePolicyFlags & PACKAGE_RESTART_POLICY_REFRESH_EAGER) != 0) {
- if (debug) {
- Slog.d(mTag, "Eagerly recreating service for user " + userId);
- }
- updateCachedServiceLocked(userId);
+ Slog.d(mTag, "Eagerly recreating service for user " + userId);
}
+ updateCachedServiceLocked(userId);
}
- onServicePackageRestartedLocked(userId);
}
+ onServicePackageRestartedLocked(userId);
+ }
- @Override
- public void onPackageModified(String packageName) {
- synchronized (mLock) {
- if (verbose) Slog.v(mTag, "onPackageModified(): " + packageName);
+ @Override
+ public void onPackageModified(String packageName) {
+ synchronized (mLock) {
+ if (verbose) Slog.v(mTag, "onPackageModified(): " + packageName);
- if (mServiceNameResolver == null) {
- return;
- }
+ if (mServiceNameResolver == null) {
+ return;
+ }
- final int userId = getChangingUserId();
- final String[] serviceNames = mServiceNameResolver.getDefaultServiceNameList(
- userId);
- if (serviceNames != null) {
- if (Flags.packageUpdateFixEnabled()) {
- if (mServiceNameResolver.isConfiguredInMultipleMode()) {
- // Remove any service that is in the cache but is no longer valid
- // after this modification for this particular package
- removeInvalidCachedServicesLocked(serviceNames, packageName,
- userId);
- }
+ final int userId = getChangingUserId();
+ final String[] serviceNames = mServiceNameResolver.getDefaultServiceNameList(
+ userId);
+ if (serviceNames != null) {
+ if (Flags.packageUpdateFixEnabled()) {
+ if (mServiceNameResolver.isConfiguredInMultipleMode()) {
+ // Remove any service that is in the cache but is no longer valid
+ // after this modification for this particular package
+ removeInvalidCachedServicesLocked(serviceNames, packageName,
+ userId);
}
+ }
- // Update services that are still valid
- for (int i = 0; i < serviceNames.length; i++) {
- peekAndUpdateCachedServiceLocked(packageName, userId,
- serviceNames[i]);
- }
+ // Update services that are still valid
+ for (int i = 0; i < serviceNames.length; i++) {
+ peekAndUpdateCachedServiceLocked(packageName, userId,
+ serviceNames[i]);
}
}
}
+ }
- @GuardedBy("mLock")
- private void peekAndUpdateCachedServiceLocked(String packageName, int userId,
- String serviceName) {
- if (serviceName == null) {
- return;
- }
-
- final ComponentName serviceComponentName =
- ComponentName.unflattenFromString(serviceName);
- if (serviceComponentName == null
- || !serviceComponentName.getPackageName().equals(packageName)) {
- return;
- }
+ @GuardedBy("mLock")
+ private void peekAndUpdateCachedServiceLocked(String packageName, int userId,
+ String serviceName) {
+ if (serviceName == null) {
+ return;
+ }
- // The default service package has changed, update the cached if the service
- // exists but no active component.
- final S service = peekServiceForUserLocked(userId);
- if (service != null) {
- final ComponentName componentName = service.getServiceComponentName();
- if (componentName == null) {
- if (verbose) Slog.v(mTag, "update cached");
- updateCachedServiceLocked(userId);
- }
- }
+ final ComponentName serviceComponentName =
+ ComponentName.unflattenFromString(serviceName);
+ if (serviceComponentName == null
+ || !serviceComponentName.getPackageName().equals(packageName)) {
+ return;
}
- @GuardedBy("mLock")
- private String getActiveServicePackageNameLocked() {
- final int userId = getChangingUserId();
- final S service = peekServiceForUserLocked(userId);
- if (service == null) {
- return null;
- }
- final ComponentName serviceComponent = service.getServiceComponentName();
- if (serviceComponent == null) {
- return null;
+ // The default service package has changed, update the cached if the service
+ // exists but no active component.
+ final S service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ final ComponentName componentName = service.getServiceComponentName();
+ if (componentName == null) {
+ if (verbose) Slog.v(mTag, "update cached");
+ updateCachedServiceLocked(userId);
}
- return serviceComponent.getPackageName();
}
+ }
- @GuardedBy("mLock")
- private void handlePackageUpdateLocked(String packageName) {
- visitServicesLocked((s) -> s.handlePackageUpdateLocked(packageName));
+ @GuardedBy("mLock")
+ private String getActiveServicePackageNameLocked() {
+ final int userId = getChangingUserId();
+ final S service = peekServiceForUserLocked(userId);
+ if (service == null) {
+ return null;
+ }
+ final ComponentName serviceComponent = service.getServiceComponentName();
+ if (serviceComponent == null) {
+ return null;
}
- };
+ return serviceComponent.getPackageName();
+ }
+ @GuardedBy("mLock")
+ private void handlePackageUpdateLocked(String packageName) {
+ visitServicesLocked((s) -> s.handlePackageUpdateLocked(packageName));
+ }
+ }
+
+ private void startTrackingPackageChanges() {
// package changes
- monitor.register(getContext(), null, UserHandle.ALL, true);
+ mPackageMonitor.register(getContext(), null, UserHandle.ALL, true);
}
@GuardedBy("mLock")