summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-09-12 18:53:11 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-09-12 18:53:11 +0000
commit61b2e04fc9746105143d4d94bad129cc09c9dd96 (patch)
tree03734af82edbfe756dbe3839330201dca404ae40
parent5bf4747484e3c29f500a6b00a96f5638b140148a (diff)
parent71ac935526d29097891664af40c54c96d6de02e6 (diff)
downloadframeworks_base-61b2e04fc9746105143d4d94bad129cc09c9dd96.zip
frameworks_base-61b2e04fc9746105143d4d94bad129cc09c9dd96.tar.gz
frameworks_base-61b2e04fc9746105143d4d94bad129cc09c9dd96.tar.bz2
am 48058460: Merge "Bring install and install-multiple into parity." into lmp-dev
* commit '48058460183b961d0f1e1ee279c5d0572e830f8e': Bring install and install-multiple into parity.
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java38
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java36
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java27
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java39
4 files changed, 70 insertions, 70 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index da34094..3863bc7 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -865,7 +865,7 @@ public final class Pm {
}
private void runInstall() {
- int installFlags = PackageManager.INSTALL_ALL_USERS;
+ int installFlags = 0;
int userId = UserHandle.USER_ALL;
String installerPackageName = null;
@@ -912,17 +912,17 @@ public final class Pm {
abi = checkAbiArgument(nextOptionData());
} else if (opt.equals("--user")) {
userId = Integer.parseInt(nextOptionData());
- if (userId == UserHandle.USER_ALL) {
- installFlags |= PackageManager.INSTALL_ALL_USERS;
- } else {
- installFlags &= ~PackageManager.INSTALL_ALL_USERS;
- }
} else {
System.err.println("Error: Unknown option: " + opt);
return;
}
}
+ if (userId == UserHandle.USER_ALL) {
+ userId = UserHandle.USER_OWNER;
+ installFlags |= PackageManager.INSTALL_ALL_USERS;
+ }
+
final Uri verificationURI;
final Uri originatingURI;
final Uri referrerURI;
@@ -961,8 +961,8 @@ public final class Pm {
VerificationParams verificationParams = new VerificationParams(verificationURI,
originatingURI, referrerURI, VerificationParams.NO_UID, null);
- mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags, installerPackageName,
- verificationParams, abi, userId);
+ mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags,
+ installerPackageName, verificationParams, abi, userId);
synchronized (obs) {
while (!obs.finished) {
@@ -986,10 +986,10 @@ public final class Pm {
}
private void runInstallCreate() throws RemoteException {
+ int userId = UserHandle.USER_ALL;
String installerPackageName = null;
final SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
- params.installFlags = PackageManager.INSTALL_ALL_USERS;
String opt;
while ((opt = nextOption()) != null) {
@@ -1010,6 +1010,10 @@ public final class Pm {
params.installFlags |= PackageManager.INSTALL_INTERNAL;
} else if (opt.equals("-d")) {
params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ } else if (opt.equals("--originating-uri")) {
+ params.originatingUri = Uri.parse(nextOptionData());
+ } else if (opt.equals("--referrer")) {
+ params.referrerUri = Uri.parse(nextOptionData());
} else if (opt.equals("-p")) {
params.mode = SessionParams.MODE_INHERIT_EXISTING;
params.appPackageName = nextOptionData();
@@ -1020,13 +1024,19 @@ public final class Pm {
params.setSize(Long.parseLong(nextOptionData()));
} else if (opt.equals("--abi")) {
params.abiOverride = checkAbiArgument(nextOptionData());
+ } else if (opt.equals("--user")) {
+ userId = Integer.parseInt(nextOptionData());
} else {
throw new IllegalArgumentException("Unknown option " + opt);
}
}
- final int sessionId = mInstaller.createSession(params, installerPackageName,
- UserHandle.USER_OWNER);
+ if (userId == UserHandle.USER_ALL) {
+ userId = UserHandle.USER_OWNER;
+ params.installFlags |= PackageManager.INSTALL_ALL_USERS;
+ }
+
+ final int sessionId = mInstaller.createSession(params, installerPackageName, userId);
// NOTE: adb depends on parsing this string
System.out.println("Success: created install session [" + sessionId + "]");
@@ -1692,11 +1702,7 @@ public final class Pm {
}
public Intent getResult() {
- try {
- return mResult.poll(30, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
+ return mResult.poll();
}
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index ed678d2..fa09d48 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -16,9 +16,6 @@
package com.android.server.pm;
-import static android.content.pm.PackageManager.INSTALL_ALL_USERS;
-import static android.content.pm.PackageManager.INSTALL_FROM_ADB;
-import static android.content.pm.PackageManager.INSTALL_REPLACE_EXISTING;
import static com.android.internal.util.XmlUtils.readBitmapAttribute;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
@@ -105,7 +102,7 @@ import java.util.Random;
public class PackageInstallerService extends IPackageInstaller.Stub {
private static final String TAG = "PackageInstaller";
- private static final boolean LOGD = true;
+ private static final boolean LOGD = false;
// TODO: remove outstanding sessions when installer package goes away
// TODO: notify listeners in other users when package has been installed there
@@ -117,6 +114,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
private static final String ATTR_SESSION_ID = "sessionId";
private static final String ATTR_USER_ID = "userId";
private static final String ATTR_INSTALLER_PACKAGE_NAME = "installerPackageName";
+ private static final String ATTR_INSTALLER_UID = "installerUid";
private static final String ATTR_CREATED_MILLIS = "createdMillis";
private static final String ATTR_SESSION_STAGE_DIR = "sessionStageDir";
private static final String ATTR_SESSION_STAGE_CID = "sessionStageCid";
@@ -336,6 +334,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
final int sessionId = readIntAttribute(in, ATTR_SESSION_ID);
final int userId = readIntAttribute(in, ATTR_USER_ID);
final String installerPackageName = readStringAttribute(in, ATTR_INSTALLER_PACKAGE_NAME);
+ final int installerUid = readIntAttribute(in, ATTR_INSTALLER_UID,
+ mPm.getPackageUid(installerPackageName, userId));
final long createdMillis = readLongAttribute(in, ATTR_CREATED_MILLIS);
final String stageDirRaw = readStringAttribute(in, ATTR_SESSION_STAGE_DIR);
final File stageDir = (stageDirRaw != null) ? new File(stageDirRaw) : null;
@@ -357,8 +357,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
params.abiOverride = readStringAttribute(in, ATTR_ABI_OVERRIDE);
return new PackageInstallerSession(mInternalCallback, mContext, mPm,
- mInstallThread.getLooper(), sessionId, userId, installerPackageName, params,
- createdMillis, stageDir, stageCid, prepared, sealed);
+ mInstallThread.getLooper(), sessionId, userId, installerPackageName, installerUid,
+ params, createdMillis, stageDir, stageCid, prepared, sealed);
}
private void writeSessionsLocked() {
@@ -398,6 +398,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
writeIntAttribute(out, ATTR_USER_ID, session.userId);
writeStringAttribute(out, ATTR_INSTALLER_PACKAGE_NAME,
session.installerPackageName);
+ writeIntAttribute(out, ATTR_INSTALLER_UID, session.installerUid);
writeLongAttribute(out, ATTR_CREATED_MILLIS, session.createdMillis);
if (session.stageDir != null) {
writeStringAttribute(out, ATTR_SESSION_STAGE_DIR,
@@ -446,26 +447,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
private int createSessionInternal(SessionParams params, String installerPackageName, int userId)
throws IOException {
final int callingUid = Binder.getCallingUid();
- mPm.enforceCrossUserPermission(callingUid, userId, true, false, "createSession");
+ mPm.enforceCrossUserPermission(callingUid, userId, true, true, "createSession");
- if (mPm.isUserRestricted(UserHandle.getUserId(callingUid),
- UserManager.DISALLOW_INSTALL_APPS)) {
+ if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
throw new SecurityException("User restriction prevents installing");
}
- // TODO: double check all possible install flags
-
if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) {
- installerPackageName = "com.android.shell";
-
- params.installFlags |= INSTALL_FROM_ADB;
+ params.installFlags |= PackageManager.INSTALL_FROM_ADB;
} else {
mAppOps.checkPackage(callingUid, installerPackageName);
- params.installFlags &= ~INSTALL_FROM_ADB;
- params.installFlags &= ~INSTALL_ALL_USERS;
- params.installFlags |= INSTALL_REPLACE_EXISTING;
+ params.installFlags &= ~PackageManager.INSTALL_FROM_ADB;
+ params.installFlags &= ~PackageManager.INSTALL_ALL_USERS;
+ params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
// Defensively resize giant app icons
@@ -532,8 +528,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
}
session = new PackageInstallerSession(mInternalCallback, mContext, mPm,
- mInstallThread.getLooper(), sessionId, userId, installerPackageName, params,
- createdMillis, stageDir, stageCid, false, false);
+ mInstallThread.getLooper(), sessionId, userId, installerPackageName, callingUid,
+ params, createdMillis, stageDir, stageCid, false, false);
mSessions.put(sessionId, session);
}
@@ -688,7 +684,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub {
@Override
public void uninstall(String packageName, int flags, IntentSender statusReceiver, int userId) {
- mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "uninstall");
+ mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, true, "uninstall");
final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext,
statusReceiver, packageName);
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 06f550d..4cbc1c4 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -96,6 +96,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final int sessionId;
final int userId;
final String installerPackageName;
+ final int installerUid;
final SessionParams params;
final long createdMillis;
@@ -103,9 +104,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
final File stageDir;
final String stageCid;
- /** Note that UID is not persisted; it's always derived at runtime. */
- final int installerUid;
-
private final AtomicInteger mActiveCount = new AtomicInteger();
private final Object mLock = new Object();
@@ -186,7 +184,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
public PackageInstallerSession(PackageInstallerService.InternalCallback callback,
Context context, PackageManagerService pm, Looper looper, int sessionId, int userId,
- String installerPackageName, SessionParams params, long createdMillis,
+ String installerPackageName, int installerUid, SessionParams params, long createdMillis,
File stageDir, String stageCid, boolean prepared, boolean sealed) {
mCallback = callback;
mContext = context;
@@ -196,6 +194,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
this.sessionId = sessionId;
this.userId = userId;
this.installerPackageName = installerPackageName;
+ this.installerUid = installerUid;
this.params = params;
this.createdMillis = createdMillis;
this.stageDir = stageDir;
@@ -209,11 +208,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mPrepared = prepared;
mSealed = sealed;
- // Always derived at runtime
- installerUid = mPm.getPackageUid(installerPackageName, userId);
-
- if (mPm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES,
- installerPackageName) == PackageManager.PERMISSION_GRANTED) {
+ if ((mPm.checkUidPermission(android.Manifest.permission.INSTALL_PACKAGES, installerUid)
+ == PackageManager.PERMISSION_GRANTED) || (installerUid == Process.ROOT_UID)) {
mPermissionsAccepted = true;
} else {
mPermissionsAccepted = false;
@@ -537,8 +533,15 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
}
};
- mPm.installStage(mPackageName, stageDir, stageCid, localObserver,
- params, installerPackageName, installerUid, new UserHandle(userId));
+ final UserHandle user;
+ if ((params.installFlags & PackageManager.INSTALL_ALL_USERS) != 0) {
+ user = UserHandle.ALL;
+ } else {
+ user = new UserHandle(userId);
+ }
+
+ mPm.installStage(mPackageName, stageDir, stageCid, localObserver, params,
+ installerPackageName, installerUid, user);
}
/**
@@ -764,8 +767,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static void extractNativeLibraries(File packageDir, String abiOverride)
throws PackageManagerException {
- if (LOGD) Slog.v(TAG, "extractNativeLibraries()");
-
// Always start from a clean slate
final File libDir = new File(packageDir, NativeLibraryHelper.LIB_DIR_NAME);
NativeLibraryHelper.removeNativeBinariesFromDirLI(libDir, true);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f09d789..0d27669 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -7672,16 +7672,11 @@ public class PackageManagerService extends IPackageManager.Stub {
public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer,
int installFlags, String installerPackageName, VerificationParams verificationParams,
String packageAbiOverride, int userId) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES,
- null);
- if (UserHandle.getCallingUserId() != userId) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
- "installPackage " + userId);
- }
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);
+
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId, true, true, "installPackageAsUser");
- final File originFile = new File(originPath);
- final int uid = Binder.getCallingUid();
if (isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
try {
if (observer != null) {
@@ -7692,6 +7687,17 @@ public class PackageManagerService extends IPackageManager.Stub {
return;
}
+ if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) {
+ installFlags |= PackageManager.INSTALL_FROM_ADB;
+
+ } else {
+ // Caller holds INSTALL_PACKAGES permission, so we're less strict
+ // about installerPackageName.
+
+ installFlags &= ~PackageManager.INSTALL_FROM_ADB;
+ installFlags &= ~PackageManager.INSTALL_ALL_USERS;
+ }
+
UserHandle user;
if ((installFlags & PackageManager.INSTALL_ALL_USERS) != 0) {
user = UserHandle.ALL;
@@ -7699,22 +7705,13 @@ public class PackageManagerService extends IPackageManager.Stub {
user = new UserHandle(userId);
}
- final int filteredInstallFlags;
- if (uid == Process.SHELL_UID || uid == 0) {
- if (DEBUG_INSTALL) {
- Slog.v(TAG, "Install from ADB");
- }
- filteredInstallFlags = installFlags | PackageManager.INSTALL_FROM_ADB;
- } else {
- filteredInstallFlags = installFlags & ~PackageManager.INSTALL_FROM_ADB;
- }
-
- verificationParams.setInstallerUid(uid);
+ verificationParams.setInstallerUid(callingUid);
+ final File originFile = new File(originPath);
final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);
final Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new InstallParams(origin, observer, filteredInstallFlags,
+ msg.obj = new InstallParams(origin, observer, installFlags,
installerPackageName, verificationParams, user, packageAbiOverride);
mHandler.sendMessage(msg);
}