Loading services/core/java/com/android/server/pm/PackageManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -5261,7 +5261,8 @@ public class PackageManagerService extends IPackageManager.Stub addSharedLibraryLPr(pkg, usesLibraryFiles, libInfo, changingLib, changingLibSetting); } pkgSetting.getPkgState().setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles)); pkgSetting.setPkgStateLibraryFiles(usesLibraryFiles); // let's make sure we mark all static shared libraries as installed for the same users // that its dependent packages are installed for. int[] installedUsers = new int[allUsers.length]; Loading services/core/java/com/android/server/pm/PackageSetting.java +16 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,22 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return this; } /** * Notify {@link #onChanged()} if the parameter {@code usesLibraryFiles} is different from * {@link #getUsesLibraryFiles()}. * @param usesLibraryFiles the new uses library files * @return {@code this} */ public PackageSetting setPkgStateLibraryFiles(@NonNull Collection<String> usesLibraryFiles) { final Collection<String> oldUsesLibraryFiles = getUsesLibraryFiles(); if (oldUsesLibraryFiles.size() != usesLibraryFiles.size() || !oldUsesLibraryFiles.containsAll(usesLibraryFiles)) { pkgState.setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles)); onChanged(); } return this; } public PackageSetting setPrimaryCpuAbi(String primaryCpuAbiString) { this.mPrimaryCpuAbi = primaryCpuAbiString; onChanged(); Loading services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +93 −1 Original line number Diff line number Diff line Loading @@ -29,9 +29,9 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; Loading Loading @@ -64,8 +64,10 @@ import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SuspendParams; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.utils.Watchable; import com.android.server.utils.WatchableTester; import com.android.server.utils.WatchedArrayMap; import com.android.server.utils.Watcher; import com.google.common.truth.Truth; Loading @@ -87,6 +89,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.CountDownLatch; @RunWith(AndroidJUnit4.class) @SmallTest Loading Loading @@ -877,6 +880,95 @@ public class PackageManagerSettingsTests { false /*notLaunched*/, false /*stopped*/, true /*installed*/); } @Test public void testSetPkgStateLibraryFiles_addNewFiles() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_removeOneExistingFile() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); oldUsesLibraryFiles.add("code/path/C.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_changeOneOfFile() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B-1.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_nothingChanged() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(1L)); } private <T> void assertArrayEquals(T[] a, T[] b) { assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), Arrays.equals(a, b)); Loading Loading
services/core/java/com/android/server/pm/PackageManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -5261,7 +5261,8 @@ public class PackageManagerService extends IPackageManager.Stub addSharedLibraryLPr(pkg, usesLibraryFiles, libInfo, changingLib, changingLibSetting); } pkgSetting.getPkgState().setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles)); pkgSetting.setPkgStateLibraryFiles(usesLibraryFiles); // let's make sure we mark all static shared libraries as installed for the same users // that its dependent packages are installed for. int[] installedUsers = new int[allUsers.length]; Loading
services/core/java/com/android/server/pm/PackageSetting.java +16 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,22 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return this; } /** * Notify {@link #onChanged()} if the parameter {@code usesLibraryFiles} is different from * {@link #getUsesLibraryFiles()}. * @param usesLibraryFiles the new uses library files * @return {@code this} */ public PackageSetting setPkgStateLibraryFiles(@NonNull Collection<String> usesLibraryFiles) { final Collection<String> oldUsesLibraryFiles = getUsesLibraryFiles(); if (oldUsesLibraryFiles.size() != usesLibraryFiles.size() || !oldUsesLibraryFiles.containsAll(usesLibraryFiles)) { pkgState.setUsesLibraryFiles(new ArrayList<>(usesLibraryFiles)); onChanged(); } return this; } public PackageSetting setPrimaryCpuAbi(String primaryCpuAbiString) { this.mPrimaryCpuAbi = primaryCpuAbiString; onChanged(); Loading
services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +93 −1 Original line number Diff line number Diff line Loading @@ -29,9 +29,9 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; Loading Loading @@ -64,8 +64,10 @@ import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SuspendParams; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.utils.Watchable; import com.android.server.utils.WatchableTester; import com.android.server.utils.WatchedArrayMap; import com.android.server.utils.Watcher; import com.google.common.truth.Truth; Loading @@ -87,6 +89,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.CountDownLatch; @RunWith(AndroidJUnit4.class) @SmallTest Loading Loading @@ -877,6 +880,95 @@ public class PackageManagerSettingsTests { false /*notLaunched*/, false /*stopped*/, true /*installed*/); } @Test public void testSetPkgStateLibraryFiles_addNewFiles() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_removeOneExistingFile() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); oldUsesLibraryFiles.add("code/path/C.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_changeOneOfFile() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B-1.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(0L)); } @Test public void testSetPkgStateLibraryFiles_nothingChanged() { final PackageSetting packageSetting = createPackageSetting("com.foo"); final List<String> oldUsesLibraryFiles = new ArrayList<>(); oldUsesLibraryFiles.add("code/path/A.apk"); oldUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(oldUsesLibraryFiles); final CountDownLatch countDownLatch = new CountDownLatch(1); packageSetting.registerObserver(new Watcher() { @Override public void onChange(Watchable what) { countDownLatch.countDown(); } }); final List<String> newUsesLibraryFiles = new ArrayList<>(); newUsesLibraryFiles.add("code/path/A.apk"); newUsesLibraryFiles.add("code/path/B.apk"); packageSetting.setPkgStateLibraryFiles(newUsesLibraryFiles); assertThat(countDownLatch.getCount(), is(1L)); } private <T> void assertArrayEquals(T[] a, T[] b) { assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), Arrays.equals(a, b)); Loading