Loading services/core/java/com/android/server/compat/overrides/AppCompatOverridesService.java +73 −43 Original line number Diff line number Diff line Loading @@ -41,11 +41,14 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.CompatibilityOverrideConfig; import com.android.internal.compat.CompatibilityOverridesByPackageConfig; import com.android.internal.compat.CompatibilityOverridesToRemoveByPackageConfig; import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import com.android.internal.compat.IPlatformCompat; import com.android.server.SystemService; Loading Loading @@ -150,6 +153,9 @@ public final class AppCompatOverridesService { Set<String> packageNames = new ArraySet<>(properties.getKeyset()); packageNames.remove(FLAG_OWNED_CHANGE_IDS); packageNames.remove(FLAG_REMOVE_OVERRIDES); Map<String, CompatibilityOverrideConfig> packageNameToOverridesToAdd = new ArrayMap<>(); Map<String, CompatibilityOverridesToRemoveConfig> packageNameToOverridesToRemove = new ArrayMap<>(); for (String packageName : packageNames) { Long versionCode = getVersionCodeOrNull(packageName); if (versionCode == null) { Loading @@ -157,11 +163,30 @@ public final class AppCompatOverridesService { continue; } applyPackageOverrides(properties.getString(packageName, /* defaultValue= */ ""), packageName, versionCode, ownedChangeIds, packageToChangeIdsToSkip.getOrDefault(packageName, emptySet()), /* removeOtherOwnedOverrides= */ true); Set<Long> changeIdsToSkip = packageToChangeIdsToSkip.getOrDefault(packageName, emptySet()); Map<Long, PackageOverride> overridesToAdd = mOverridesParser.parsePackageOverrides( properties.getString(packageName, /* defaultValue= */ ""), packageName, versionCode, changeIdsToSkip); if (!overridesToAdd.isEmpty()) { packageNameToOverridesToAdd.put(packageName, new CompatibilityOverrideConfig(overridesToAdd)); } Set<Long> overridesToRemove = new ArraySet<>(); for (Long changeId : ownedChangeIds) { if (!overridesToAdd.containsKey(changeId) && !changeIdsToSkip.contains(changeId)) { overridesToRemove.add(changeId); } } if (!overridesToRemove.isEmpty()) { packageNameToOverridesToRemove.put(packageName, new CompatibilityOverridesToRemoveConfig(overridesToRemove)); } } putAllPackageOverrides(packageNameToOverridesToAdd); removeAllPackageOverrides(packageNameToOverridesToRemove); } /** Loading @@ -177,40 +202,13 @@ public final class AppCompatOverridesService { // We apply overrides for each namespace separately so that if there is a failure for // one namespace, the other namespaces won't be affected. Set<Long> ownedChangeIds = getOwnedChangeIds(namespace); applyPackageOverrides( putPackageOverrides(packageName, mOverridesParser.parsePackageOverrides( DeviceConfig.getString(namespace, packageName, /* defaultValue= */""), packageName, versionCode, ownedChangeIds, packageName, versionCode, getOverridesToRemove(namespace, ownedChangeIds).getOrDefault(packageName, emptySet()), /* removeOtherOwnedOverrides */ false); } } /** * Calls {@link AppCompatOverridesParser#parsePackageOverrides} on the given arguments and adds * the resulting overrides via {@link IPlatformCompat#putOverridesOnReleaseBuilds}. * * <p>In addition, if {@code removeOtherOwnedOverrides} is true, removes any override that * wasn't just added, whose change ID is in {@code ownedChangeIds} but not in {@code * changeIdsToSkip}, via {@link IPlatformCompat#removeOverridesOnReleaseBuilds}. */ private void applyPackageOverrides(String configStr, String packageName, long versionCode, Set<Long> ownedChangeIds, Set<Long> changeIdsToSkip, boolean removeOtherOwnedOverrides) { Map<Long, PackageOverride> overridesToAdd = mOverridesParser.parsePackageOverrides( configStr, packageName, versionCode, changeIdsToSkip); putPackageOverrides(packageName, overridesToAdd); if (!removeOtherOwnedOverrides) { return; } Set<Long> overridesToRemove = new ArraySet<>(); for (Long changeId : ownedChangeIds) { if (!overridesToAdd.containsKey(changeId) && !changeIdsToSkip.contains(changeId)) { overridesToRemove.add(changeId); emptySet()))); } } removePackageOverrides(packageName, overridesToRemove); } /** * Removes all owned overrides in all supported namespaces for the given {@code packageName}. Loading @@ -231,14 +229,18 @@ public final class AppCompatOverridesService { } /** * Calls {@link IPlatformCompat#removeOverridesOnReleaseBuilds} on each package name and * respective change IDs in {@code overridesToRemove}. * Calls {@link IPlatformCompat#removeAllOverridesOnReleaseBuilds} on {@code * packageNameToOverridesToRemove}. */ private void removeOverrides(Map<String, Set<Long>> overridesToRemove) { for (Map.Entry<String, Set<Long>> packageNameAndOverrides : overridesToRemove.entrySet()) { removePackageOverrides(packageNameAndOverrides.getKey(), packageNameAndOverrides.getValue()); private void removeOverrides(Map<String, Set<Long>> packageNameToOverridesToRemove) { Map<String, CompatibilityOverridesToRemoveConfig> packageNameToConfig = new ArrayMap<>(); for (Map.Entry<String, Set<Long>> packageNameAndChangeIds : packageNameToOverridesToRemove.entrySet()) { packageNameToConfig.put(packageNameAndChangeIds.getKey(), new CompatibilityOverridesToRemoveConfig(packageNameAndChangeIds.getValue())); } removeAllPackageOverrides(packageNameToConfig); } /** Loading @@ -262,6 +264,20 @@ public final class AppCompatOverridesService { DeviceConfig.getString(namespace, FLAG_OWNED_CHANGE_IDS, /* defaultValue= */ "")); } private void putAllPackageOverrides( Map<String, CompatibilityOverrideConfig> packageNameToOverrides) { if (packageNameToOverrides.isEmpty()) { return; } CompatibilityOverridesByPackageConfig config = new CompatibilityOverridesByPackageConfig( packageNameToOverrides); try { mPlatformCompat.putAllOverridesOnReleaseBuilds(config); } catch (RemoteException e) { Slog.e(TAG, "Failed to call IPlatformCompat#putAllOverridesOnReleaseBuilds", e); } } private void putPackageOverrides(String packageName, Map<Long, PackageOverride> overridesToAdd) { if (overridesToAdd.isEmpty()) { Loading @@ -271,7 +287,21 @@ public final class AppCompatOverridesService { try { mPlatformCompat.putOverridesOnReleaseBuilds(config, packageName); } catch (RemoteException e) { Slog.w(TAG, "Failed to call IPlatformCompat#putOverridesOnReleaseBuilds", e); Slog.e(TAG, "Failed to call IPlatformCompat#putOverridesOnReleaseBuilds", e); } } private void removeAllPackageOverrides( Map<String, CompatibilityOverridesToRemoveConfig> packageNameToOverridesToRemove) { if (packageNameToOverridesToRemove.isEmpty()) { return; } CompatibilityOverridesToRemoveByPackageConfig config = new CompatibilityOverridesToRemoveByPackageConfig(packageNameToOverridesToRemove); try { mPlatformCompat.removeAllOverridesOnReleaseBuilds(config); } catch (RemoteException e) { Slog.e(TAG, "Failed to call IPlatformCompat#removeAllOverridesOnReleaseBuilds", e); } } Loading @@ -284,7 +314,7 @@ public final class AppCompatOverridesService { try { mPlatformCompat.removeOverridesOnReleaseBuilds(config, packageName); } catch (RemoteException e) { Slog.w(TAG, "Failed to call IPlatformCompat#removeOverridesOnReleaseBuilds", e); Slog.e(TAG, "Failed to call IPlatformCompat#removeOverridesOnReleaseBuilds", e); } } Loading services/tests/mockingservicestests/src/com/android/server/compat/overrides/AppCompatOverridesServiceTest.java +157 −129 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
services/core/java/com/android/server/compat/overrides/AppCompatOverridesService.java +73 −43 Original line number Diff line number Diff line Loading @@ -41,11 +41,14 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.provider.DeviceConfig; import android.provider.DeviceConfig.Properties; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.CompatibilityOverrideConfig; import com.android.internal.compat.CompatibilityOverridesByPackageConfig; import com.android.internal.compat.CompatibilityOverridesToRemoveByPackageConfig; import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import com.android.internal.compat.IPlatformCompat; import com.android.server.SystemService; Loading Loading @@ -150,6 +153,9 @@ public final class AppCompatOverridesService { Set<String> packageNames = new ArraySet<>(properties.getKeyset()); packageNames.remove(FLAG_OWNED_CHANGE_IDS); packageNames.remove(FLAG_REMOVE_OVERRIDES); Map<String, CompatibilityOverrideConfig> packageNameToOverridesToAdd = new ArrayMap<>(); Map<String, CompatibilityOverridesToRemoveConfig> packageNameToOverridesToRemove = new ArrayMap<>(); for (String packageName : packageNames) { Long versionCode = getVersionCodeOrNull(packageName); if (versionCode == null) { Loading @@ -157,11 +163,30 @@ public final class AppCompatOverridesService { continue; } applyPackageOverrides(properties.getString(packageName, /* defaultValue= */ ""), packageName, versionCode, ownedChangeIds, packageToChangeIdsToSkip.getOrDefault(packageName, emptySet()), /* removeOtherOwnedOverrides= */ true); Set<Long> changeIdsToSkip = packageToChangeIdsToSkip.getOrDefault(packageName, emptySet()); Map<Long, PackageOverride> overridesToAdd = mOverridesParser.parsePackageOverrides( properties.getString(packageName, /* defaultValue= */ ""), packageName, versionCode, changeIdsToSkip); if (!overridesToAdd.isEmpty()) { packageNameToOverridesToAdd.put(packageName, new CompatibilityOverrideConfig(overridesToAdd)); } Set<Long> overridesToRemove = new ArraySet<>(); for (Long changeId : ownedChangeIds) { if (!overridesToAdd.containsKey(changeId) && !changeIdsToSkip.contains(changeId)) { overridesToRemove.add(changeId); } } if (!overridesToRemove.isEmpty()) { packageNameToOverridesToRemove.put(packageName, new CompatibilityOverridesToRemoveConfig(overridesToRemove)); } } putAllPackageOverrides(packageNameToOverridesToAdd); removeAllPackageOverrides(packageNameToOverridesToRemove); } /** Loading @@ -177,40 +202,13 @@ public final class AppCompatOverridesService { // We apply overrides for each namespace separately so that if there is a failure for // one namespace, the other namespaces won't be affected. Set<Long> ownedChangeIds = getOwnedChangeIds(namespace); applyPackageOverrides( putPackageOverrides(packageName, mOverridesParser.parsePackageOverrides( DeviceConfig.getString(namespace, packageName, /* defaultValue= */""), packageName, versionCode, ownedChangeIds, packageName, versionCode, getOverridesToRemove(namespace, ownedChangeIds).getOrDefault(packageName, emptySet()), /* removeOtherOwnedOverrides */ false); } } /** * Calls {@link AppCompatOverridesParser#parsePackageOverrides} on the given arguments and adds * the resulting overrides via {@link IPlatformCompat#putOverridesOnReleaseBuilds}. * * <p>In addition, if {@code removeOtherOwnedOverrides} is true, removes any override that * wasn't just added, whose change ID is in {@code ownedChangeIds} but not in {@code * changeIdsToSkip}, via {@link IPlatformCompat#removeOverridesOnReleaseBuilds}. */ private void applyPackageOverrides(String configStr, String packageName, long versionCode, Set<Long> ownedChangeIds, Set<Long> changeIdsToSkip, boolean removeOtherOwnedOverrides) { Map<Long, PackageOverride> overridesToAdd = mOverridesParser.parsePackageOverrides( configStr, packageName, versionCode, changeIdsToSkip); putPackageOverrides(packageName, overridesToAdd); if (!removeOtherOwnedOverrides) { return; } Set<Long> overridesToRemove = new ArraySet<>(); for (Long changeId : ownedChangeIds) { if (!overridesToAdd.containsKey(changeId) && !changeIdsToSkip.contains(changeId)) { overridesToRemove.add(changeId); emptySet()))); } } removePackageOverrides(packageName, overridesToRemove); } /** * Removes all owned overrides in all supported namespaces for the given {@code packageName}. Loading @@ -231,14 +229,18 @@ public final class AppCompatOverridesService { } /** * Calls {@link IPlatformCompat#removeOverridesOnReleaseBuilds} on each package name and * respective change IDs in {@code overridesToRemove}. * Calls {@link IPlatformCompat#removeAllOverridesOnReleaseBuilds} on {@code * packageNameToOverridesToRemove}. */ private void removeOverrides(Map<String, Set<Long>> overridesToRemove) { for (Map.Entry<String, Set<Long>> packageNameAndOverrides : overridesToRemove.entrySet()) { removePackageOverrides(packageNameAndOverrides.getKey(), packageNameAndOverrides.getValue()); private void removeOverrides(Map<String, Set<Long>> packageNameToOverridesToRemove) { Map<String, CompatibilityOverridesToRemoveConfig> packageNameToConfig = new ArrayMap<>(); for (Map.Entry<String, Set<Long>> packageNameAndChangeIds : packageNameToOverridesToRemove.entrySet()) { packageNameToConfig.put(packageNameAndChangeIds.getKey(), new CompatibilityOverridesToRemoveConfig(packageNameAndChangeIds.getValue())); } removeAllPackageOverrides(packageNameToConfig); } /** Loading @@ -262,6 +264,20 @@ public final class AppCompatOverridesService { DeviceConfig.getString(namespace, FLAG_OWNED_CHANGE_IDS, /* defaultValue= */ "")); } private void putAllPackageOverrides( Map<String, CompatibilityOverrideConfig> packageNameToOverrides) { if (packageNameToOverrides.isEmpty()) { return; } CompatibilityOverridesByPackageConfig config = new CompatibilityOverridesByPackageConfig( packageNameToOverrides); try { mPlatformCompat.putAllOverridesOnReleaseBuilds(config); } catch (RemoteException e) { Slog.e(TAG, "Failed to call IPlatformCompat#putAllOverridesOnReleaseBuilds", e); } } private void putPackageOverrides(String packageName, Map<Long, PackageOverride> overridesToAdd) { if (overridesToAdd.isEmpty()) { Loading @@ -271,7 +287,21 @@ public final class AppCompatOverridesService { try { mPlatformCompat.putOverridesOnReleaseBuilds(config, packageName); } catch (RemoteException e) { Slog.w(TAG, "Failed to call IPlatformCompat#putOverridesOnReleaseBuilds", e); Slog.e(TAG, "Failed to call IPlatformCompat#putOverridesOnReleaseBuilds", e); } } private void removeAllPackageOverrides( Map<String, CompatibilityOverridesToRemoveConfig> packageNameToOverridesToRemove) { if (packageNameToOverridesToRemove.isEmpty()) { return; } CompatibilityOverridesToRemoveByPackageConfig config = new CompatibilityOverridesToRemoveByPackageConfig(packageNameToOverridesToRemove); try { mPlatformCompat.removeAllOverridesOnReleaseBuilds(config); } catch (RemoteException e) { Slog.e(TAG, "Failed to call IPlatformCompat#removeAllOverridesOnReleaseBuilds", e); } } Loading @@ -284,7 +314,7 @@ public final class AppCompatOverridesService { try { mPlatformCompat.removeOverridesOnReleaseBuilds(config, packageName); } catch (RemoteException e) { Slog.w(TAG, "Failed to call IPlatformCompat#removeOverridesOnReleaseBuilds", e); Slog.e(TAG, "Failed to call IPlatformCompat#removeOverridesOnReleaseBuilds", e); } } Loading
services/tests/mockingservicestests/src/com/android/server/compat/overrides/AppCompatOverridesServiceTest.java +157 −129 File changed.Preview size limit exceeded, changes collapsed. Show changes