Remove the OverlayInfos without impacts target set

Most of packages are not related to overlay. It means that
* the package is not overlaid by others
* the package doesn't overlay any package.
The rate of packages overlaid by other packages is 31/231.

This patch not only removes the unnecessary OverlayInfo in memory
but also speeds the performance up.

Bug: 174206591

Test: atest \
            OverlayHostTests \
            OverlayDeviceTests \
            OverlayRemountedTest \
            FrameworksServicesTests:com.android.server.om \
            CtsContentTestCases:android.content.om.cts \
            idmap2_tests
Change-Id: Iafd88b89d0d0a51f737e10aa86ec0b348cd9d431
This commit is contained in:
felkachang
2022-06-07 14:34:03 +08:00
parent 94cc29a128
commit 94357d6e72
2 changed files with 99 additions and 80 deletions

View File

@@ -166,6 +166,14 @@ final class OverlayManagerServiceImpl {
CollectionUtils.addAll(updatedTargets, removeOverlaysForUser(
(info) -> !userPackages.containsKey(info.packageName), newUserId));
final ArraySet<String> overlaidByOthers = new ArraySet<>();
for (AndroidPackage androidPackage : userPackages.values()) {
final String overlayTarget = androidPackage.getOverlayTarget();
if (!TextUtils.isEmpty(overlayTarget)) {
overlaidByOthers.add(overlayTarget);
}
}
// Update the state of all installed packages containing overlays, and initialize new
// overlays that are not currently in the settings.
for (int i = 0, n = userPackages.size(); i < n; i++) {
@@ -175,8 +183,10 @@ final class OverlayManagerServiceImpl {
updatePackageOverlays(pkg, newUserId, 0 /* flags */));
// When a new user is switched to for the first time, package manager must be
// informed of the overlay paths for all packages installed in the user.
updatedTargets.add(new PackageAndUser(pkg.getPackageName(), newUserId));
// informed of the overlay paths for all overlaid packages installed in the user.
if (overlaidByOthers.contains(pkg.getPackageName())) {
updatedTargets.add(new PackageAndUser(pkg.getPackageName(), newUserId));
}
} catch (OperationFailedException e) {
Slog.e(TAG, "failed to initialize overlays of '" + pkg.getPackageName()
+ "' for user " + newUserId + "", e);

View File

@@ -16,16 +16,16 @@
package com.android.server.om;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static com.google.common.truth.Truth.assertThat;
import android.content.om.OverlayIdentifier;
import android.content.om.OverlayInfo;
import androidx.test.runner.AndroidJUnit4;
import com.google.common.truth.Expect;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -43,6 +43,9 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
private static final String OVERLAY2 = OVERLAY + "2";
private static final OverlayIdentifier IDENTIFIER2 = new OverlayIdentifier(OVERLAY2);
@Rule
public final Expect expect = Expect.create();
@Test
public void alwaysInitializeAllPackages() {
final OverlayManagerServiceImpl impl = getImpl();
@@ -51,13 +54,11 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
addPackage(target(otherTarget), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER),
new PackageAndUser(otherTarget, USER),
new PackageAndUser(OVERLAY, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
// The result should be the same for every time
assertThat(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
assertThat(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
}
@Test
@@ -66,29 +67,31 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
addPackage(target(TARGET), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_DISABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o1);
assertFalse(o1.isEnabled());
assertFalse(o1.isMutable);
expect.that(o1).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o1.isEnabled()).isFalse();
expect.that(o1.isMutable).isFalse();
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o2);
assertTrue(o2.isEnabled());
assertFalse(o2.isMutable);
expect.that(o2).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o2.isEnabled()).isTrue();
expect.that(o2.isMutable).isFalse();
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_DISABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o3);
assertFalse(o3.isEnabled());
assertFalse(o3.isMutable);
expect.that(o3).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o3.isEnabled()).isFalse();
expect.that(o3.isMutable).isFalse();
}
@Test
@@ -98,28 +101,30 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
addPackage(overlay(OVERLAY, TARGET), USER);
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o1);
assertFalse(o1.isEnabled());
assertTrue(o1.isMutable);
expect.that(o1).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o1.isEnabled()).isFalse();
expect.that(o1.isMutable).isTrue();
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_ENABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o2);
assertFalse(o2.isEnabled());
assertTrue(o2.isMutable);
expect.that(o2).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o2.isEnabled()).isFalse();
expect.that(o2.isMutable).isTrue();
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o3);
assertFalse(o3.isEnabled());
assertTrue(o3.isMutable);
expect.that(o3).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o3.isEnabled()).isFalse();
expect.that(o3.isMutable).isTrue();
}
@Test
@@ -128,17 +133,17 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
addPackage(target(TARGET), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
final Consumer<ConfigState> setOverlay = (state -> {
configureSystemOverlay(OVERLAY, state, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o);
assertEquals(o.isEnabled(), state == ConfigState.IMMUTABLE_ENABLED
expect.that(o).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o.isEnabled()).isEqualTo(state == ConfigState.IMMUTABLE_ENABLED
|| state == ConfigState.MUTABLE_ENABLED);
assertEquals(o.isMutable, state == ConfigState.MUTABLE_DISABLED
expect.that(o.isMutable).isEqualTo(state == ConfigState.MUTABLE_DISABLED
|| state == ConfigState.MUTABLE_ENABLED);
});
@@ -180,20 +185,20 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.MUTABLE_DISABLED, 1 /* priority */);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER),
new PackageAndUser(OVERLAY2, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o1);
assertEquals(0, o1.priority);
assertFalse(o1.isEnabled());
expect.that(o1).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o1.priority).isEqualTo(0);
expect.that(o1.isEnabled()).isFalse();
final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER2, USER);
assertNotNull(o2);
assertEquals(1, o2.priority);
assertFalse(o2.isEnabled());
expect.that(o2).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o2.priority).isEqualTo(1);
expect.that(o2.isEnabled()).isFalse();
// Overlay priority changing between reboots should not affect enable state of mutable
// overlays.
@@ -202,16 +207,18 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
// Reorder the overlays
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 1 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o3);
assertEquals(1, o3.priority);
assertTrue(o3.isEnabled());
expect.that(o3).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o3.priority).isEqualTo(1);
expect.that(o3.isEnabled()).isTrue();
final OverlayInfo o4 = impl.getOverlayInfo(IDENTIFIER2, USER);
assertNotNull(o4);
assertEquals(0, o4.priority);
assertFalse(o4.isEnabled());
expect.that(o4).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o4.priority).isEqualTo(0);
expect.that(o4.isEnabled()).isFalse();
}
@Test
@@ -223,33 +230,35 @@ public class OverlayManagerServiceImplRebootTests extends OverlayManagerServiceI
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.IMMUTABLE_ENABLED, 1 /* priority */);
final Set<PackageAndUser> allPackages =
Set.of(new PackageAndUser(TARGET, USER), new PackageAndUser(OVERLAY, USER),
new PackageAndUser(OVERLAY2, USER));
final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o1);
assertEquals(0, o1.priority);
assertTrue(o1.isEnabled());
expect.that(o1).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o1.priority).isEqualTo(0);
expect.that(o1.isEnabled()).isTrue();
final OverlayInfo o2 = impl.getOverlayInfo(IDENTIFIER2, USER);
assertNotNull(o2);
assertEquals(1, o2.priority);
assertTrue(o2.isEnabled());
expect.that(o2).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o2.priority).isEqualTo(1);
expect.that(o2.isEnabled()).isTrue();
// Reorder the overlays
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 1 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */);
assertEquals(allPackages, impl.updateOverlaysForUser(USER));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o3 = impl.getOverlayInfo(IDENTIFIER, USER);
assertNotNull(o3);
assertEquals(1, o3.priority);
assertTrue(o3.isEnabled());
expect.that(o3).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o3.priority).isEqualTo(1);
expect.that(o3.isEnabled()).isTrue();
final OverlayInfo o4 = impl.getOverlayInfo(IDENTIFIER2, USER);
assertNotNull(o4);
assertEquals(0, o4.priority);
assertTrue(o4.isEnabled());
expect.that(o4).isNotNull();
assertThat(expect.hasFailures()).isFalse();
expect.that(o4.priority).isEqualTo(0);
expect.that(o4.isEnabled()).isTrue();
}
}