diff options
author | 2024-10-09 17:21:58 +0000 | |
---|---|---|
committer | 2024-10-09 17:21:58 +0000 | |
commit | 21754b0235a8b66372fc3e8db8faac07b9a3235c (patch) | |
tree | 183472d12d05338ea4e5455331215ec25f602e32 | |
parent | be67b0f98c2e8eadc509458195cdebc8a3a17dfc (diff) | |
parent | e585720c951e098ec8db1b0b00a6c6a4b98a1fd2 (diff) |
Merge "[3/N] implement getDeclaredLibraries" into main
5 files changed, 127 insertions, 18 deletions
diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java index d77b2f53fc5b..f7191e605fb8 100644 --- a/core/java/android/content/pm/SharedLibraryInfo.java +++ b/core/java/android/content/pm/SharedLibraryInfo.java @@ -209,6 +209,24 @@ public final class SharedLibraryInfo implements Parcelable { } /** + * @hide + * @param name + * @param versionMajor + */ + public SharedLibraryInfo(String name, long versionMajor, int type) { + mPath = null; + mPackageName = null; + mName = name; + mVersion = versionMajor; + mType = type; + mDeclaringPackage = null; + mDependentPackages = null; + mDependencies = null; + mIsNative = false; + mOptionalDependentPackages = null; + } + + /** * Gets the type of this library. * * @return The library type. diff --git a/core/java/android/content/pm/parsing/ApkLite.java b/core/java/android/content/pm/parsing/ApkLite.java index 74ce62c7abff..19a13db15b05 100644 --- a/core/java/android/content/pm/parsing/ApkLite.java +++ b/core/java/android/content/pm/parsing/ApkLite.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.content.pm.ArchivedPackageParcel; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.VerifierInfo; @@ -149,6 +150,8 @@ public class ApkLite { */ private final @Nullable String mEmergencyInstaller; + private final @NonNull List<SharedLibraryInfo> mDeclaredLibraries; + /** * Archival install info. */ @@ -165,7 +168,7 @@ public class ApkLite { int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy, Set<String> requiredSplitTypes, Set<String> splitTypes, boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem, - String emergencyInstaller) { + String emergencyInstaller, List<SharedLibraryInfo> declaredLibraries) { mPath = path; mPackageName = packageName; mSplitName = splitName; @@ -202,6 +205,7 @@ public class ApkLite { mUpdatableSystem = updatableSystem; mEmergencyInstaller = emergencyInstaller; mArchivedPackage = null; + mDeclaredLibraries = declaredLibraries; } public ApkLite(String path, ArchivedPackageParcel archivedPackage) { @@ -241,6 +245,7 @@ public class ApkLite { mUpdatableSystem = true; mEmergencyInstaller = null; mArchivedPackage = archivedPackage; + mDeclaredLibraries = null; } /** @@ -565,6 +570,11 @@ public class ApkLite { return mEmergencyInstaller; } + @DataClass.Generated.Member + public @NonNull List<SharedLibraryInfo> getDeclaredLibraries() { + return mDeclaredLibraries; + } + /** * Archival install info. */ @@ -574,10 +584,10 @@ public class ApkLite { } @DataClass.Generated( - time = 1706896661616L, + time = 1728333566322L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java", - inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mRevisionCode\nprivate final int mInstallLocation\nprivate final int mMinSdkVersion\nprivate final int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final boolean mFeatureSplit\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mProfileableByShell\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final boolean mOverlayIsStatic\nprivate final int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final int mRollbackDataPolicy\nprivate final boolean mHasDeviceAdminReceiver\nprivate final boolean mIsSdkLibrary\nprivate final boolean mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") + inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mRevisionCode\nprivate final int mInstallLocation\nprivate final int mMinSdkVersion\nprivate final int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final boolean mFeatureSplit\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mProfileableByShell\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final boolean mOverlayIsStatic\nprivate final int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final int mRollbackDataPolicy\nprivate final boolean mHasDeviceAdminReceiver\nprivate final boolean mIsSdkLibrary\nprivate final boolean mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") @Deprecated private void __metadata() {} diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index ffb69c0a2821..1a7f628ae61c 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -24,6 +24,7 @@ import android.annotation.NonNull; import android.app.admin.DeviceAdminReceiver; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.VerifierInfo; import android.content.pm.parsing.result.ParseInput; @@ -92,6 +93,8 @@ public class ApkLiteParseUtils { private static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES; private static final String TAG_PROCESSES = "processes"; private static final String TAG_PROCESS = "process"; + private static final String TAG_STATIC_LIBRARY = "static-library"; + private static final String TAG_LIBRARY = "library"; /** * Parse only lightweight details about the package at the given location. @@ -457,6 +460,7 @@ public class ApkLiteParseUtils { boolean hasDeviceAdminReceiver = false; boolean isSdkLibrary = false; + List<SharedLibraryInfo> declaredLibraries = new ArrayList<>(); // Only search the tree when the tag is the direct child of <manifest> tag int type; @@ -521,6 +525,51 @@ public class ApkLiteParseUtils { break; case TAG_SDK_LIBRARY: isSdkLibrary = true; + // Mirrors ParsingPackageUtils#parseSdkLibrary until lite and full + // parsing are combined + String sdkLibName = parser.getAttributeValue( + ANDROID_RES_NAMESPACE, "name"); + int sdkLibVersionMajor = parser.getAttributeIntValue( + ANDROID_RES_NAMESPACE, "versionMajor", -1); + if (sdkLibName == null || sdkLibVersionMajor < 0) { + return input.error( + PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Bad uses-sdk-library declaration name: " + sdkLibName + + " version: " + sdkLibVersionMajor); + } + declaredLibraries.add(new SharedLibraryInfo( + sdkLibName, sdkLibVersionMajor, + SharedLibraryInfo.TYPE_SDK_PACKAGE)); + break; + case TAG_STATIC_LIBRARY: + // Mirrors ParsingPackageUtils#parseStaticLibrary until lite and full + // parsing are combined + String staticLibName = parser.getAttributeValue( + ANDROID_RES_NAMESPACE, "name"); + int staticLibVersion = parser.getAttributeIntValue( + ANDROID_RES_NAMESPACE, "version", -1); + int staticLibVersionMajor = parser.getAttributeIntValue( + ANDROID_RES_NAMESPACE, "versionMajor", 0); + if (staticLibName == null || staticLibVersion < 0) { + return input.error("Bad static-library declaration name: " + + staticLibName + " version: " + staticLibVersion); + } + declaredLibraries.add(new SharedLibraryInfo(staticLibName, + PackageInfo.composeLongVersionCode(staticLibVersionMajor, + staticLibVersion), SharedLibraryInfo.TYPE_STATIC)); + break; + case TAG_LIBRARY: + // Mirrors ParsingPackageUtils#parseLibrary until lite and full parsing + // are combined + String libName = parser.getAttributeValue( + ANDROID_RES_NAMESPACE, "name"); + if (libName == null) { + return input.error("Bad library declaration name: null"); + } + libName = libName.intern(); + declaredLibraries.add(new SharedLibraryInfo(libName, + SharedLibraryInfo.VERSION_UNDEFINED, + SharedLibraryInfo.TYPE_DYNAMIC)); break; case TAG_PROCESSES: final int processesDepth = parser.getDepth(); @@ -645,7 +694,8 @@ public class ApkLiteParseUtils { overlayIsStatic, overlayPriority, requiredSystemPropertyName, requiredSystemPropertyValue, minSdkVersion, targetSdkVersion, rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second, - hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller)); + hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller, + declaredLibraries)); } private static boolean isDeviceAdminReceiver( diff --git a/core/java/android/content/pm/parsing/PackageLite.java b/core/java/android/content/pm/parsing/PackageLite.java index 116dd1fc9a42..9a2ee7fe4cc6 100644 --- a/core/java/android/content/pm/parsing/PackageLite.java +++ b/core/java/android/content/pm/parsing/PackageLite.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.ArchivedPackageParcel; import android.content.pm.PackageInfo; +import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.VerifierInfo; @@ -114,6 +115,8 @@ public class PackageLite { */ private final boolean mIsSdkLibrary; + private final @NonNull List<SharedLibraryInfo> mDeclaredLibraries; + /** * Archival install info. */ @@ -154,6 +157,7 @@ public class PackageLite { mSplitApkPaths = splitApkPaths; mSplitRevisionCodes = splitRevisionCodes; mTargetSdk = targetSdk; + mDeclaredLibraries = baseApk.getDeclaredLibraries(); mArchivedPackage = baseApk.getArchivedPackage(); } @@ -433,6 +437,11 @@ public class PackageLite { return mIsSdkLibrary; } + @DataClass.Generated.Member + public @NonNull List<SharedLibraryInfo> getDeclaredLibraries() { + return mDeclaredLibraries; + } + /** * Archival install info. */ @@ -442,10 +451,10 @@ public class PackageLite { } @DataClass.Generated( - time = 1694792176268L, + time = 1728333569917L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/parsing/PackageLite.java", - inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mTargetSdk\nprivate final int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mProfileableByShell\nprivate final boolean mUseEmbeddedDex\nprivate final boolean mIsSdkLibrary\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic java.util.List<java.lang.String> getAllApkPaths()\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") + inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String> mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set<java.lang.String>[] mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mTargetSdk\nprivate final int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mProfileableByShell\nprivate final boolean mUseEmbeddedDex\nprivate final boolean mIsSdkLibrary\nprivate final @android.annotation.NonNull java.util.List<android.content.pm.SharedLibraryInfo> mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic java.util.List<java.lang.String> getAllApkPaths()\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") @Deprecated private void __metadata() {} diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 897ee4312d22..eb7c24399bba 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -109,6 +109,7 @@ import android.content.pm.PackageInstaller.UserActionReason; import android.content.pm.PackageManager; import android.content.pm.PackageManager.PackageInfoFlags; import android.content.pm.PackageManagerInternal; +import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.SigningInfo; import android.content.pm.dex.DexMetadataHelper; @@ -2880,19 +2881,38 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // since installation is in progress. activate(); } + try { + List<PackageInstallerSession> children = getChildSessions(); + if (isMultiPackage()) { + for (PackageInstallerSession child : children) { + child.prepareInheritedFiles(); + child.parseApk(); + } + } else { + prepareInheritedFiles(); + parseApk(); + } + } catch (PackageManagerException e) { + final String completeMsg = ExceptionUtils.getCompleteMessage(e); + final String errorMsg = PackageManager.installStatusToString(e.error, completeMsg); + setSessionFailed(e.error, errorMsg); + onSessionVerificationFailure(e.error, errorMsg); + } if (Flags.verificationService()) { final Supplier<Computer> snapshotSupplier = mPm::snapshotComputer; if (mVerifierController.isVerifierInstalled(snapshotSupplier, userId)) { - // TODO: extract shared library declarations final SigningInfo signingInfo; + final List<SharedLibraryInfo> declaredLibraries; synchronized (mLock) { signingInfo = new SigningInfo(mSigningDetails); + declaredLibraries = + mPackageLite == null ? null : mPackageLite.getDeclaredLibraries(); } // Send the request to the verifier and wait for its response before the rest of // the installation can proceed. if (!mVerifierController.startVerificationSession(snapshotSupplier, userId, - sessionId, params.appPackageName, Uri.fromFile(stageDir), signingInfo, - /* declaredLibraries= */null, /* extensionParams= */ null, + sessionId, getPackageName(), Uri.fromFile(stageDir), signingInfo, + declaredLibraries, /* extensionParams= */ null, new VerifierCallback(), /* retry= */ false)) { // A verifier is installed but cannot be connected. Installation disallowed. onSessionVerificationFailure(INSTALL_FAILED_INTERNAL_ERROR, @@ -2927,12 +2947,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { List<PackageInstallerSession> children = getChildSessions(); if (isMultiPackage()) { for (PackageInstallerSession child : children) { - child.prepareInheritedFiles(); - child.parseApkAndExtractNativeLibraries(); + child.extractNativeLibraries(); } } else { - prepareInheritedFiles(); - parseApkAndExtractNativeLibraries(); + extractNativeLibraries(); } verifyNonStaged(); } catch (PackageManagerException e) { @@ -3109,7 +3127,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mStageDirInUse = true; } - private void parseApkAndExtractNativeLibraries() throws PackageManagerException { + private void parseApk() throws PackageManagerException { synchronized (mLock) { if (mStageDirInUse) { throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, @@ -3142,12 +3160,16 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // stage dir here. // Besides, PackageLite may be null for staged sessions that don't complete // pre-reboot verification. - result = getOrParsePackageLiteLocked(stageDir, /* flags */ 0); + mPackageLite = getOrParsePackageLiteLocked(stageDir, /* flags */ 0); } else { - result = getOrParsePackageLiteLocked(mResolvedBaseFile, /* flags */ 0); + mPackageLite = getOrParsePackageLiteLocked(mResolvedBaseFile, /* flags */ 0); } - if (result != null) { - mPackageLite = result; + } + } + + private void extractNativeLibraries() throws PackageManagerException { + synchronized (mLock) { + if (mPackageLite != null) { if (!isApexSession()) { synchronized (mProgressLock) { mInternalProgress = 0.5f; |