summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ApplicationPackageManager.java2
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java45
3 files changed, 31 insertions, 18 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index e50c307df854..56f03d79b957 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -478,7 +478,7 @@ public class ApplicationPackageManager extends PackageManager {
public @NonNull List<SharedLibraryInfo> getSharedLibrariesAsUser(int flags, int userId) {
try {
ParceledListSlice<SharedLibraryInfo> sharedLibs = mPM.getSharedLibraries(
- flags, userId);
+ mContext.getOpPackageName(), flags, userId);
if (sharedLibs == null) {
return Collections.emptyList();
}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 9096e44cd175..cbe709afa9ca 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -617,7 +617,7 @@ interface IPackageManager {
int getInstallReason(String packageName, int userId);
- ParceledListSlice getSharedLibraries(int flags, int userId);
+ ParceledListSlice getSharedLibraries(in String packageName, int flags, int userId);
boolean canRequestPackageInstalls(String packageName, int userId);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 0173533d9594..a9a58739c2e2 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3594,8 +3594,7 @@ public class PackageManagerService extends IPackageManager.Stub
public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage,
int flags, int userId) {
return getPackageInfoInternal(versionedPackage.getPackageName(),
- // TODO: We will change version code to long, so in the new API it is long
- (int) versionedPackage.getVersionCode(), flags, userId);
+ versionedPackage.getVersionCode(), flags, userId);
}
private PackageInfo getPackageInfoInternal(String packageName, int versionCode,
@@ -4315,7 +4314,8 @@ public class PackageManagerService extends IPackageManager.Stub
}
@Override
- public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(int flags, int userId) {
+ public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
+ int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0");
@@ -4326,8 +4326,9 @@ public class PackageManagerService extends IPackageManager.Stub
== PERMISSION_GRANTED
|| mContext.checkCallingOrSelfPermission(DELETE_PACKAGES)
== PERMISSION_GRANTED
- || mContext.checkCallingOrSelfPermission(REQUEST_INSTALL_PACKAGES)
- == PERMISSION_GRANTED
+ || canRequestPackageInstallsInternal(packageName,
+ PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId,
+ false /* throwIfPermNotDeclared*/)
|| mContext.checkCallingOrSelfPermission(REQUEST_DELETE_PACKAGES)
== PERMISSION_GRANTED;
@@ -4351,7 +4352,8 @@ public class PackageManagerService extends IPackageManager.Stub
try {
// TODO: We will change version code to long, so in the new API it is long
PackageInfo packageInfo = getPackageInfoVersioned(
- libInfo.getDeclaringPackage(), flags, userId);
+ libInfo.getDeclaringPackage(), flags
+ | PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId);
if (packageInfo == null) {
continue;
}
@@ -9249,6 +9251,9 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (p != null) {
usesLibraryFiles.addAll(p.getAllCodePaths());
+ if (p.usesLibraryFiles != null) {
+ Collections.addAll(usesLibraryFiles, p.usesLibraryFiles);
+ }
}
}
@@ -17670,14 +17675,12 @@ public class PackageManagerService extends IPackageManager.Stub
Integer.MAX_VALUE, "versionCode must be >= -1");
final String packageName = versionedPackage.getPackageName();
- // TODO: We will change version code to long, so in the new API it is long
- final int versionCode = (int) versionedPackage.getVersionCode();
+ final int versionCode = versionedPackage.getVersionCode();
final String internalPackageName;
synchronized (mPackages) {
// Normalize package name to handle renamed packages and static libs
internalPackageName = resolveInternalPackageNameLPr(versionedPackage.getPackageName(),
- // TODO: We will change version code to long, so in the new API it is long
- (int) versionedPackage.getVersionCode());
+ versionedPackage.getVersionCode());
}
final int uid = Binder.getCallingUid();
@@ -17819,8 +17822,7 @@ public class PackageManagerService extends IPackageManager.Stub
libEntry.info.getVersion()) < 0) {
continue;
}
- // TODO: We will change version code to long, so in the new API it is long
- final int libVersionCode = (int) libEntry.info.getDeclaringPackage().getVersionCode();
+ final int libVersionCode = libEntry.info.getDeclaringPackage().getVersionCode();
if (versionCode != PackageManager.VERSION_CODE_HIGHEST) {
if (libVersionCode == versionCode) {
return libEntry.apk;
@@ -23876,6 +23878,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
@Override
public boolean canRequestPackageInstalls(String packageName, int userId) {
+ return canRequestPackageInstallsInternal(packageName, 0, userId,
+ true /* throwIfPermNotDeclared*/);
+ }
+
+ private boolean canRequestPackageInstallsInternal(String packageName, int flags, int userId,
+ boolean throwIfPermNotDeclared) {
int callingUid = Binder.getCallingUid();
int uid = getPackageUid(packageName, 0, userId);
if (callingUid != uid && callingUid != Process.ROOT_UID
@@ -23883,18 +23891,23 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
throw new SecurityException(
"Caller uid " + callingUid + " does not own package " + packageName);
}
- ApplicationInfo info = getApplicationInfo(packageName, 0, userId);
+ ApplicationInfo info = getApplicationInfo(packageName, flags, userId);
if (info == null) {
return false;
}
if (info.targetSdkVersion < Build.VERSION_CODES.O) {
- throw new UnsupportedOperationException(
- "Operation only supported on apps targeting Android O or higher");
+ return false;
}
String appOpPermission = Manifest.permission.REQUEST_INSTALL_PACKAGES;
String[] packagesDeclaringPermission = getAppOpPermissionPackages(appOpPermission);
if (!ArrayUtils.contains(packagesDeclaringPermission, packageName)) {
- throw new SecurityException("Need to declare " + appOpPermission + " to call this api");
+ if (throwIfPermNotDeclared) {
+ throw new SecurityException("Need to declare " + appOpPermission
+ + " to call this api");
+ } else {
+ Slog.e(TAG, "Need to declare " + appOpPermission + " to call this api");
+ return false;
+ }
}
if (sUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId)) {
return false;