Support recursive static shared lib dependency
Test: Updated the static shared lib CTS tests to verify that
All static shared lib CTS tests pass
bug:35359862
Change-Id: Id4a0dabbc9d8e98962e92b6f537f6ffffa63b585
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index e50c307..56f03d7 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -478,7 +478,7 @@
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 9096e44..cbe709a 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -617,7 +617,7 @@
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 0173533..a9a5873 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 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 @@
}
@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 @@
== 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 @@
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 @@
}
if (p != null) {
usesLibraryFiles.addAll(p.getAllCodePaths());
+ if (p.usesLibraryFiles != null) {
+ Collections.addAll(usesLibraryFiles, p.usesLibraryFiles);
+ }
}
}
@@ -17670,14 +17675,12 @@
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 @@
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 @@
@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 @@
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;