Loading services/core/java/com/android/server/om/OverlayManagerService.java +324 −218 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import static android.content.Intent.ACTION_PACKAGE_REMOVED; import static android.content.Intent.ACTION_USER_ADDED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.pm.PackageManager.SIGNATURE_MATCH; import static android.os.Trace.TRACE_TAG_RRO; import static android.os.Trace.traceBegin; import static android.os.Trace.traceEnd; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -223,6 +226,8 @@ public final class OverlayManagerService extends SystemService { public OverlayManagerService(@NonNull final Context context, @NonNull final Installer installer) { super(context); try { traceBegin(TRACE_TAG_RRO, "OMS#OverlayManagerService"); mSettingsFile = new AtomicFile( new File(Environment.getDataSystemDirectory(), "overlays.xml"), "overlays"); mPackageManager = new PackageManagerHelper(); Loading Loading @@ -253,6 +258,9 @@ public final class OverlayManagerService extends SystemService { publishBinderService(Context.OVERLAY_SERVICE, mService); publishLocalService(OverlayManagerService.class, this); } finally { traceEnd(TRACE_TAG_RRO); } } @Override Loading Loading @@ -280,6 +288,8 @@ public final class OverlayManagerService extends SystemService { @Override public void onSwitchUser(final int newUserId) { try { traceBegin(TRACE_TAG_RRO, "OMS#onSwitchUser " + newUserId); // ensure overlays in the settings are up-to-date, and propagate // any asset changes to the rest of the system synchronized (mLock) { Loading @@ -287,6 +297,9 @@ public final class OverlayManagerService extends SystemService { updateAssets(newUserId, targets); } schedulePersistSettings(); } finally { traceEnd(TRACE_TAG_RRO); } } private static String[] getDefaultOverlayPackages() { Loading Loading @@ -350,6 +363,8 @@ public final class OverlayManagerService extends SystemService { private void onPackageAdded(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageAdded " + packageName); for (final int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -364,10 +379,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageChanged(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageChanged " + packageName); for (int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -382,10 +402,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageUpgrading(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageUpgrading " + packageName); for (int userId : userIds) { synchronized (mLock) { mPackageManager.forgetPackageInfo(packageName, userId); Loading @@ -397,10 +422,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageUpgraded(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageUpgraded " + packageName); for (int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -415,10 +445,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageRemoved(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageRemoved " + packageName); for (int userId : userIds) { synchronized (mLock) { mPackageManager.forgetPackageInfo(packageName, userId); Loading @@ -430,6 +465,9 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } } Loading @@ -440,20 +478,30 @@ public final class OverlayManagerService extends SystemService { switch (intent.getAction()) { case ACTION_USER_ADDED: if (userId != UserHandle.USER_NULL) { try { traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_ADDED"); final ArrayList<String> targets; synchronized (mLock) { targets = mImpl.updateOverlaysForUser(userId); } updateOverlayPaths(userId, targets); } finally { traceEnd(TRACE_TAG_RRO); } } break; case ACTION_USER_REMOVED: if (userId != UserHandle.USER_NULL) { try { traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_REMOVED"); synchronized (mLock) { mImpl.onUserRemoved(userId); mPackageManager.forgetAllPackageInfos(userId); } } finally { traceEnd(TRACE_TAG_RRO); } } break; default: Loading @@ -466,16 +514,23 @@ public final class OverlayManagerService extends SystemService { private final IBinder mService = new IOverlayManager.Stub() { @Override public Map<String, List<OverlayInfo>> getAllOverlays(int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getAllOverlays " + userId); userId = handleIncomingUser(userId, "getAllOverlays"); synchronized (mLock) { return mImpl.getOverlaysForUser(userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public List<OverlayInfo> getOverlayInfosForTarget(@Nullable final String targetPackageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfosForTarget " + targetPackageName); userId = handleIncomingUser(userId, "getOverlayInfosForTarget"); if (targetPackageName == null) { return Collections.emptyList(); Loading @@ -484,11 +539,16 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { return mImpl.getOverlayInfosForTarget(targetPackageName, userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public OverlayInfo getOverlayInfo(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfo " + packageName); userId = handleIncomingUser(userId, "getOverlayInfo"); if (packageName == null) { return null; Loading @@ -497,11 +557,16 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { return mImpl.getOverlayInfo(packageName, userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabled(@Nullable final String packageName, final boolean enable, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabled " + packageName + " " + enable); enforceChangeOverlayPackagesPermission("setEnabled"); userId = handleIncomingUser(userId, "setEnabled"); if (packageName == null) { Loading @@ -516,11 +581,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabledExclusive(@Nullable final String packageName, final boolean enable, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusive " + packageName + " " + enable); enforceChangeOverlayPackagesPermission("setEnabledExclusive"); userId = handleIncomingUser(userId, "setEnabledExclusive"); if (packageName == null || !enable) { Loading @@ -536,11 +606,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabledExclusiveInCategory(@Nullable String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusiveInCategory " + packageName); enforceChangeOverlayPackagesPermission("setEnabledExclusiveInCategory"); userId = handleIncomingUser(userId, "setEnabledExclusiveInCategory"); if (packageName == null) { Loading @@ -556,11 +631,17 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setPriority(@Nullable final String packageName, @Nullable final String parentPackageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setPriority " + packageName + " " + parentPackageName); enforceChangeOverlayPackagesPermission("setPriority"); userId = handleIncomingUser(userId, "setPriority"); if (packageName == null || parentPackageName == null) { Loading @@ -575,11 +656,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setHighestPriority(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setHighestPriority " + packageName); enforceChangeOverlayPackagesPermission("setHighestPriority"); userId = handleIncomingUser(userId, "setHighestPriority"); if (packageName == null) { Loading @@ -594,11 +680,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setLowestPriority(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setLowestPriority " + packageName); enforceChangeOverlayPackagesPermission("setLowestPriority"); userId = handleIncomingUser(userId, "setLowestPriority"); if (packageName == null) { Loading @@ -613,6 +704,9 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override Loading Loading @@ -705,16 +799,20 @@ public final class OverlayManagerService extends SystemService { * Updates the target packages' set of enabled overlays in PackageManager. */ private void updateOverlayPaths(int userId, List<String> targetPackageNames) { try { traceBegin(TRACE_TAG_RRO, "OMS#updateOverlayPaths " + targetPackageNames); if (DEBUG) { Slog.d(TAG, "Updating overlay assets"); } final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); final boolean updateFrameworkRes = targetPackageNames.contains("android"); if (updateFrameworkRes) { targetPackageNames = pm.getTargetPackageNames(userId); } final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size()); final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size()); synchronized (mLock) { final List<String> frameworkOverlays = mImpl.getEnabledOverlayPackageNames("android", userId); Loading Loading @@ -745,6 +843,9 @@ public final class OverlayManagerService extends SystemService { targetPackageName, userId)); } } } finally { traceEnd(TRACE_TAG_RRO); } } private void updateAssets(final int userId, final String targetPackageName) { Loading Loading @@ -785,6 +886,8 @@ public final class OverlayManagerService extends SystemService { } private void restoreSettings() { try { traceBegin(TRACE_TAG_RRO, "OMS#restoreSettings"); synchronized (mLock) { if (!mSettingsFile.getBaseFile().exists()) { return; Loading Loading @@ -812,6 +915,9 @@ public final class OverlayManagerService extends SystemService { Slog.e(TAG, "failed to restore overlay state", e); } } } finally { traceEnd(TRACE_TAG_RRO); } } private static final class PackageManagerHelper implements Loading Loading
services/core/java/com/android/server/om/OverlayManagerService.java +324 −218 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import static android.content.Intent.ACTION_PACKAGE_REMOVED; import static android.content.Intent.ACTION_USER_ADDED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.pm.PackageManager.SIGNATURE_MATCH; import static android.os.Trace.TRACE_TAG_RRO; import static android.os.Trace.traceBegin; import static android.os.Trace.traceEnd; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -223,6 +226,8 @@ public final class OverlayManagerService extends SystemService { public OverlayManagerService(@NonNull final Context context, @NonNull final Installer installer) { super(context); try { traceBegin(TRACE_TAG_RRO, "OMS#OverlayManagerService"); mSettingsFile = new AtomicFile( new File(Environment.getDataSystemDirectory(), "overlays.xml"), "overlays"); mPackageManager = new PackageManagerHelper(); Loading Loading @@ -253,6 +258,9 @@ public final class OverlayManagerService extends SystemService { publishBinderService(Context.OVERLAY_SERVICE, mService); publishLocalService(OverlayManagerService.class, this); } finally { traceEnd(TRACE_TAG_RRO); } } @Override Loading Loading @@ -280,6 +288,8 @@ public final class OverlayManagerService extends SystemService { @Override public void onSwitchUser(final int newUserId) { try { traceBegin(TRACE_TAG_RRO, "OMS#onSwitchUser " + newUserId); // ensure overlays in the settings are up-to-date, and propagate // any asset changes to the rest of the system synchronized (mLock) { Loading @@ -287,6 +297,9 @@ public final class OverlayManagerService extends SystemService { updateAssets(newUserId, targets); } schedulePersistSettings(); } finally { traceEnd(TRACE_TAG_RRO); } } private static String[] getDefaultOverlayPackages() { Loading Loading @@ -350,6 +363,8 @@ public final class OverlayManagerService extends SystemService { private void onPackageAdded(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageAdded " + packageName); for (final int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -364,10 +379,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageChanged(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageChanged " + packageName); for (int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -382,10 +402,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageUpgrading(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageUpgrading " + packageName); for (int userId : userIds) { synchronized (mLock) { mPackageManager.forgetPackageInfo(packageName, userId); Loading @@ -397,10 +422,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageUpgraded(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageUpgraded " + packageName); for (int userId : userIds) { synchronized (mLock) { final PackageInfo pi = mPackageManager.getPackageInfo(packageName, userId, Loading @@ -415,10 +445,15 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } private void onPackageRemoved(@NonNull final String packageName, @NonNull final int[] userIds) { try { traceBegin(TRACE_TAG_RRO, "OMS#onPackageRemoved " + packageName); for (int userId : userIds) { synchronized (mLock) { mPackageManager.forgetPackageInfo(packageName, userId); Loading @@ -430,6 +465,9 @@ public final class OverlayManagerService extends SystemService { } } } } finally { traceEnd(TRACE_TAG_RRO); } } } Loading @@ -440,20 +478,30 @@ public final class OverlayManagerService extends SystemService { switch (intent.getAction()) { case ACTION_USER_ADDED: if (userId != UserHandle.USER_NULL) { try { traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_ADDED"); final ArrayList<String> targets; synchronized (mLock) { targets = mImpl.updateOverlaysForUser(userId); } updateOverlayPaths(userId, targets); } finally { traceEnd(TRACE_TAG_RRO); } } break; case ACTION_USER_REMOVED: if (userId != UserHandle.USER_NULL) { try { traceBegin(TRACE_TAG_RRO, "OMS ACTION_USER_REMOVED"); synchronized (mLock) { mImpl.onUserRemoved(userId); mPackageManager.forgetAllPackageInfos(userId); } } finally { traceEnd(TRACE_TAG_RRO); } } break; default: Loading @@ -466,16 +514,23 @@ public final class OverlayManagerService extends SystemService { private final IBinder mService = new IOverlayManager.Stub() { @Override public Map<String, List<OverlayInfo>> getAllOverlays(int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getAllOverlays " + userId); userId = handleIncomingUser(userId, "getAllOverlays"); synchronized (mLock) { return mImpl.getOverlaysForUser(userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public List<OverlayInfo> getOverlayInfosForTarget(@Nullable final String targetPackageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfosForTarget " + targetPackageName); userId = handleIncomingUser(userId, "getOverlayInfosForTarget"); if (targetPackageName == null) { return Collections.emptyList(); Loading @@ -484,11 +539,16 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { return mImpl.getOverlayInfosForTarget(targetPackageName, userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public OverlayInfo getOverlayInfo(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#getOverlayInfo " + packageName); userId = handleIncomingUser(userId, "getOverlayInfo"); if (packageName == null) { return null; Loading @@ -497,11 +557,16 @@ public final class OverlayManagerService extends SystemService { synchronized (mLock) { return mImpl.getOverlayInfo(packageName, userId); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabled(@Nullable final String packageName, final boolean enable, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabled " + packageName + " " + enable); enforceChangeOverlayPackagesPermission("setEnabled"); userId = handleIncomingUser(userId, "setEnabled"); if (packageName == null) { Loading @@ -516,11 +581,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabledExclusive(@Nullable final String packageName, final boolean enable, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusive " + packageName + " " + enable); enforceChangeOverlayPackagesPermission("setEnabledExclusive"); userId = handleIncomingUser(userId, "setEnabledExclusive"); if (packageName == null || !enable) { Loading @@ -536,11 +606,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setEnabledExclusiveInCategory(@Nullable String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setEnabledExclusiveInCategory " + packageName); enforceChangeOverlayPackagesPermission("setEnabledExclusiveInCategory"); userId = handleIncomingUser(userId, "setEnabledExclusiveInCategory"); if (packageName == null) { Loading @@ -556,11 +631,17 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setPriority(@Nullable final String packageName, @Nullable final String parentPackageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setPriority " + packageName + " " + parentPackageName); enforceChangeOverlayPackagesPermission("setPriority"); userId = handleIncomingUser(userId, "setPriority"); if (packageName == null || parentPackageName == null) { Loading @@ -575,11 +656,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setHighestPriority(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setHighestPriority " + packageName); enforceChangeOverlayPackagesPermission("setHighestPriority"); userId = handleIncomingUser(userId, "setHighestPriority"); if (packageName == null) { Loading @@ -594,11 +680,16 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override public boolean setLowestPriority(@Nullable final String packageName, int userId) throws RemoteException { try { traceBegin(TRACE_TAG_RRO, "OMS#setLowestPriority " + packageName); enforceChangeOverlayPackagesPermission("setLowestPriority"); userId = handleIncomingUser(userId, "setLowestPriority"); if (packageName == null) { Loading @@ -613,6 +704,9 @@ public final class OverlayManagerService extends SystemService { } finally { Binder.restoreCallingIdentity(ident); } } finally { traceEnd(TRACE_TAG_RRO); } } @Override Loading Loading @@ -705,16 +799,20 @@ public final class OverlayManagerService extends SystemService { * Updates the target packages' set of enabled overlays in PackageManager. */ private void updateOverlayPaths(int userId, List<String> targetPackageNames) { try { traceBegin(TRACE_TAG_RRO, "OMS#updateOverlayPaths " + targetPackageNames); if (DEBUG) { Slog.d(TAG, "Updating overlay assets"); } final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); final boolean updateFrameworkRes = targetPackageNames.contains("android"); if (updateFrameworkRes) { targetPackageNames = pm.getTargetPackageNames(userId); } final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size()); final Map<String, List<String>> pendingChanges = new ArrayMap<>(targetPackageNames.size()); synchronized (mLock) { final List<String> frameworkOverlays = mImpl.getEnabledOverlayPackageNames("android", userId); Loading Loading @@ -745,6 +843,9 @@ public final class OverlayManagerService extends SystemService { targetPackageName, userId)); } } } finally { traceEnd(TRACE_TAG_RRO); } } private void updateAssets(final int userId, final String targetPackageName) { Loading Loading @@ -785,6 +886,8 @@ public final class OverlayManagerService extends SystemService { } private void restoreSettings() { try { traceBegin(TRACE_TAG_RRO, "OMS#restoreSettings"); synchronized (mLock) { if (!mSettingsFile.getBaseFile().exists()) { return; Loading Loading @@ -812,6 +915,9 @@ public final class OverlayManagerService extends SystemService { Slog.e(TAG, "failed to restore overlay state", e); } } } finally { traceEnd(TRACE_TAG_RRO); } } private static final class PackageManagerHelper implements Loading