Send directed broadcast to the installer
The installer of record should be allowed background execution when an application is removed/updated. The installer of record is the installer that was responsible for installing the latest version of the application. Change-Id: I19ed0120975e6f75ac7e4982b21dd4785552a9e7 Fixes: 36788678 Test: Manual; install an app via 'adb' and set the installer, see that the installer gets the directed broadcast when the app is removed/replaced
This commit is contained in:
@@ -1780,6 +1780,8 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
|
||||
final boolean update = res.removedInfo != null
|
||||
&& res.removedInfo.removedPackage != null;
|
||||
final String origInstallerPackageName = res.removedInfo != null
|
||||
? res.removedInfo.installerPackageName : null;
|
||||
|
||||
// If this is the first time we have child packages for a disabled privileged
|
||||
// app that had no children, we grant requested runtime permissions to the new
|
||||
@@ -1841,8 +1843,13 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
extras.putBoolean(Intent.EXTRA_REPLACING, true);
|
||||
}
|
||||
sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName,
|
||||
extras, 0 /*flags*/, null /*targetPackage*/,
|
||||
null /*finishedReceiver*/, updateUsers);
|
||||
extras, 0 /*flags*/,
|
||||
null /*targetPackage*/, null /*finishedReceiver*/, updateUsers);
|
||||
if (origInstallerPackageName != null) {
|
||||
sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName,
|
||||
extras, 0 /*flags*/,
|
||||
origInstallerPackageName, null /*finishedReceiver*/, updateUsers);
|
||||
}
|
||||
|
||||
// Send replaced for users that don't see the package for the first time
|
||||
if (update) {
|
||||
@@ -1850,6 +1857,11 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
packageName, extras, 0 /*flags*/,
|
||||
null /*targetPackage*/, null /*finishedReceiver*/,
|
||||
updateUsers);
|
||||
if (origInstallerPackageName != null) {
|
||||
sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName,
|
||||
extras, 0 /*flags*/,
|
||||
origInstallerPackageName, null /*finishedReceiver*/, updateUsers);
|
||||
}
|
||||
sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED,
|
||||
null /*package*/, null /*extras*/, 0 /*flags*/,
|
||||
packageName /*targetPackage*/,
|
||||
@@ -13521,6 +13533,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
int userId) {
|
||||
final PackageRemovedInfo info = new PackageRemovedInfo(this);
|
||||
info.removedPackage = packageName;
|
||||
info.installerPackageName = pkgSetting.installerPackageName;
|
||||
info.removedUsers = new int[] {userId};
|
||||
info.broadcastUsers = new int[] {userId};
|
||||
info.uid = UserHandle.getUid(userId, pkgSetting.appId);
|
||||
@@ -16052,6 +16065,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
final boolean isInstantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
|
||||
|
||||
final PackageParser.Package oldPackage;
|
||||
final PackageSetting ps;
|
||||
final String pkgName = pkg.packageName;
|
||||
final int[] allUsers;
|
||||
final int[] installedUsers;
|
||||
@@ -16073,7 +16087,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
return;
|
||||
}
|
||||
|
||||
final PackageSetting ps = mSettings.mPackages.get(pkgName);
|
||||
ps = mSettings.mPackages.get(pkgName);
|
||||
|
||||
// verify signatures are valid
|
||||
if (shouldCheckUpgradeKeySetLP(ps, scanFlags)) {
|
||||
@@ -16159,10 +16173,10 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
res.removedInfo = new PackageRemovedInfo(this);
|
||||
res.removedInfo.uid = oldPackage.applicationInfo.uid;
|
||||
res.removedInfo.removedPackage = oldPackage.packageName;
|
||||
res.removedInfo.installerPackageName = ps.installerPackageName;
|
||||
res.removedInfo.isStaticSharedLib = pkg.staticSharedLibName != null;
|
||||
res.removedInfo.isUpdate = true;
|
||||
res.removedInfo.origUsers = installedUsers;
|
||||
final PackageSetting ps = mSettings.getPackageLPr(pkgName);
|
||||
res.removedInfo.installReasons = new SparseArray<>(installedUsers.length);
|
||||
for (int i = 0; i < installedUsers.length; i++) {
|
||||
final int userId = installedUsers[i];
|
||||
@@ -16180,6 +16194,9 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
if (childRes != null) {
|
||||
childRes.removedInfo.uid = childPkg.applicationInfo.uid;
|
||||
childRes.removedInfo.removedPackage = childPkg.packageName;
|
||||
if (childPs != null) {
|
||||
childRes.removedInfo.installerPackageName = childPs.installerPackageName;
|
||||
}
|
||||
childRes.removedInfo.isUpdate = true;
|
||||
childRes.removedInfo.installReasons = res.removedInfo.installReasons;
|
||||
childPackageUpdated = true;
|
||||
@@ -16188,6 +16205,9 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
if (!childPackageUpdated) {
|
||||
PackageRemovedInfo childRemovedRes = new PackageRemovedInfo(this);
|
||||
childRemovedRes.removedPackage = childPkg.packageName;
|
||||
if (childPs != null) {
|
||||
childRemovedRes.installerPackageName = childPs.installerPackageName;
|
||||
}
|
||||
childRemovedRes.isUpdate = false;
|
||||
childRemovedRes.dataRemoved = true;
|
||||
synchronized (mPackages) {
|
||||
@@ -16878,6 +16898,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
if ((mPackages.containsKey(childPkg.packageName))) {
|
||||
childRes.removedInfo = new PackageRemovedInfo(this);
|
||||
childRes.removedInfo.removedPackage = childPkg.packageName;
|
||||
childRes.removedInfo.installerPackageName = childPs.installerPackageName;
|
||||
}
|
||||
if (res.addedChildPackages == null) {
|
||||
res.addedChildPackages = new ArrayMap<>();
|
||||
@@ -17826,6 +17847,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
static class PackageRemovedInfo {
|
||||
final PackageSender packageSender;
|
||||
String removedPackage;
|
||||
String installerPackageName;
|
||||
int uid = -1;
|
||||
int removedAppId = -1;
|
||||
int[] origUsers;
|
||||
@@ -17885,11 +17907,19 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
extras.putInt(Intent.EXTRA_UID, removedAppId >= 0 ? removedAppId : uid);
|
||||
extras.putBoolean(Intent.EXTRA_REPLACING, true);
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
|
||||
removedPackage, extras, 0, null, null, null);
|
||||
removedPackage, extras, 0, null /*targetPackage*/, null, null);
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED,
|
||||
removedPackage, extras, 0, null, null, null);
|
||||
removedPackage, extras, 0, null /*targetPackage*/, null, null);
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED,
|
||||
null, null, 0, removedPackage, null, null);
|
||||
if (installerPackageName != null) {
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
|
||||
removedPackage, extras, 0 /*flags*/,
|
||||
installerPackageName, null, null);
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED,
|
||||
removedPackage, extras, 0 /*flags*/,
|
||||
installerPackageName, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendPackageRemovedBroadcastInternal(boolean killApp) {
|
||||
@@ -17909,7 +17939,12 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
extras.putBoolean(Intent.EXTRA_REMOVED_FOR_ALL_USERS, removedForAllUsers);
|
||||
if (removedPackage != null) {
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED,
|
||||
removedPackage, extras, 0, null, null, broadcastUsers);
|
||||
removedPackage, extras, 0, null /*targetPackage*/, null, broadcastUsers);
|
||||
if (installerPackageName != null) {
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED,
|
||||
removedPackage, extras, 0 /*flags*/,
|
||||
installerPackageName, null, broadcastUsers);
|
||||
}
|
||||
if (dataRemoved && !isRemovedPackageSystemUpdate) {
|
||||
packageSender.sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED,
|
||||
removedPackage, extras,
|
||||
@@ -17960,6 +17995,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
deletedPs = mSettings.mPackages.get(packageName);
|
||||
if (outInfo != null) {
|
||||
outInfo.removedPackage = packageName;
|
||||
outInfo.installerPackageName = ps.installerPackageName;
|
||||
outInfo.isStaticSharedLib = deletedPkg != null
|
||||
&& deletedPkg.staticSharedLibName != null;
|
||||
outInfo.populateUsers(deletedPs == null ? null
|
||||
@@ -18448,6 +18484,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
String childPackageName = ps.childPackageNames.get(i);
|
||||
PackageRemovedInfo childInfo = new PackageRemovedInfo(this);
|
||||
childInfo.removedPackage = childPackageName;
|
||||
childInfo.installerPackageName = ps.installerPackageName;
|
||||
outInfo.removedChildPackages.put(childPackageName, childInfo);
|
||||
PackageSetting childPs = mSettings.getPackageLPr(childPackageName);
|
||||
if (childPs != null) {
|
||||
@@ -18572,6 +18609,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
||||
|
||||
if (outInfo != null) {
|
||||
outInfo.removedPackage = ps.name;
|
||||
outInfo.installerPackageName = ps.installerPackageName;
|
||||
outInfo.isStaticSharedLib = pkg != null && pkg.staticSharedLibName != null;
|
||||
outInfo.removedAppId = ps.appId;
|
||||
outInfo.removedUsers = userIds;
|
||||
|
||||
Reference in New Issue
Block a user