diff options
| author | 2017-04-17 21:46:32 +0000 | |
|---|---|---|
| committer | 2017-04-17 21:46:38 +0000 | |
| commit | 7c31e7924cc1d7870aef4eeb9187cd2ad6549ea3 (patch) | |
| tree | e762692c4a11e13adbe8ddd2745215c87ca14a07 | |
| parent | 1ed27714509853831e2d4e5b3098b643ccc164c4 (diff) | |
| parent | e400c441c2669b7b3643d70ecc5a637ecf8d2b54 (diff) | |
Merge "Add tests for ag/2086796" into oc-dev
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 105 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java | 89 |
2 files changed, 150 insertions, 44 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e79f46b4f3be..95b4903e49d7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -364,7 +364,8 @@ import java.util.concurrent.atomic.AtomicInteger; * $ cts-tradefed run commandAndExit cts -m CtsAppSecurityHostTestCases * </pre> */ -public class PackageManagerService extends IPackageManager.Stub { +public class PackageManagerService extends IPackageManager.Stub + implements PackageSender { static final String TAG = "PackageManager"; static final boolean DEBUG_SETTINGS = false; static final boolean DEBUG_PREFERRED = false; @@ -13083,7 +13084,7 @@ public class PackageManagerService extends IPackageManager.Stub { } }; - final void sendPackageBroadcast(final String action, final String pkg, final Bundle extras, + public void sendPackageBroadcast(final String action, final String pkg, final Bundle extras, final int flags, final String targetPkg, final IIntentReceiver finishedReceiver, final int[] userIds) { mHandler.post(new Runnable() { @@ -13386,8 +13387,7 @@ public class PackageManagerService extends IPackageManager.Stub { sendPackageAddedForNewUsers(packageName, isSystem, pkgSetting.appId, userId); } - private void sendPackageAddedForNewUsers(String packageName, boolean isSystem, - int appId, int... userIds) { + public void sendPackageAddedForNewUsers(String packageName, boolean isSystem, int appId, int... userIds) { if (ArrayUtils.isEmpty(userIds)) { return; } @@ -13514,7 +13514,7 @@ public class PackageManagerService extends IPackageManager.Stub { private void sendApplicationHiddenForUser(String packageName, PackageSetting pkgSetting, int userId) { - final PackageRemovedInfo info = new PackageRemovedInfo(); + final PackageRemovedInfo info = new PackageRemovedInfo(this); info.removedPackage = packageName; info.removedUsers = new int[] {userId}; info.broadcastUsers = new int[] {userId}; @@ -16150,7 +16150,7 @@ public class PackageManagerService extends IPackageManager.Stub { } // Update what is removed - res.removedInfo = new PackageRemovedInfo(); + res.removedInfo = new PackageRemovedInfo(this); res.removedInfo.uid = oldPackage.applicationInfo.uid; res.removedInfo.removedPackage = oldPackage.packageName; res.removedInfo.isStaticSharedLib = pkg.staticSharedLibName != null; @@ -16180,7 +16180,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (!childPackageUpdated) { - PackageRemovedInfo childRemovedRes = new PackageRemovedInfo(); + PackageRemovedInfo childRemovedRes = new PackageRemovedInfo(this); childRemovedRes.removedPackage = childPkg.packageName; childRemovedRes.isUpdate = false; childRemovedRes.dataRemoved = true; @@ -16870,7 +16870,7 @@ public class PackageManagerService extends IPackageManager.Stub { sUserManager.getUserIds(), true); } if ((mPackages.containsKey(childPkg.packageName))) { - childRes.removedInfo = new PackageRemovedInfo(); + childRes.removedInfo = new PackageRemovedInfo(this); childRes.removedInfo.removedPackage = childPkg.packageName; } if (res.addedChildPackages == null) { @@ -17716,7 +17716,7 @@ public class PackageManagerService extends IPackageManager.Stub { * sending a broadcast if necessary */ private int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) { - final PackageRemovedInfo info = new PackageRemovedInfo(); + final PackageRemovedInfo info = new PackageRemovedInfo(this); final boolean res; final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 @@ -17816,7 +17816,8 @@ public class PackageManagerService extends IPackageManager.Stub { return res ? PackageManager.DELETE_SUCCEEDED : PackageManager.DELETE_FAILED_INTERNAL_ERROR; } - class PackageRemovedInfo { + static class PackageRemovedInfo { + final PackageSender packageSender; String removedPackage; int uid = -1; int removedAppId = -1; @@ -17834,6 +17835,10 @@ public class PackageManagerService extends IPackageManager.Stub { ArrayMap<String, PackageRemovedInfo> removedChildPackages; ArrayMap<String, PackageInstalledInfo> appearedChildPackages; + PackageRemovedInfo(PackageSender packageSender) { + this.packageSender = packageSender; + } + void sendPackageRemovedBroadcasts(boolean killApp) { sendPackageRemovedBroadcastInternal(killApp); final int childCount = removedChildPackages != null ? removedChildPackages.size() : 0; @@ -17862,8 +17867,9 @@ public class PackageManagerService extends IPackageManager.Stub { ? appearedChildPackages.size() : 0; for (int i = 0; i < packageCount; i++) { PackageInstalledInfo installedInfo = appearedChildPackages.valueAt(i); - sendPackageAddedForNewUsers(installedInfo.name, true, - UserHandle.getAppId(installedInfo.uid), installedInfo.newUsers); + packageSender.sendPackageAddedForNewUsers(installedInfo.name, + true, UserHandle.getAppId(installedInfo.uid), + installedInfo.newUsers); } } @@ -17871,12 +17877,12 @@ public class PackageManagerService extends IPackageManager.Stub { Bundle extras = new Bundle(2); extras.putInt(Intent.EXTRA_UID, removedAppId >= 0 ? removedAppId : uid); extras.putBoolean(Intent.EXTRA_REPLACING, true); - sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, removedPackage, - extras, 0, null, null, null); - sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, removedPackage, - extras, 0, null, null, null); - sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null, - null, 0, removedPackage, null, null); + packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, + removedPackage, extras, 0, null, null, null); + packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, + removedPackage, extras, 0, null, null, null); + packageSender.sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, + null, null, 0, removedPackage, null, null); } private void sendPackageRemovedBroadcastInternal(boolean killApp) { @@ -17895,19 +17901,37 @@ public class PackageManagerService extends IPackageManager.Stub { } extras.putBoolean(Intent.EXTRA_REMOVED_FOR_ALL_USERS, removedForAllUsers); if (removedPackage != null) { - sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, - extras, 0, null, null, broadcastUsers); + packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, + removedPackage, extras, 0, null, null, broadcastUsers); if (dataRemoved && !isRemovedPackageSystemUpdate) { - sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED, - removedPackage, extras, Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, - null, null, broadcastUsers); + packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED, + removedPackage, extras, + Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, + null, null, broadcastUsers); } } if (removedAppId >= 0) { - sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, + packageSender.sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, null, null, broadcastUsers); } } + + void populateUsers(int[] userIds, PackageSetting deletedPackageSetting) { + removedUsers = userIds; + if (removedUsers == null) { + broadcastUsers = null; + return; + } + + broadcastUsers = EMPTY_INT_ARRAY; + for (int i = userIds.length - 1; i >= 0; --i) { + final int userId = userIds[i]; + if (deletedPackageSetting.getInstantApp(userId)) { + continue; + } + broadcastUsers = ArrayUtils.appendInt(broadcastUsers, userId); + } + } } /* @@ -17931,23 +17955,8 @@ public class PackageManagerService extends IPackageManager.Stub { outInfo.removedPackage = packageName; outInfo.isStaticSharedLib = deletedPkg != null && deletedPkg.staticSharedLibName != null; - outInfo.removedUsers = deletedPs != null - ? deletedPs.queryInstalledUsers(sUserManager.getUserIds(), true) - : null; - if (outInfo.removedUsers == null) { - outInfo.broadcastUsers = null; - } else { - outInfo.broadcastUsers = EMPTY_INT_ARRAY; - int[] allUsers = outInfo.removedUsers; - for (int i = allUsers.length - 1; i >= 0; --i) { - final int userId = allUsers[i]; - if (deletedPs.getInstantApp(userId)) { - continue; - } - outInfo.broadcastUsers = - ArrayUtils.appendInt(outInfo.broadcastUsers, userId); - } - } + outInfo.populateUsers(deletedPs == null ? null + : deletedPs.queryInstalledUsers(sUserManager.getUserIds(), true), deletedPs); } } @@ -18430,7 +18439,7 @@ public class PackageManagerService extends IPackageManager.Stub { outInfo.removedChildPackages = new ArrayMap<>(childCount); for (int i = 0; i < childCount; i++) { String childPackageName = ps.childPackageNames.get(i); - PackageRemovedInfo childInfo = new PackageRemovedInfo(); + PackageRemovedInfo childInfo = new PackageRemovedInfo(this); childInfo.removedPackage = childPackageName; outInfo.removedChildPackages.put(childPackageName, childInfo); PackageSetting childPs = mSettings.getPackageLPr(childPackageName); @@ -21692,7 +21701,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); if (DEBUG_SD_INSTALL) Log.i(TAG, "Trying to unload pkg : " + pkgName); // Delete package internally - PackageRemovedInfo outInfo = new PackageRemovedInfo(); + PackageRemovedInfo outInfo = new PackageRemovedInfo(this); synchronized (mInstallLock) { final int deleteFlags = PackageManager.DELETE_KEEP_DATA; final boolean res; @@ -21859,7 +21868,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); final ApplicationInfo info = ps.pkg.applicationInfo; final int deleteFlags = PackageManager.DELETE_KEEP_DATA; - final PackageRemovedInfo outInfo = new PackageRemovedInfo(); + final PackageRemovedInfo outInfo = new PackageRemovedInfo(this); try (PackageFreezer freezer = freezePackageForDelete(ps.name, deleteFlags, "unloadPrivatePackagesInner")) { @@ -23643,3 +23652,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); ? null : mInstantAppInstallerActivity.getComponentName(); } } + +interface PackageSender { + void sendPackageBroadcast(final String action, final String pkg, + final Bundle extras, final int flags, final String targetPkg, + final IIntentReceiver finishedReceiver, final int[] userIds); + void sendPackageAddedForNewUsers(String packageName, boolean isSystem, + int appId, int... userIds); +} diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java new file mode 100644 index 000000000000..eadece27087b --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.pm; + +import android.content.IIntentReceiver; + +import android.os.Bundle; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import java.io.File; + +// runtest -c com.android.server.pm.PackageManagerServiceTest frameworks-services + +@SmallTest +public class PackageManagerServiceTest extends AndroidTestCase { + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testPackageRemoval() throws Exception { + class PackageSenderImpl implements PackageSender { + public void sendPackageBroadcast(final String action, final String pkg, + final Bundle extras, final int flags, final String targetPkg, + final IIntentReceiver finishedReceiver, final int[] userIds) { + } + + public void sendPackageAddedForNewUsers(String packageName, + boolean isSystem, int appId, int... userIds) { + } + } + + PackageSenderImpl sender = new PackageSenderImpl(); + PackageSetting setting = null; + PackageManagerService.PackageRemovedInfo pri = + new PackageManagerService.PackageRemovedInfo(sender); + + // Initial conditions: nothing there + assertNull(pri.removedUsers); + assertNull(pri.broadcastUsers); + + // populateUsers with nothing leaves nothing + pri.populateUsers(null, setting); + assertNull(pri.broadcastUsers); + + // Create a real (non-null) PackageSetting and confirm that the removed + // users are copied properly + setting = new PackageSetting("name", "realName", new File("codePath"), + new File("resourcePath"), "legacyNativeLibraryPathString", + "primaryCpuAbiString", "secondaryCpuAbiString", + "cpuAbiOverrideString", 0, 0, 0, "parentPackageName", null, 0, + null, null); + pri.removedUsers = new int[] {1, 2, 3, 4, 5}; + pri.populateUsers(pri.removedUsers, setting); + assertNotNull(pri.broadcastUsers); + assertEquals(pri.removedUsers.length, pri.broadcastUsers.length); + + // Exclude a user + pri.broadcastUsers = null; + setting.setInstantApp(true, 4); + pri.populateUsers(pri.removedUsers, setting); + assertNotNull(pri.broadcastUsers); + assertEquals(pri.removedUsers.length - 1, pri.broadcastUsers.length); + + // TODO: test that sendApplicationHiddenForUser() actually fills in + // broadcastUsers + } +} |