Merge "Add tests for ag/2086796" into oc-dev
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user