From 88e165c895dc9ad851e9002cb8ae02be41666ece Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Wed, 27 Jul 2022 15:10:53 +0000 Subject: [PATCH 1/4] Remove PackageInfoWithoutStateUtils Now that parsing is entirely server side, there is no point in having the utilities and interfaces split between with and without state. This merges the without state implementation down into the with state variant to consolidate the code and remove unused code paths. Test: atest CompatibilityModeTest Test: atest PackageParserLegacyCoreTest Test: atest PackageParserTest Change-Id: Ie238338a4cf1eb8ab10c9e22c9234a437b5fab7d --- .../src/android/os/PackageParsingPerfTest.kt | 15 +- .../com/android/server/pm/ComputerEngine.java | 12 +- .../java/com/android/server/pm/Settings.java | 7 +- .../server/pm/dex/ArtManagerService.java | 4 +- .../android/server/pm/dex/ViewCompiler.java | 4 +- .../server/pm/parsing/PackageInfoUtils.java | 581 +++++++++- .../server/pm/parsing/pkg/PackageImpl.java | 12 +- .../parsing/PackageInfoWithoutStateUtils.java | 991 ------------------ .../server/pm/pkg/parsing/ParsingPackage.java | 5 +- .../pm/pkg/parsing/ParsingPackageImpl.java | 42 +- .../pm/pkg/parsing/ParsingPackageUtils.java | 14 +- .../parsing/parcelling/AndroidPackageTest.kt | 1 + .../src/com/android/server/pm/MockSystem.kt | 3 +- .../server/pm/CompatibilityModeTest.java | 8 +- .../android/server/pm/PackageParserTest.java | 22 +- .../parsing/PackageParserLegacyCoreTest.java | 5 +- 16 files changed, 599 insertions(+), 1127 deletions(-) delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java diff --git a/apct-tests/perftests/packagemanager/src/android/os/PackageParsingPerfTest.kt b/apct-tests/perftests/packagemanager/src/android/os/PackageParsingPerfTest.kt index c061a7c964529..3452f587e3ff0 100644 --- a/apct-tests/perftests/packagemanager/src/android/os/PackageParsingPerfTest.kt +++ b/apct-tests/perftests/packagemanager/src/android/os/PackageParsingPerfTest.kt @@ -26,7 +26,7 @@ import android.perftests.utils.BenchmarkState import android.perftests.utils.PerfStatusReporter import androidx.test.filters.LargeTest import com.android.internal.util.ConcurrentUtils -import com.android.server.pm.pkg.parsing.ParsingPackageImpl +import com.android.server.pm.parsing.pkg.PackageImpl import com.android.server.pm.pkg.parsing.ParsingPackageUtils import libcore.io.IoUtils import org.junit.Rule @@ -190,7 +190,7 @@ public class PackageParsingPerfTest { } class ParallelParser2(cacher: PackageCacher2? = null) - : ParallelParser(cacher) { + : ParallelParser(cacher) { val input = ThreadLocal.withInitial { // For testing, just disable enforcement to avoid hooking up to compat framework ParseTypeImpl(ParseInput.Callback { _, _, _ -> false }) @@ -208,17 +208,18 @@ public class PackageParsingPerfTest { path: String, manifestArray: TypedArray, isCoreApp: Boolean - ) = ParsingPackageImpl( + ) = PackageImpl( packageName, baseApkPath, path, - manifestArray + manifestArray, + isCoreApp, ) }) override fun parseImpl(file: File) = parser.parsePackage(input.get()!!.reset(), file, 0, null).result - as ParsingPackageImpl + as PackageImpl } abstract class PackageCacher(private val cacheDir: File) { @@ -274,8 +275,8 @@ public class PackageParsingPerfTest { /** * Re-implementation of the server side PackageCacher, as it's inaccessible here. */ - class PackageCacher2(cacheDir: File) : PackageCacher(cacheDir) { + class PackageCacher2(cacheDir: File) : PackageCacher(cacheDir) { override fun fromParcel(parcel: Parcel) = - ParsingPackageImpl(parcel) + PackageImpl(parcel) } } diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 7c17778523826..d442fb28b648e 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -143,7 +143,6 @@ import com.android.server.pm.pkg.component.ParsedIntentInfo; import com.android.server.pm.pkg.component.ParsedMainComponent; import com.android.server.pm.pkg.component.ParsedProvider; import com.android.server.pm.pkg.component.ParsedService; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import com.android.server.pm.resolution.ComponentResolverApi; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.pm.verify.domain.DomainVerificationUtils; @@ -905,7 +904,7 @@ public class ComputerEngine implements Computer { a, flags, ps.getUserStateOrDefault(userId), userId, ps); } if (resolveComponentName().equals(component)) { - return PackageInfoWithoutStateUtils.generateDelegateActivityInfo(mResolveActivity, + return PackageInfoUtils.generateDelegateActivityInfo(mResolveActivity, flags, PackageUserStateInternal.DEFAULT, userId); } return null; @@ -1591,10 +1590,9 @@ public class ComputerEngine implements Computer { return result; } final ResolveInfo ephemeralInstaller = new ResolveInfo(mInstantAppInstallerInfo); - ephemeralInstaller.activityInfo = - PackageInfoWithoutStateUtils.generateDelegateActivityInfo( - instantAppInstallerActivity(), 0 /*flags*/, - ps.getUserStateOrDefault(userId), userId); + ephemeralInstaller.activityInfo = PackageInfoUtils.generateDelegateActivityInfo( + instantAppInstallerActivity(), 0 /*flags*/, + ps.getUserStateOrDefault(userId), userId); ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART | IntentFilter.MATCH_ADJUSTMENT_NORMAL; // add a non-generic filter @@ -1681,7 +1679,7 @@ public class ComputerEngine implements Computer { ai.setVersionCode(ps.getVersionCode()); ai.flags = ps.getFlags(); ai.privateFlags = ps.getPrivateFlags(); - pi.applicationInfo = PackageInfoWithoutStateUtils.generateDelegateApplicationInfo( + pi.applicationInfo = PackageInfoUtils.generateDelegateApplicationInfo( ai, flags, state, userId); if (DEBUG_PACKAGE_INFO) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index e55424a5709e9..10e9b54808752 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -116,7 +116,6 @@ import com.android.server.pm.pkg.component.ParsedComponent; import com.android.server.pm.pkg.component.ParsedIntentInfo; import com.android.server.pm.pkg.component.ParsedPermission; import com.android.server.pm.pkg.component.ParsedProcess; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import com.android.server.pm.resolution.ComponentResolver; import com.android.server.pm.verify.domain.DomainVerificationLegacySettings; import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; @@ -2687,8 +2686,8 @@ public final class Settings implements Watchable, Snappable { for (final PackageSetting pkg : mPackages.values()) { // TODO(b/135203078): This doesn't handle multiple users final String dataPath = pkg.getPkg() == null ? null : - PackageInfoWithoutStateUtils.getDataDir(pkg.getPkg(), - UserHandle.USER_SYSTEM).getAbsolutePath(); + PackageInfoUtils.getDataDir(pkg.getPkg(), UserHandle.USER_SYSTEM) + .getAbsolutePath(); if (pkg.getPkg() == null || dataPath == null) { if (!"android".equals(pkg.getPackageName())) { @@ -4619,7 +4618,7 @@ public final class Settings implements Watchable, Snappable { pw.append(prefix).append(" queriesIntents=") .println(ps.getPkg().getQueriesIntents()); } - File dataDir = PackageInfoWithoutStateUtils.getDataDir(pkg, UserHandle.myUserId()); + File dataDir = PackageInfoUtils.getDataDir(pkg, UserHandle.myUserId()); pw.print(prefix); pw.print(" dataDir="); pw.println(dataDir.getAbsolutePath()); pw.print(prefix); pw.print(" supportsScreens=["); boolean first = true; diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java index 0e46b0f42a91e..cca3b35189018 100644 --- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java +++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java @@ -53,8 +53,8 @@ import com.android.server.LocalServices; import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageManagerServiceCompilerMapping; +import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import dalvik.system.DexFile; import dalvik.system.VMRuntime; @@ -488,7 +488,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { final String packageName = pkg.getPackageName(); final String apkPath = pkg.getBaseApkPath(); // TODO(b/143971007): Use a cross-user directory - File dataDir = PackageInfoWithoutStateUtils.getDataDir(pkg, UserHandle.myUserId()); + File dataDir = PackageInfoUtils.getDataDir(pkg, UserHandle.myUserId()); final String outDexFile = dataDir.getAbsolutePath() + "/code_cache/compiled_view.dex"; if (pkg.isPrivileged() || pkg.isUseEmbeddedDex() || pkg.isDefaultToDeviceProtectedStorage()) { diff --git a/services/core/java/com/android/server/pm/dex/ViewCompiler.java b/services/core/java/com/android/server/pm/dex/ViewCompiler.java index 61aedd8bd1cf3..ee66a558670af 100644 --- a/services/core/java/com/android/server/pm/dex/ViewCompiler.java +++ b/services/core/java/com/android/server/pm/dex/ViewCompiler.java @@ -16,13 +16,13 @@ package com.android.server.pm.dex; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import android.os.Binder; import android.os.UserHandle; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.server.pm.Installer; +import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.File; @@ -42,7 +42,7 @@ public class ViewCompiler { final String packageName = pkg.getPackageName(); final String apkPath = pkg.getBaseApkPath(); // TODO(b/143971007): Use a cross-user directory - File dataDir = PackageInfoWithoutStateUtils.getDataDir(pkg, UserHandle.myUserId()); + File dataDir = PackageInfoUtils.getDataDir(pkg, UserHandle.myUserId()); final String outDexFile = dataDir.getAbsolutePath() + "/code_cache/compiled_view.dex"; Log.i("PackageManager", "Compiling layouts in " + packageName + " (" + apkPath + ") to " + outDexFile); diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index a44def8f772a1..5adad30fbc7ac 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -23,33 +23,49 @@ import android.annotation.UserIdInt; import android.apex.ApexInfo; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.Attribution; import android.content.pm.ComponentInfo; +import android.content.pm.ConfigurationInfo; +import android.content.pm.FallbackCategoryProvider; +import android.content.pm.FeatureGroupInfo; +import android.content.pm.FeatureInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; +import android.content.pm.PathPermission; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ProcessInfo; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.content.pm.SharedLibraryInfo; +import android.content.pm.Signature; +import android.content.pm.SigningDetails; +import android.content.pm.SigningInfo; +import android.content.pm.overlay.OverlayPaths; +import android.os.Environment; +import android.os.PatternMatcher; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Pair; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUnserialized; +import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.PackageUserStateUtils; +import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.component.ComponentParseUtils; import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedAttribution; import com.android.server.pm.pkg.component.ParsedComponent; import com.android.server.pm.pkg.component.ParsedInstrumentation; import com.android.server.pm.pkg.component.ParsedMainComponent; @@ -58,11 +74,14 @@ import com.android.server.pm.pkg.component.ParsedPermissionGroup; import com.android.server.pm.pkg.component.ParsedProcess; import com.android.server.pm.pkg.component.ParsedProvider; import com.android.server.pm.pkg.component.ParsedService; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; +import com.android.server.pm.pkg.component.ParsedUsesPermission; +import com.android.server.pm.pkg.parsing.ParsingPackageRead; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.pkg.parsing.ParsingUtils; import libcore.util.EmptyArray; +import java.io.File; import java.util.Collections; import java.util.List; import java.util.Map; @@ -79,6 +98,9 @@ import java.util.Set; public class PackageInfoUtils { private static final String TAG = ParsingUtils.TAG; + private static final String SYSTEM_DATA_PATH = + Environment.getDataDirectoryPath() + File.separator + "system"; + /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ @@ -117,9 +139,155 @@ public class PackageInfoUtils { return null; } - PackageInfo info = PackageInfoWithoutStateUtils.generateWithoutComponentsUnchecked(pkg, - gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, state, userId, - apexInfo, applicationInfo); + PackageInfo info = new PackageInfo(); + info.packageName = pkg.getPackageName(); + info.splitNames = pkg.getSplitNames(); + ParsingPackageUtils.fillVersionCodes(pkg, info); + info.baseRevisionCode = pkg.getBaseRevisionCode(); + info.splitRevisionCodes = pkg.getSplitRevisionCodes(); + info.versionName = pkg.getVersionName(); + info.sharedUserId = pkg.getSharedUserId(); + info.sharedUserLabel = pkg.getSharedUserLabel(); + info.applicationInfo = applicationInfo; + info.installLocation = pkg.getInstallLocation(); + if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 + || (info.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { + info.requiredForAllUsers = pkg.isRequiredForAllUsers(); + } + info.restrictedAccountType = pkg.getRestrictedAccountType(); + info.requiredAccountType = pkg.getRequiredAccountType(); + info.overlayTarget = pkg.getOverlayTarget(); + info.targetOverlayableName = pkg.getOverlayTargetOverlayableName(); + info.overlayCategory = pkg.getOverlayCategory(); + info.overlayPriority = pkg.getOverlayPriority(); + info.mOverlayIsStatic = pkg.isOverlayIsStatic(); + info.compileSdkVersion = pkg.getCompileSdkVersion(); + info.compileSdkVersionCodename = pkg.getCompileSdkVersionCodeName(); + info.firstInstallTime = firstInstallTime; + info.lastUpdateTime = lastUpdateTime; + if ((flags & PackageManager.GET_GIDS) != 0) { + info.gids = gids; + } + if ((flags & PackageManager.GET_CONFIGURATIONS) != 0) { + int size = pkg.getConfigPreferences().size(); + if (size > 0) { + info.configPreferences = new ConfigurationInfo[size]; + pkg.getConfigPreferences().toArray(info.configPreferences); + } + size = pkg.getRequestedFeatures().size(); + if (size > 0) { + info.reqFeatures = new FeatureInfo[size]; + pkg.getRequestedFeatures().toArray(info.reqFeatures); + } + size = pkg.getFeatureGroups().size(); + if (size > 0) { + info.featureGroups = new FeatureGroupInfo[size]; + pkg.getFeatureGroups().toArray(info.featureGroups); + } + } + if ((flags & PackageManager.GET_PERMISSIONS) != 0) { + int size = ArrayUtils.size(pkg.getPermissions()); + if (size > 0) { + info.permissions = new PermissionInfo[size]; + for (int i = 0; i < size; i++) { + info.permissions[i] = generatePermissionInfo(pkg.getPermissions().get(i), + flags); + } + } + final List usesPermissions = pkg.getUsesPermissions(); + size = usesPermissions.size(); + if (size > 0) { + info.requestedPermissions = new String[size]; + info.requestedPermissionsFlags = new int[size]; + for (int i = 0; i < size; i++) { + final ParsedUsesPermission usesPermission = usesPermissions.get(i); + info.requestedPermissions[i] = usesPermission.getName(); + // The notion of required permissions is deprecated but for compatibility. + info.requestedPermissionsFlags[i] |= + PackageInfo.REQUESTED_PERMISSION_REQUIRED; + if (grantedPermissions != null + && grantedPermissions.contains(usesPermission.getName())) { + info.requestedPermissionsFlags[i] |= + PackageInfo.REQUESTED_PERMISSION_GRANTED; + } + if ((usesPermission.getUsesPermissionFlags() + & ParsedUsesPermission.FLAG_NEVER_FOR_LOCATION) != 0) { + info.requestedPermissionsFlags[i] |= + PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION; + } + if (pkg.getImplicitPermissions().contains(info.requestedPermissions[i])) { + info.requestedPermissionsFlags[i] |= + PackageInfo.REQUESTED_PERMISSION_IMPLICIT; + } + } + } + } + if ((flags & PackageManager.GET_ATTRIBUTIONS) != 0) { + int size = ArrayUtils.size(pkg.getAttributions()); + if (size > 0) { + info.attributions = new Attribution[size]; + for (int i = 0; i < size; i++) { + ParsedAttribution parsedAttribution = pkg.getAttributions().get(i); + if (parsedAttribution != null) { + info.attributions[i] = new Attribution(parsedAttribution.getTag(), + parsedAttribution.getLabel()); + } + } + } + if (pkg.areAttributionsUserVisible()) { + info.applicationInfo.privateFlagsExt + |= ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; + } else { + info.applicationInfo.privateFlagsExt + &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; + } + } else { + info.applicationInfo.privateFlagsExt + &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; + } + + if (apexInfo != null) { + File apexFile = new File(apexInfo.modulePath); + + info.applicationInfo.sourceDir = apexFile.getPath(); + info.applicationInfo.publicSourceDir = apexFile.getPath(); + info.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; + info.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED; + if (apexInfo.isFactory) { + info.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; + } else { + info.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; + } + info.isApex = true; + info.isActiveApex = apexInfo.isActive; + } + + final SigningDetails signingDetails = pkg.getSigningDetails(); + // deprecated method of getting signing certificates + if ((flags & PackageManager.GET_SIGNATURES) != 0) { + if (signingDetails.hasPastSigningCertificates()) { + // Package has included signing certificate rotation information. Return the oldest + // cert so that programmatic checks keep working even if unaware of key rotation. + info.signatures = new Signature[1]; + info.signatures[0] = signingDetails.getPastSigningCertificates()[0]; + } else if (signingDetails.hasSignatures()) { + // otherwise keep old behavior + int numberOfSigs = signingDetails.getSignatures().length; + info.signatures = new Signature[numberOfSigs]; + System.arraycopy(signingDetails.getSignatures(), 0, info.signatures, 0, + numberOfSigs); + } + } + + // replacement for GET_SIGNATURES + if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) { + if (signingDetails != SigningDetails.UNKNOWN) { + // only return a valid SigningInfo if there is signing information to report + info.signingInfo = new SigningInfo(signingDetails); + } else { + info.signingInfo = null; + } + } info.isStub = pkg.isStub(); info.coreApp = pkg.isCoreApp(); @@ -215,9 +383,70 @@ public class PackageInfoUtils { return info; } + private static void updateApplicationInfo(ApplicationInfo ai, long flags, + PackageUserState state) { + if ((flags & PackageManager.GET_META_DATA) == 0) { + ai.metaData = null; + } + if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) == 0) { + ai.sharedLibraryFiles = null; + ai.sharedLibraryInfos = null; + } + + // CompatibilityMode is global state. + if (!ParsingPackageUtils.sCompatibilityModeEnabled) { + ai.disableCompatibilityMode(); + } + + ai.flags |= flag(state.isStopped(), ApplicationInfo.FLAG_STOPPED) + | flag(state.isInstalled(), ApplicationInfo.FLAG_INSTALLED) + | flag(state.isSuspended(), ApplicationInfo.FLAG_SUSPENDED); + ai.privateFlags |= flag(state.isInstantApp(), ApplicationInfo.PRIVATE_FLAG_INSTANT) + | flag(state.isVirtualPreload(), ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD) + | flag(state.isHidden(), ApplicationInfo.PRIVATE_FLAG_HIDDEN); + + if (state.getEnabledState() == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { + ai.enabled = true; + } else if (state.getEnabledState() + == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { + ai.enabled = (flags & PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0; + } else if (state.getEnabledState() == PackageManager.COMPONENT_ENABLED_STATE_DISABLED + || state.getEnabledState() + == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { + ai.enabled = false; + } + ai.enabledSetting = state.getEnabledState(); + if (ai.category == ApplicationInfo.CATEGORY_UNDEFINED) { + ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName); + } + ai.seInfoUser = SELinuxUtil.getSeinfoUser(state); + final OverlayPaths overlayPaths = state.getAllOverlayPaths(); + if (overlayPaths != null) { + ai.resourceDirs = overlayPaths.getResourceDirs().toArray(new String[0]); + ai.overlayPaths = overlayPaths.getOverlayPaths().toArray(new String[0]); + } + } + + @Nullable + public static ApplicationInfo generateDelegateApplicationInfo(@Nullable ApplicationInfo ai, + @PackageManager.ApplicationInfoFlagsBits long flags, + @NonNull PackageUserState state, int userId) { + if (ai == null || !checkUseInstalledOrHidden(flags, state, ai)) { + return null; + } + + ai = new ApplicationInfo(ai); + ai.initForUser(userId); + ai.icon = (ParsingPackageUtils.sUseRoundIcon && ai.roundIconRes != 0) ? ai.roundIconRes + : ai.iconRes; + updateApplicationInfo(ai, flags, state); + return ai; + } + /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ + @VisibleForTesting @Nullable public static ApplicationInfo generateApplicationInfo(AndroidPackage pkg, @PackageManager.ApplicationInfoFlagsBits long flags, @@ -232,8 +461,10 @@ public class PackageInfoUtils { return null; } - ApplicationInfo info = PackageInfoWithoutStateUtils.generateApplicationInfoUnchecked(pkg, - flags, state, userId, false /* assignUserFields */); + // Make shallow copy so we can store the metadata/libraries safely + ApplicationInfo info = ParsingPackageUtils.toAppInfoWithoutState(pkg); + + updateApplicationInfo(info, flags, state); initForUser(info, pkg, userId); @@ -265,6 +496,7 @@ public class PackageInfoUtils { /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ + @VisibleForTesting @Nullable public static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a, @PackageManager.ComponentInfoFlagsBits long flags, @@ -276,8 +508,9 @@ public class PackageInfoUtils { /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ + @VisibleForTesting @Nullable - private static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a, + public static ActivityInfo generateActivityInfo(AndroidPackage pkg, ParsedActivity a, @PackageManager.ComponentInfoFlagsBits long flags, @NonNull PackageUserStateInternal state, @Nullable ApplicationInfo applicationInfo, @UserIdInt int userId, @Nullable PackageStateInternal pkgSetting) { @@ -293,10 +526,61 @@ public class PackageInfoUtils { return null; } - final ActivityInfo info = PackageInfoWithoutStateUtils.generateActivityInfoUnchecked( - a, flags, applicationInfo); - assignSharedFieldsForComponentInfo(info, a, pkgSetting, userId); - return info; + // Make shallow copies so we can store the metadata safely + ActivityInfo ai = new ActivityInfo(); + ai.targetActivity = a.getTargetActivity(); + ai.processName = a.getProcessName(); + ai.exported = a.isExported(); + ai.theme = a.getTheme(); + ai.uiOptions = a.getUiOptions(); + ai.parentActivityName = a.getParentActivityName(); + ai.permission = a.getPermission(); + ai.taskAffinity = a.getTaskAffinity(); + ai.flags = a.getFlags(); + ai.privateFlags = a.getPrivateFlags(); + ai.launchMode = a.getLaunchMode(); + ai.documentLaunchMode = a.getDocumentLaunchMode(); + ai.maxRecents = a.getMaxRecents(); + ai.configChanges = a.getConfigChanges(); + ai.softInputMode = a.getSoftInputMode(); + ai.persistableMode = a.getPersistableMode(); + ai.lockTaskLaunchMode = a.getLockTaskLaunchMode(); + ai.screenOrientation = a.getScreenOrientation(); + ai.resizeMode = a.getResizeMode(); + ai.setMaxAspectRatio(a.getMaxAspectRatio()); + ai.setMinAspectRatio(a.getMinAspectRatio()); + ai.supportsSizeChanges = a.isSupportsSizeChanges(); + ai.requestedVrComponent = a.getRequestedVrComponent(); + ai.rotationAnimation = a.getRotationAnimation(); + ai.colorMode = a.getColorMode(); + ai.windowLayout = a.getWindowLayout(); + ai.attributionTags = a.getAttributionTags(); + if ((flags & PackageManager.GET_META_DATA) != 0) { + var metaData = a.getMetaData(); + // Backwards compatibility, coerce to null if empty + ai.metaData = metaData.isEmpty() ? null : metaData; + } else { + ai.metaData = null; + } + ai.applicationInfo = applicationInfo; + ai.setKnownActivityEmbeddingCerts(a.getKnownActivityEmbeddingCerts()); + assignFieldsComponentInfoParsedMainComponent(ai, a, pkgSetting, userId); + return ai; + } + + @Nullable + public static ActivityInfo generateDelegateActivityInfo(@Nullable ActivityInfo a, + @PackageManager.ComponentInfoFlagsBits long flags, + @NonNull PackageUserState state, int userId) { + if (a == null || !checkUseInstalledOrHidden(flags, state, a.applicationInfo)) { + return null; + } + // This is used to return the ResolverActivity or instantAppInstallerActivity; + // we will just always make a copy. + final ActivityInfo ai = new ActivityInfo(a); + ai.applicationInfo = + generateDelegateApplicationInfo(ai.applicationInfo, flags, state, userId); + return ai; } /** @@ -312,8 +596,9 @@ public class PackageInfoUtils { /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ + @VisibleForTesting @Nullable - private static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s, + public static ServiceInfo generateServiceInfo(AndroidPackage pkg, ParsedService s, @PackageManager.ComponentInfoFlagsBits long flags, PackageUserStateInternal state, @Nullable ApplicationInfo applicationInfo, int userId, @Nullable PackageStateInternal pkgSetting) { @@ -328,15 +613,28 @@ public class PackageInfoUtils { return null; } - final ServiceInfo info = PackageInfoWithoutStateUtils.generateServiceInfoUnchecked( - s, flags, applicationInfo); - assignSharedFieldsForComponentInfo(info, s, pkgSetting, userId); - return info; + + // Make shallow copies so we can store the metadata safely + ServiceInfo si = new ServiceInfo(); + si.exported = s.isExported(); + si.flags = s.getFlags(); + si.permission = s.getPermission(); + si.processName = s.getProcessName(); + si.mForegroundServiceType = s.getForegroundServiceType(); + si.applicationInfo = applicationInfo; + if ((flags & PackageManager.GET_META_DATA) != 0) { + var metaData = s.getMetaData(); + // Backwards compatibility, coerce to null if empty + si.metaData = metaData.isEmpty() ? null : metaData; + } + assignFieldsComponentInfoParsedMainComponent(si, s, pkgSetting, userId); + return si; } /** * @param pkgSetting See {@link PackageInfoUtils} for description of pkgSetting usage. */ + @VisibleForTesting @Nullable public static ProviderInfo generateProviderInfo(AndroidPackage pkg, ParsedProvider p, @PackageManager.ComponentInfoFlagsBits long flags, PackageUserStateInternal state, @@ -355,10 +653,33 @@ public class PackageInfoUtils { if (applicationInfo == null) { return null; } - ProviderInfo info = PackageInfoWithoutStateUtils.generateProviderInfoUnchecked(p, flags, - applicationInfo); - assignSharedFieldsForComponentInfo(info, p, pkgSetting, userId); - return info; + + // Make shallow copies so we can store the metadata safely + ProviderInfo pi = new ProviderInfo(); + pi.exported = p.isExported(); + pi.flags = p.getFlags(); + pi.processName = p.getProcessName(); + pi.authority = p.getAuthority(); + pi.isSyncable = p.isSyncable(); + pi.readPermission = p.getReadPermission(); + pi.writePermission = p.getWritePermission(); + pi.grantUriPermissions = p.isGrantUriPermissions(); + pi.forceUriPermissions = p.isForceUriPermissions(); + pi.multiprocess = p.isMultiProcess(); + pi.initOrder = p.getInitOrder(); + pi.uriPermissionPatterns = p.getUriPermissionPatterns().toArray(new PatternMatcher[0]); + pi.pathPermissions = p.getPathPermissions().toArray(new PathPermission[0]); + if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { + pi.uriPermissionPatterns = null; + } + if ((flags & PackageManager.GET_META_DATA) != 0) { + var metaData = p.getMetaData(); + // Backwards compatibility, coerce to null if empty + pi.metaData = metaData.isEmpty() ? null : metaData; + } + pi.applicationInfo = applicationInfo; + assignFieldsComponentInfoParsedMainComponent(pi, p, pkgSetting, userId); + return pi; } /** @@ -373,22 +694,37 @@ public class PackageInfoUtils { return null; } - InstrumentationInfo info = - PackageInfoWithoutStateUtils.generateInstrumentationInfo(i, pkg, flags, userId, - false /* assignUserFields */); + InstrumentationInfo info = new InstrumentationInfo(); + info.targetPackage = i.getTargetPackage(); + info.targetProcesses = i.getTargetProcesses(); + info.handleProfiling = i.isHandleProfiling(); + info.functionalTest = i.isFunctionalTest(); + + info.sourceDir = pkg.getBaseApkPath(); + info.publicSourceDir = pkg.getBaseApkPath(); + info.splitNames = pkg.getSplitNames(); + info.splitSourceDirs = pkg.getSplitCodePaths().length == 0 ? null : pkg.getSplitCodePaths(); + info.splitPublicSourceDirs = pkg.getSplitCodePaths().length == 0 + ? null : pkg.getSplitCodePaths(); + info.splitDependencies = pkg.getSplitDependencies().size() == 0 + ? null : pkg.getSplitDependencies(); initForUser(info, pkg, userId); - if (info == null) { - return null; - } - info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting); info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting); info.nativeLibraryDir = pkg.getNativeLibraryDir(); info.secondaryNativeLibraryDir = pkg.getSecondaryNativeLibraryDir(); - assignStateFieldsForPackageItemInfo(info, i, pkgSetting, userId); + assignFieldsPackageItemInfoParsedComponent(info, i, pkgSetting, userId); + + if ((flags & PackageManager.GET_META_DATA) == 0) { + info.metaData = null; + } else { + var metaData = i.getMetaData(); + // Backwards compatibility, coerce to null if empty + info.metaData = metaData.isEmpty() ? null : metaData; + } return info; } @@ -401,8 +737,25 @@ public class PackageInfoUtils { // TODO(b/135203078): Remove null checks and make all usages @NonNull if (p == null) return null; - // For now, permissions don't have state-adjustable fields; return directly - return PackageInfoWithoutStateUtils.generatePermissionInfo(p, flags); + PermissionInfo pi = new PermissionInfo(p.getBackgroundPermission()); + + assignFieldsPackageItemInfoParsedComponent(pi, p); + + pi.group = p.getGroup(); + pi.requestRes = p.getRequestRes(); + pi.protectionLevel = p.getProtectionLevel(); + pi.descriptionRes = p.getDescriptionRes(); + pi.flags = p.getFlags(); + pi.knownCerts = p.getKnownCerts(); + + if ((flags & PackageManager.GET_META_DATA) == 0) { + pi.metaData = null; + } else { + var metaData = p.getMetaData(); + // Backwards compatibility, coerce to null if empty + pi.metaData = metaData.isEmpty() ? null : metaData; + } + return pi; } @Nullable @@ -410,8 +763,27 @@ public class PackageInfoUtils { @PackageManager.ComponentInfoFlagsBits long flags) { if (pg == null) return null; - // For now, permissions don't have state-adjustable fields; return directly - return PackageInfoWithoutStateUtils.generatePermissionGroupInfo(pg, flags); + PermissionGroupInfo pgi = new PermissionGroupInfo( + pg.getRequestDetailRes(), + pg.getBackgroundRequestRes(), + pg.getBackgroundRequestDetailRes() + ); + + assignFieldsPackageItemInfoParsedComponent(pgi, pg); + pgi.descriptionRes = pg.getDescriptionRes(); + pgi.priority = pg.getPriority(); + pgi.requestRes = pg.getRequestRes(); + pgi.flags = pg.getFlags(); + + if ((flags & PackageManager.GET_META_DATA) == 0) { + pgi.metaData = null; + } else { + var metaData = pg.getMetaData(); + // Backwards compatibility, coerce to null if empty + pgi.metaData = metaData.isEmpty() ? null : metaData; + } + + return pgi; } @Nullable @@ -456,25 +828,64 @@ public class PackageInfoUtils { || (flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) != 0)); } - private static void assignSharedFieldsForComponentInfo(@NonNull ComponentInfo componentInfo, - @NonNull ParsedMainComponent mainComponent, @Nullable PackageStateInternal pkgSetting, - int userId) { - assignStateFieldsForPackageItemInfo(componentInfo, mainComponent, pkgSetting, userId); - componentInfo.descriptionRes = mainComponent.getDescriptionRes(); - componentInfo.directBootAware = mainComponent.isDirectBootAware(); - componentInfo.enabled = mainComponent.isEnabled(); - componentInfo.splitName = mainComponent.getSplitName(); - componentInfo.attributionTags = mainComponent.getAttributionTags(); + private static boolean checkUseInstalledOrHidden(long flags, + @NonNull PackageUserState state, @Nullable ApplicationInfo appInfo) { + // Returns false if the package is hidden system app until installed. + if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0 + && !state.isInstalled() + && appInfo != null && appInfo.hiddenUntilInstalled) { + return false; + } + + // If available for the target user, or trying to match uninstalled packages and it's + // a system app. + return PackageUserStateUtils.isAvailable(state, flags) + || (appInfo != null && appInfo.isSystemApp() + && ((flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0 + || (flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) != 0)); } - private static void assignStateFieldsForPackageItemInfo( - @NonNull PackageItemInfo packageItemInfo, @NonNull ParsedComponent component, + private static void assignFieldsComponentInfoParsedMainComponent( + @NonNull ComponentInfo info, @NonNull ParsedMainComponent component) { + assignFieldsPackageItemInfoParsedComponent(info, component); + info.descriptionRes = component.getDescriptionRes(); + info.directBootAware = component.isDirectBootAware(); + info.enabled = component.isEnabled(); + info.splitName = component.getSplitName(); + info.attributionTags = component.getAttributionTags(); + } + + private static void assignFieldsPackageItemInfoParsedComponent( + @NonNull PackageItemInfo packageItemInfo, @NonNull ParsedComponent component) { + packageItemInfo.nonLocalizedLabel = ComponentParseUtils.getNonLocalizedLabel(component); + packageItemInfo.icon = ComponentParseUtils.getIcon(component); + packageItemInfo.banner = component.getBanner(); + packageItemInfo.labelRes = component.getLabelRes(); + packageItemInfo.logo = component.getLogo(); + packageItemInfo.name = component.getName(); + packageItemInfo.packageName = component.getPackageName(); + } + + private static void assignFieldsComponentInfoParsedMainComponent( + @NonNull ComponentInfo info, @NonNull ParsedMainComponent component, @Nullable PackageStateInternal pkgSetting, int userId) { + assignFieldsComponentInfoParsedMainComponent(info, component); Pair labelAndIcon = ParsedComponentStateUtils.getNonLocalizedLabelAndIcon(component, pkgSetting, userId); - packageItemInfo.nonLocalizedLabel = labelAndIcon.first; - packageItemInfo.icon = labelAndIcon.second; + info.nonLocalizedLabel = labelAndIcon.first; + info.icon = labelAndIcon.second; + } + + private static void assignFieldsPackageItemInfoParsedComponent( + @NonNull PackageItemInfo info, @NonNull ParsedComponent component, + @Nullable PackageStateInternal pkgSetting, int userId) { + assignFieldsPackageItemInfoParsedComponent(info, component); + Pair labelAndIcon = + ParsedComponentStateUtils.getNonLocalizedLabelAndIcon(component, pkgSetting, + userId); + info.nonLocalizedLabel = labelAndIcon.first; + info.icon = labelAndIcon.second; } @CheckResult @@ -487,7 +898,31 @@ public class PackageInfoUtils { */ public static int appInfoFlags(AndroidPackage pkg, @Nullable PackageStateInternal pkgSetting) { // @formatter:off - int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoFlags(pkg) + int pkgWithoutStateFlags = flag(pkg.isExternalStorage(), ApplicationInfo.FLAG_EXTERNAL_STORAGE) + | flag(pkg.isBaseHardwareAccelerated(), ApplicationInfo.FLAG_HARDWARE_ACCELERATED) + | flag(pkg.isAllowBackup(), ApplicationInfo.FLAG_ALLOW_BACKUP) + | flag(pkg.isKillAfterRestore(), ApplicationInfo.FLAG_KILL_AFTER_RESTORE) + | flag(pkg.isRestoreAnyVersion(), ApplicationInfo.FLAG_RESTORE_ANY_VERSION) + | flag(pkg.isFullBackupOnly(), ApplicationInfo.FLAG_FULL_BACKUP_ONLY) + | flag(pkg.isPersistent(), ApplicationInfo.FLAG_PERSISTENT) + | flag(pkg.isDebuggable(), ApplicationInfo.FLAG_DEBUGGABLE) + | flag(pkg.isVmSafeMode(), ApplicationInfo.FLAG_VM_SAFE_MODE) + | flag(pkg.isHasCode(), ApplicationInfo.FLAG_HAS_CODE) + | flag(pkg.isAllowTaskReparenting(), ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) + | flag(pkg.isAllowClearUserData(), ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) + | flag(pkg.isLargeHeap(), ApplicationInfo.FLAG_LARGE_HEAP) + | flag(pkg.isUsesCleartextTraffic(), ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC) + | flag(pkg.isSupportsRtl(), ApplicationInfo.FLAG_SUPPORTS_RTL) + | flag(pkg.isTestOnly(), ApplicationInfo.FLAG_TEST_ONLY) + | flag(pkg.isMultiArch(), ApplicationInfo.FLAG_MULTIARCH) + | flag(pkg.isExtractNativeLibs(), ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS) + | flag(pkg.isGame(), ApplicationInfo.FLAG_IS_GAME) + | flag(pkg.isSupportsSmallScreens(), ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) + | flag(pkg.isSupportsNormalScreens(), ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) + | flag(pkg.isSupportsLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) + | flag(pkg.isSupportsExtraLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) + | flag(pkg.isResizeable(), ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) + | flag(pkg.isAnyDensity(), ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) | flag(pkg.isSystem(), ApplicationInfo.FLAG_SYSTEM) | flag(pkg.isFactoryTest(), ApplicationInfo.FLAG_FACTORY_TEST); @@ -511,7 +946,24 @@ public class PackageInfoUtils { public static int appInfoPrivateFlags(AndroidPackage pkg, @Nullable PackageStateInternal pkgSetting) { // @formatter:off - int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(pkg) + int pkgWithoutStateFlags = flag(pkg.isStaticSharedLibrary(), ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY) + | flag(pkg.isOverlay(), ApplicationInfo.PRIVATE_FLAG_IS_RESOURCE_OVERLAY) + | flag(pkg.isIsolatedSplitLoading(), ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING) + | flag(pkg.isHasDomainUrls(), ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) + | flag(pkg.isProfileableByShell(), ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL) + | flag(pkg.isBackupInForeground(), ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND) + | flag(pkg.isUseEmbeddedDex(), ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX) + | flag(pkg.isDefaultToDeviceProtectedStorage(), ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) + | flag(pkg.isDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) + | flag(pkg.isPartiallyDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) + | flag(pkg.isAllowClearUserDataOnFailedRestore(), ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE) + | flag(pkg.isAllowAudioPlaybackCapture(), ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE) + | flag(pkg.isRequestLegacyExternalStorage(), ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE) + | flag(pkg.isUsesNonSdkApi(), ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API) + | flag(pkg.isHasFragileUserData(), ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA) + | flag(pkg.isCantSaveState(), ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) + | flag(pkg.isResizeableActivityViaSdkVersion(), ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION) + | flag(pkg.isAllowNativeHeapPointerTagging(), ApplicationInfo.PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING) | flag(pkg.isSystemExt(), ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT) | flag(pkg.isPrivileged(), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) | flag(pkg.isOem(), ApplicationInfo.PRIVATE_FLAG_OEM) @@ -519,6 +971,16 @@ public class PackageInfoUtils { | flag(pkg.isProduct(), ApplicationInfo.PRIVATE_FLAG_PRODUCT) | flag(pkg.isOdm(), ApplicationInfo.PRIVATE_FLAG_ODM) | flag(pkg.isSignedWithPlatformKey(), ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY); + + Boolean resizeableActivity = pkg.getResizeableActivity(); + if (resizeableActivity != null) { + if (resizeableActivity) { + pkgWithoutStateFlags |= ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE; + } else { + pkgWithoutStateFlags |= ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE; + } + } + return appInfoPrivateFlags(pkgWithoutStateFlags, pkgSetting); // @formatter:on } @@ -536,7 +998,10 @@ public class PackageInfoUtils { public static int appInfoPrivateFlagsExt(AndroidPackage pkg, @Nullable PackageStateInternal pkgSetting) { // @formatter:off - int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlagsExt(pkg); + int pkgWithoutStateFlags = flag(pkg.isProfileable(), ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) + | flag(pkg.hasRequestForegroundServiceExemption(), ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION) + | flag(pkg.areAttributionsUserVisible(), ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) + | flag(pkg.isOnBackInvokedCallbackEnabled(), ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK); return appInfoPrivateFlagsExt(pkgWithoutStateFlags, pkgSetting); // @formatter:on } @@ -557,7 +1022,7 @@ public class PackageInfoUtils { output.uid = UserHandle.getUid(userId, UserHandle.getAppId(input.getUid())); if ("android".equals(packageName)) { - output.dataDir = PackageInfoWithoutStateUtils.SYSTEM_DATA_PATH; + output.dataDir = SYSTEM_DATA_PATH; return; } @@ -599,7 +1064,7 @@ public class PackageInfoUtils { PackageImpl pkg = ((PackageImpl) input); String packageName = input.getPackageName(); if ("android".equals(packageName)) { - output.dataDir = PackageInfoWithoutStateUtils.SYSTEM_DATA_PATH; + output.dataDir = SYSTEM_DATA_PATH; return; } @@ -634,6 +1099,22 @@ public class PackageInfoUtils { } } + @NonNull + public static File getDataDir(ParsingPackageRead pkg, int userId) { + if ("android".equals(pkg.getPackageName())) { + return Environment.getDataSystemDirectory(); + } + + if (pkg.isDefaultToDeviceProtectedStorage() + && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { + return Environment.getDataUserDePackageDirectory(pkg.getVolumeUuid(), userId, + pkg.getPackageName()); + } else { + return Environment.getDataUserCePackageDirectory(pkg.getVolumeUuid(), userId, + pkg.getPackageName()); + } + } + /** * Wraps {@link PackageInfoUtils#generateApplicationInfo} with a cache. */ diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java index 748d32894d8a4..9c7db4244b04f 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java @@ -194,18 +194,21 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public ParsedPackage hideAsParsed() { - super.hideAsParsed(); + super.assignDerivedFields(); return this; } @Override public AndroidPackage hideAsFinal() { // TODO(b/135203078): Lock as immutable - assignDerivedFields(); + if (mStorageUuid == null) { + assignDerivedFields(); + } + assignDerivedFields2(); return this; } - private void assignDerivedFields() { + private void assignDerivedFields2() { mBaseAppInfoFlags = PackageInfoUtils.appInfoFlags(this, null); mBaseAppInfoPrivateFlags = PackageInfoUtils.appInfoPrivateFlags(this, null); mBaseAppInfoPrivateFlagsExt = PackageInfoUtils.appInfoPrivateFlagsExt(this, null); @@ -545,7 +548,8 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An this.uid = in.readInt(); this.mBooleans = in.readInt(); - assignDerivedFields(); + super.assignDerivedFields(); + assignDerivedFields2(); } @NonNull diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java deleted file mode 100644 index 8f953e7719e51..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/PackageInfoWithoutStateUtils.java +++ /dev/null @@ -1,991 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import android.annotation.CheckResult; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.apex.ApexInfo; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.Attribution; -import android.content.pm.ComponentInfo; -import android.content.pm.ConfigurationInfo; -import android.content.pm.FallbackCategoryProvider; -import android.content.pm.FeatureGroupInfo; -import android.content.pm.FeatureInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageItemInfo; -import android.content.pm.PackageManager; -import android.content.pm.PathPermission; -import android.content.pm.PermissionGroupInfo; -import android.content.pm.PermissionInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ServiceInfo; -import android.content.pm.Signature; -import android.content.pm.SigningDetails; -import android.content.pm.SigningInfo; -import android.content.pm.overlay.OverlayPaths; -import android.os.Environment; -import android.os.PatternMatcher; -import android.os.UserHandle; - -import com.android.internal.util.ArrayUtils; -import com.android.server.pm.pkg.PackageUserState; -import com.android.server.pm.pkg.PackageUserStateUtils; -import com.android.server.pm.pkg.SELinuxUtil; -import com.android.server.pm.pkg.component.ComponentParseUtils; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedAttribution; -import com.android.server.pm.pkg.component.ParsedComponent; -import com.android.server.pm.pkg.component.ParsedInstrumentation; -import com.android.server.pm.pkg.component.ParsedMainComponent; -import com.android.server.pm.pkg.component.ParsedPermission; -import com.android.server.pm.pkg.component.ParsedPermissionGroup; -import com.android.server.pm.pkg.component.ParsedProvider; -import com.android.server.pm.pkg.component.ParsedService; -import com.android.server.pm.pkg.component.ParsedUsesPermission; - -import libcore.util.EmptyArray; - -import java.io.File; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -/** - * @hide - **/ -public class PackageInfoWithoutStateUtils { - - public static final String SYSTEM_DATA_PATH = - Environment.getDataDirectoryPath() + File.separator + "system"; - - @Nullable - public static PackageInfo generate(ParsingPackageRead pkg, int[] gids, - @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, - long lastUpdateTime, Set grantedPermissions, PackageUserState state, - int userId) { - return generateWithComponents(pkg, gids, flags, firstInstallTime, lastUpdateTime, grantedPermissions, - state, userId, null); - } - - @Nullable - public static PackageInfo generate(ParsingPackageRead pkg, ApexInfo apexInfo, int flags) { - return generateWithComponents(pkg, EmptyArray.INT, flags, 0, 0, Collections.emptySet(), - PackageUserState.DEFAULT, UserHandle.getCallingUserId(), apexInfo); - } - - @Nullable - private static PackageInfo generateWithComponents(ParsingPackageRead pkg, int[] gids, - @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, - long lastUpdateTime, Set grantedPermissions, PackageUserState state, - int userId, @Nullable ApexInfo apexInfo) { - ApplicationInfo applicationInfo = generateApplicationInfo(pkg, flags, state, userId); - if (applicationInfo == null) { - return null; - } - PackageInfo info = generateWithoutComponents(pkg, gids, flags, firstInstallTime, - lastUpdateTime, grantedPermissions, state, userId, apexInfo, applicationInfo); - - if (info == null) { - return null; - } - - if ((flags & PackageManager.GET_ACTIVITIES) != 0) { - final int N = pkg.getActivities().size(); - if (N > 0) { - int num = 0; - final ActivityInfo[] res = new ActivityInfo[N]; - for (int i = 0; i < N; i++) { - final ParsedActivity a = pkg.getActivities().get(i); - if (ComponentParseUtils.isMatch(state, false, pkg.isEnabled(), a, - flags)) { - if (PackageManager.APP_DETAILS_ACTIVITY_CLASS_NAME.equals( - a.getName())) { - continue; - } - res[num++] = generateActivityInfo(pkg, a, flags, state, - applicationInfo, userId); - } - } - info.activities = ArrayUtils.trimToSize(res, num); - } - } - if ((flags & PackageManager.GET_RECEIVERS) != 0) { - final int size = pkg.getReceivers().size(); - if (size > 0) { - int num = 0; - final ActivityInfo[] res = new ActivityInfo[size]; - for (int i = 0; i < size; i++) { - final ParsedActivity a = pkg.getReceivers().get(i); - if (ComponentParseUtils.isMatch(state, false, pkg.isEnabled(), a, - flags)) { - res[num++] = generateActivityInfo(pkg, a, flags, state, - applicationInfo, userId); - } - } - info.receivers = ArrayUtils.trimToSize(res, num); - } - } - if ((flags & PackageManager.GET_SERVICES) != 0) { - final int size = pkg.getServices().size(); - if (size > 0) { - int num = 0; - final ServiceInfo[] res = new ServiceInfo[size]; - for (int i = 0; i < size; i++) { - final ParsedService s = pkg.getServices().get(i); - if (ComponentParseUtils.isMatch(state, false, pkg.isEnabled(), s, - flags)) { - res[num++] = generateServiceInfo(pkg, s, flags, state, - applicationInfo, userId); - } - } - info.services = ArrayUtils.trimToSize(res, num); - } - } - if ((flags & PackageManager.GET_PROVIDERS) != 0) { - final int size = pkg.getProviders().size(); - if (size > 0) { - int num = 0; - final ProviderInfo[] res = new ProviderInfo[size]; - for (int i = 0; i < size; i++) { - final ParsedProvider pr = pkg.getProviders() - .get(i); - if (ComponentParseUtils.isMatch(state, false, pkg.isEnabled(), pr, - flags)) { - res[num++] = generateProviderInfo(pkg, pr, flags, state, - applicationInfo, userId); - } - } - info.providers = ArrayUtils.trimToSize(res, num); - } - } - if ((flags & PackageManager.GET_INSTRUMENTATION) != 0) { - int N = pkg.getInstrumentations().size(); - if (N > 0) { - info.instrumentation = new InstrumentationInfo[N]; - for (int i = 0; i < N; i++) { - info.instrumentation[i] = generateInstrumentationInfo( - pkg.getInstrumentations().get(i), pkg, flags, userId, - true /* assignUserFields */); - } - } - } - - return info; - } - - @Nullable - public static PackageInfo generateWithoutComponents(ParsingPackageRead pkg, int[] gids, - @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, - long lastUpdateTime, Set grantedPermissions, PackageUserState state, - int userId, @Nullable ApexInfo apexInfo, @NonNull ApplicationInfo applicationInfo) { - if (!checkUseInstalled(pkg, state, flags)) { - return null; - } - - return generateWithoutComponentsUnchecked(pkg, gids, flags, firstInstallTime, - lastUpdateTime, grantedPermissions, state, userId, apexInfo, applicationInfo); - } - - /** - * This bypasses critical checks that are necessary for usage with data passed outside of system - * server. - *

- * Prefer {@link #generateWithoutComponents(ParsingPackageRead, int[], int, long, long, Set, - * PackageUserState, int, ApexInfo, ApplicationInfo)}. - */ - @NonNull - public static PackageInfo generateWithoutComponentsUnchecked(ParsingPackageRead pkg, int[] gids, - @PackageManager.PackageInfoFlagsBits long flags, long firstInstallTime, - long lastUpdateTime, Set grantedPermissions, PackageUserState state, - int userId, @Nullable ApexInfo apexInfo, @NonNull ApplicationInfo applicationInfo) { - PackageInfo pi = new PackageInfo(); - pi.packageName = pkg.getPackageName(); - pi.splitNames = pkg.getSplitNames(); - pi.versionCode = ((ParsingPackageHidden) pkg).getVersionCode(); - pi.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor(); - pi.baseRevisionCode = pkg.getBaseRevisionCode(); - pi.splitRevisionCodes = pkg.getSplitRevisionCodes(); - pi.versionName = pkg.getVersionName(); - pi.sharedUserId = pkg.getSharedUserId(); - pi.sharedUserLabel = pkg.getSharedUserLabel(); - pi.applicationInfo = applicationInfo; - pi.installLocation = pkg.getInstallLocation(); - if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 - || (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { - pi.requiredForAllUsers = pkg.isRequiredForAllUsers(); - } - pi.restrictedAccountType = pkg.getRestrictedAccountType(); - pi.requiredAccountType = pkg.getRequiredAccountType(); - pi.overlayTarget = pkg.getOverlayTarget(); - pi.targetOverlayableName = pkg.getOverlayTargetOverlayableName(); - pi.overlayCategory = pkg.getOverlayCategory(); - pi.overlayPriority = pkg.getOverlayPriority(); - pi.mOverlayIsStatic = pkg.isOverlayIsStatic(); - pi.compileSdkVersion = pkg.getCompileSdkVersion(); - pi.compileSdkVersionCodename = pkg.getCompileSdkVersionCodeName(); - pi.firstInstallTime = firstInstallTime; - pi.lastUpdateTime = lastUpdateTime; - if ((flags & PackageManager.GET_GIDS) != 0) { - pi.gids = gids; - } - if ((flags & PackageManager.GET_CONFIGURATIONS) != 0) { - int size = pkg.getConfigPreferences().size(); - if (size > 0) { - pi.configPreferences = new ConfigurationInfo[size]; - pkg.getConfigPreferences().toArray(pi.configPreferences); - } - size = pkg.getRequestedFeatures().size(); - if (size > 0) { - pi.reqFeatures = new FeatureInfo[size]; - pkg.getRequestedFeatures().toArray(pi.reqFeatures); - } - size = pkg.getFeatureGroups().size(); - if (size > 0) { - pi.featureGroups = new FeatureGroupInfo[size]; - pkg.getFeatureGroups().toArray(pi.featureGroups); - } - } - if ((flags & PackageManager.GET_PERMISSIONS) != 0) { - int size = ArrayUtils.size(pkg.getPermissions()); - if (size > 0) { - pi.permissions = new PermissionInfo[size]; - for (int i = 0; i < size; i++) { - pi.permissions[i] = generatePermissionInfo(pkg.getPermissions().get(i), - flags); - } - } - final List usesPermissions = pkg.getUsesPermissions(); - size = usesPermissions.size(); - if (size > 0) { - pi.requestedPermissions = new String[size]; - pi.requestedPermissionsFlags = new int[size]; - for (int i = 0; i < size; i++) { - final ParsedUsesPermission usesPermission = usesPermissions.get(i); - pi.requestedPermissions[i] = usesPermission.getName(); - // The notion of required permissions is deprecated but for compatibility. - pi.requestedPermissionsFlags[i] |= - PackageInfo.REQUESTED_PERMISSION_REQUIRED; - if (grantedPermissions != null - && grantedPermissions.contains(usesPermission.getName())) { - pi.requestedPermissionsFlags[i] |= - PackageInfo.REQUESTED_PERMISSION_GRANTED; - } - if ((usesPermission.getUsesPermissionFlags() - & ParsedUsesPermission.FLAG_NEVER_FOR_LOCATION) != 0) { - pi.requestedPermissionsFlags[i] |= - PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION; - } - if (pkg.getImplicitPermissions().contains(pi.requestedPermissions[i])) { - pi.requestedPermissionsFlags[i] |= - PackageInfo.REQUESTED_PERMISSION_IMPLICIT; - } - } - } - } - if ((flags & PackageManager.GET_ATTRIBUTIONS) != 0) { - int size = ArrayUtils.size(pkg.getAttributions()); - if (size > 0) { - pi.attributions = new Attribution[size]; - for (int i = 0; i < size; i++) { - pi.attributions[i] = generateAttribution(pkg.getAttributions().get(i)); - } - } - if (pkg.areAttributionsUserVisible()) { - pi.applicationInfo.privateFlagsExt - |= ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; - } else { - pi.applicationInfo.privateFlagsExt - &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; - } - } else { - pi.applicationInfo.privateFlagsExt - &= ~ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE; - } - - if (apexInfo != null) { - File apexFile = new File(apexInfo.modulePath); - - pi.applicationInfo.sourceDir = apexFile.getPath(); - pi.applicationInfo.publicSourceDir = apexFile.getPath(); - pi.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; - pi.applicationInfo.flags |= ApplicationInfo.FLAG_INSTALLED; - if (apexInfo.isFactory) { - pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; - } else { - pi.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; - } - pi.isApex = true; - pi.isActiveApex = apexInfo.isActive; - } - - final SigningDetails signingDetails = pkg.getSigningDetails(); - // deprecated method of getting signing certificates - if ((flags & PackageManager.GET_SIGNATURES) != 0) { - if (signingDetails.hasPastSigningCertificates()) { - // Package has included signing certificate rotation information. Return the oldest - // cert so that programmatic checks keep working even if unaware of key rotation. - pi.signatures = new Signature[1]; - pi.signatures[0] = signingDetails.getPastSigningCertificates()[0]; - } else if (signingDetails.hasSignatures()) { - // otherwise keep old behavior - int numberOfSigs = signingDetails.getSignatures().length; - pi.signatures = new Signature[numberOfSigs]; - System.arraycopy(signingDetails.getSignatures(), 0, pi.signatures, 0, - numberOfSigs); - } - } - - // replacement for GET_SIGNATURES - if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) { - if (signingDetails != SigningDetails.UNKNOWN) { - // only return a valid SigningInfo if there is signing information to report - pi.signingInfo = new SigningInfo(signingDetails); - } else { - pi.signingInfo = null; - } - } - - return pi; - } - - @Nullable - public static ApplicationInfo generateApplicationInfo(ParsingPackageRead pkg, - @PackageManager.ApplicationInfoFlagsBits long flags, PackageUserState state, - int userId) { - if (pkg == null) { - return null; - } - - if (!checkUseInstalled(pkg, state, flags)) { - return null; - } - - return generateApplicationInfoUnchecked(pkg, flags, state, userId, - true /* assignUserFields */); - } - - /** - * This bypasses critical checks that are necessary for usage with data passed outside of system - * server. - *

- * Prefer {@link #generateApplicationInfo(ParsingPackageRead, int, PackageUserState, int)}. - * - * @param assignUserFields whether to fill the returned {@link ApplicationInfo} with user - * specific fields. This can be skipped when building from a system - * server package, as there are cached strings which can be used rather - * than querying and concatenating the comparatively expensive {@link - * Environment#getDataDirectory(String)}}. - */ - @NonNull - public static ApplicationInfo generateApplicationInfoUnchecked(@NonNull ParsingPackageRead pkg, - @PackageManager.ApplicationInfoFlagsBits long flags, - @NonNull PackageUserState state, int userId, boolean assignUserFields) { - // Make shallow copy so we can store the metadata/libraries safely - ApplicationInfo ai = ((ParsingPackageHidden) pkg).toAppInfoWithoutState(); - - if (assignUserFields) { - assignUserFields(pkg, ai, userId); - } - - updateApplicationInfo(ai, flags, state); - - return ai; - } - - private static void updateApplicationInfo(ApplicationInfo ai, long flags, - PackageUserState state) { - if ((flags & PackageManager.GET_META_DATA) == 0) { - ai.metaData = null; - } - if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) == 0) { - ai.sharedLibraryFiles = null; - ai.sharedLibraryInfos = null; - } - - // CompatibilityMode is global state. - if (!ParsingPackageUtils.sCompatibilityModeEnabled) { - ai.disableCompatibilityMode(); - } - - ai.flags |= flag(state.isStopped(), ApplicationInfo.FLAG_STOPPED) - | flag(state.isInstalled(), ApplicationInfo.FLAG_INSTALLED) - | flag(state.isSuspended(), ApplicationInfo.FLAG_SUSPENDED); - ai.privateFlags |= flag(state.isInstantApp(), ApplicationInfo.PRIVATE_FLAG_INSTANT) - | flag(state.isVirtualPreload(), ApplicationInfo.PRIVATE_FLAG_VIRTUAL_PRELOAD) - | flag(state.isHidden(), ApplicationInfo.PRIVATE_FLAG_HIDDEN); - - if (state.getEnabledState() == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { - ai.enabled = true; - } else if (state.getEnabledState() - == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { - ai.enabled = (flags & PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS) != 0; - } else if (state.getEnabledState() == PackageManager.COMPONENT_ENABLED_STATE_DISABLED - || state.getEnabledState() - == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { - ai.enabled = false; - } - ai.enabledSetting = state.getEnabledState(); - if (ai.category == ApplicationInfo.CATEGORY_UNDEFINED) { - ai.category = FallbackCategoryProvider.getFallbackCategory(ai.packageName); - } - ai.seInfoUser = SELinuxUtil.getSeinfoUser(state); - final OverlayPaths overlayPaths = state.getAllOverlayPaths(); - if (overlayPaths != null) { - ai.resourceDirs = overlayPaths.getResourceDirs().toArray(new String[0]); - ai.overlayPaths = overlayPaths.getOverlayPaths().toArray(new String[0]); - } - } - - @Nullable - public static ApplicationInfo generateDelegateApplicationInfo(@Nullable ApplicationInfo ai, - @PackageManager.ApplicationInfoFlagsBits long flags, - @NonNull PackageUserState state, int userId) { - if (ai == null || !checkUseInstalledOrHidden(flags, state, ai)) { - return null; - } - // This is used to return the ResolverActivity or instantAppInstallerActivity; - // we will just always make a copy. - ai = new ApplicationInfo(ai); - ai.initForUser(userId); - ai.icon = (ParsingPackageUtils.sUseRoundIcon && ai.roundIconRes != 0) ? ai.roundIconRes - : ai.iconRes; - updateApplicationInfo(ai, flags, state); - return ai; - } - - @Nullable - public static ActivityInfo generateDelegateActivityInfo(@Nullable ActivityInfo a, - @PackageManager.ComponentInfoFlagsBits long flags, - @NonNull PackageUserState state, int userId) { - if (a == null || !checkUseInstalledOrHidden(flags, state, a.applicationInfo)) { - return null; - } - // This is used to return the ResolverActivity or instantAppInstallerActivity; - // we will just always make a copy. - final ActivityInfo ai = new ActivityInfo(a); - ai.applicationInfo = - generateDelegateApplicationInfo(ai.applicationInfo, flags, state, userId); - return ai; - } - - @Nullable - public static ActivityInfo generateActivityInfo(ParsingPackageRead pkg, ParsedActivity a, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - @Nullable ApplicationInfo applicationInfo, int userId) { - if (a == null) return null; - if (!checkUseInstalled(pkg, state, flags)) { - return null; - } - if (applicationInfo == null) { - applicationInfo = generateApplicationInfo(pkg, flags, state, userId); - } - if (applicationInfo == null) { - return null; - } - - return generateActivityInfoUnchecked(a, flags, applicationInfo); - } - - /** - * This bypasses critical checks that are necessary for usage with data passed outside of system - * server. - *

- * Prefer {@link #generateActivityInfo(ParsingPackageRead, ParsedActivity, long, - * PackageUserState, ApplicationInfo, int)}. - */ - @NonNull - public static ActivityInfo generateActivityInfoUnchecked(@NonNull ParsedActivity a, - @PackageManager.ComponentInfoFlagsBits long flags, - @NonNull ApplicationInfo applicationInfo) { - // Make shallow copies so we can store the metadata safely - ActivityInfo ai = new ActivityInfo(); - assignSharedFieldsForComponentInfo(ai, a); - ai.targetActivity = a.getTargetActivity(); - ai.processName = a.getProcessName(); - ai.exported = a.isExported(); - ai.theme = a.getTheme(); - ai.uiOptions = a.getUiOptions(); - ai.parentActivityName = a.getParentActivityName(); - ai.permission = a.getPermission(); - ai.taskAffinity = a.getTaskAffinity(); - ai.flags = a.getFlags(); - ai.privateFlags = a.getPrivateFlags(); - ai.launchMode = a.getLaunchMode(); - ai.documentLaunchMode = a.getDocumentLaunchMode(); - ai.maxRecents = a.getMaxRecents(); - ai.configChanges = a.getConfigChanges(); - ai.softInputMode = a.getSoftInputMode(); - ai.persistableMode = a.getPersistableMode(); - ai.lockTaskLaunchMode = a.getLockTaskLaunchMode(); - ai.screenOrientation = a.getScreenOrientation(); - ai.resizeMode = a.getResizeMode(); - ai.setMaxAspectRatio(a.getMaxAspectRatio()); - ai.setMinAspectRatio(a.getMinAspectRatio()); - ai.supportsSizeChanges = a.isSupportsSizeChanges(); - ai.requestedVrComponent = a.getRequestedVrComponent(); - ai.rotationAnimation = a.getRotationAnimation(); - ai.colorMode = a.getColorMode(); - ai.windowLayout = a.getWindowLayout(); - ai.attributionTags = a.getAttributionTags(); - if ((flags & PackageManager.GET_META_DATA) != 0) { - var metaData = a.getMetaData(); - // Backwards compatibility, coerce to null if empty - ai.metaData = metaData.isEmpty() ? null : metaData; - } - ai.applicationInfo = applicationInfo; - ai.setKnownActivityEmbeddingCerts(a.getKnownActivityEmbeddingCerts()); - return ai; - } - - @Nullable - public static ActivityInfo generateActivityInfo(ParsingPackageRead pkg, ParsedActivity a, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - int userId) { - return generateActivityInfo(pkg, a, flags, state, null, userId); - } - - @Nullable - public static ServiceInfo generateServiceInfo(ParsingPackageRead pkg, ParsedService s, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - @Nullable ApplicationInfo applicationInfo, int userId) { - if (s == null) return null; - if (!checkUseInstalled(pkg, state, flags)) { - return null; - } - if (applicationInfo == null) { - applicationInfo = generateApplicationInfo(pkg, flags, state, userId); - } - if (applicationInfo == null) { - return null; - } - - return generateServiceInfoUnchecked(s, flags, applicationInfo); - } - - /** - * This bypasses critical checks that are necessary for usage with data passed outside of system - * server. - *

- * Prefer {@link #generateServiceInfo(ParsingPackageRead, ParsedService, long, PackageUserState, - * ApplicationInfo, int)}. - */ - @NonNull - public static ServiceInfo generateServiceInfoUnchecked(@NonNull ParsedService s, - @PackageManager.ComponentInfoFlagsBits long flags, - @NonNull ApplicationInfo applicationInfo) { - // Make shallow copies so we can store the metadata safely - ServiceInfo si = new ServiceInfo(); - assignSharedFieldsForComponentInfo(si, s); - si.exported = s.isExported(); - si.flags = s.getFlags(); - si.permission = s.getPermission(); - si.processName = s.getProcessName(); - si.mForegroundServiceType = s.getForegroundServiceType(); - si.applicationInfo = applicationInfo; - if ((flags & PackageManager.GET_META_DATA) != 0) { - var metaData = s.getMetaData(); - // Backwards compatibility, coerce to null if empty - si.metaData = metaData.isEmpty() ? null : metaData; - } - return si; - } - - @Nullable - public static ServiceInfo generateServiceInfo(ParsingPackageRead pkg, ParsedService s, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - int userId) { - return generateServiceInfo(pkg, s, flags, state, null, userId); - } - - @Nullable - public static ProviderInfo generateProviderInfo(ParsingPackageRead pkg, ParsedProvider p, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - @Nullable ApplicationInfo applicationInfo, int userId) { - if (p == null) return null; - if (!checkUseInstalled(pkg, state, flags)) { - return null; - } - if (applicationInfo == null) { - applicationInfo = generateApplicationInfo(pkg, flags, state, userId); - } - if (applicationInfo == null) { - return null; - } - - return generateProviderInfoUnchecked(p, flags, applicationInfo); - } - - /** - * This bypasses critical checks that are necessary for usage with data passed outside of system - * server. - *

- * Prefer {@link #generateProviderInfo(ParsingPackageRead, ParsedProvider, long, - * PackageUserState, ApplicationInfo, int)}. - */ - @NonNull - public static ProviderInfo generateProviderInfoUnchecked(@NonNull ParsedProvider p, - @PackageManager.ComponentInfoFlagsBits long flags, - @NonNull ApplicationInfo applicationInfo) { - // Make shallow copies so we can store the metadata safely - ProviderInfo pi = new ProviderInfo(); - assignSharedFieldsForComponentInfo(pi, p); - pi.exported = p.isExported(); - pi.flags = p.getFlags(); - pi.processName = p.getProcessName(); - pi.authority = p.getAuthority(); - pi.isSyncable = p.isSyncable(); - pi.readPermission = p.getReadPermission(); - pi.writePermission = p.getWritePermission(); - pi.grantUriPermissions = p.isGrantUriPermissions(); - pi.forceUriPermissions = p.isForceUriPermissions(); - pi.multiprocess = p.isMultiProcess(); - pi.initOrder = p.getInitOrder(); - pi.uriPermissionPatterns = p.getUriPermissionPatterns().toArray(new PatternMatcher[0]); - pi.pathPermissions = p.getPathPermissions().toArray(new PathPermission[0]); - if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { - pi.uriPermissionPatterns = null; - } - if ((flags & PackageManager.GET_META_DATA) != 0) { - var metaData = p.getMetaData(); - // Backwards compatibility, coerce to null if empty - pi.metaData = metaData.isEmpty() ? null : metaData; - } - pi.applicationInfo = applicationInfo; - return pi; - } - - @Nullable - public static ProviderInfo generateProviderInfo(ParsingPackageRead pkg, ParsedProvider p, - @PackageManager.ComponentInfoFlagsBits long flags, PackageUserState state, - int userId) { - return generateProviderInfo(pkg, p, flags, state, null, userId); - } - - /** - * @param assignUserFields see {@link #generateApplicationInfoUnchecked(ParsingPackageRead, - * long, PackageUserState, int, boolean)} - */ - @Nullable - public static InstrumentationInfo generateInstrumentationInfo(ParsedInstrumentation i, - ParsingPackageRead pkg, @PackageManager.ComponentInfoFlagsBits long flags, int userId, - boolean assignUserFields) { - if (i == null) return null; - - InstrumentationInfo ii = new InstrumentationInfo(); - assignSharedFieldsForPackageItemInfo(ii, i); - ii.targetPackage = i.getTargetPackage(); - ii.targetProcesses = i.getTargetProcesses(); - ii.handleProfiling = i.isHandleProfiling(); - ii.functionalTest = i.isFunctionalTest(); - - ii.sourceDir = pkg.getBaseApkPath(); - ii.publicSourceDir = pkg.getBaseApkPath(); - ii.splitNames = pkg.getSplitNames(); - ii.splitSourceDirs = pkg.getSplitCodePaths().length == 0 ? null : pkg.getSplitCodePaths(); - ii.splitPublicSourceDirs = pkg.getSplitCodePaths().length == 0 - ? null : pkg.getSplitCodePaths(); - ii.splitDependencies = pkg.getSplitDependencies().size() == 0 - ? null : pkg.getSplitDependencies(); - - if (assignUserFields) { - assignUserFields(pkg, ii, userId); - } - - if ((flags & PackageManager.GET_META_DATA) == 0) { - return ii; - } - var metaData = i.getMetaData(); - // Backwards compatibility, coerce to null if empty - ii.metaData = metaData.isEmpty() ? null : metaData; - return ii; - } - - @Nullable - public static PermissionInfo generatePermissionInfo(ParsedPermission p, - @PackageManager.ComponentInfoFlagsBits long flags) { - if (p == null) return null; - - PermissionInfo pi = new PermissionInfo(p.getBackgroundPermission()); - - assignSharedFieldsForPackageItemInfo(pi, p); - - pi.group = p.getGroup(); - pi.requestRes = p.getRequestRes(); - pi.protectionLevel = p.getProtectionLevel(); - pi.descriptionRes = p.getDescriptionRes(); - pi.flags = p.getFlags(); - pi.knownCerts = p.getKnownCerts(); - - if ((flags & PackageManager.GET_META_DATA) == 0) { - return pi; - } - var metaData = p.getMetaData(); - // Backwards compatibility, coerce to null if empty - pi.metaData = metaData.isEmpty() ? null : metaData; - return pi; - } - - @Nullable - public static PermissionGroupInfo generatePermissionGroupInfo(ParsedPermissionGroup pg, - @PackageManager.ComponentInfoFlagsBits long flags) { - if (pg == null) return null; - - PermissionGroupInfo pgi = new PermissionGroupInfo( - pg.getRequestDetailRes(), - pg.getBackgroundRequestRes(), - pg.getBackgroundRequestDetailRes() - ); - - assignSharedFieldsForPackageItemInfo(pgi, pg); - pgi.descriptionRes = pg.getDescriptionRes(); - pgi.priority = pg.getPriority(); - pgi.requestRes = pg.getRequestRes(); - pgi.flags = pg.getFlags(); - - if ((flags & PackageManager.GET_META_DATA) == 0) { - return pgi; - } - var metaData = pg.getMetaData(); - // Backwards compatibility, coerce to null if empty - pgi.metaData = metaData.isEmpty() ? null : metaData; - return pgi; - } - - @Nullable - public static Attribution generateAttribution(ParsedAttribution pa) { - if (pa == null) return null; - return new Attribution(pa.getTag(), pa.getLabel()); - } - - private static boolean checkUseInstalledOrHidden(long flags, - @NonNull PackageUserState state, @Nullable ApplicationInfo appInfo) { - // Returns false if the package is hidden system app until installed. - if ((flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) == 0 - && !state.isInstalled() - && appInfo != null && appInfo.hiddenUntilInstalled) { - return false; - } - - // If available for the target user, or trying to match uninstalled packages and it's - // a system app. - return PackageUserStateUtils.isAvailable(state, flags) - || (appInfo != null && appInfo.isSystemApp() - && ((flags & PackageManager.MATCH_KNOWN_PACKAGES) != 0 - || (flags & PackageManager.MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS) != 0)); - } - - private static void assignSharedFieldsForComponentInfo(@NonNull ComponentInfo componentInfo, - @NonNull ParsedMainComponent mainComponent) { - assignSharedFieldsForPackageItemInfo(componentInfo, mainComponent); - componentInfo.descriptionRes = mainComponent.getDescriptionRes(); - componentInfo.directBootAware = mainComponent.isDirectBootAware(); - componentInfo.enabled = mainComponent.isEnabled(); - componentInfo.splitName = mainComponent.getSplitName(); - componentInfo.attributionTags = mainComponent.getAttributionTags(); - } - - private static void assignSharedFieldsForPackageItemInfo( - @NonNull PackageItemInfo packageItemInfo, @NonNull ParsedComponent component) { - packageItemInfo.nonLocalizedLabel = ComponentParseUtils.getNonLocalizedLabel(component); - packageItemInfo.icon = ComponentParseUtils.getIcon(component); - - packageItemInfo.banner = component.getBanner(); - packageItemInfo.labelRes = component.getLabelRes(); - packageItemInfo.logo = component.getLogo(); - packageItemInfo.name = component.getName(); - packageItemInfo.packageName = component.getPackageName(); - } - - @CheckResult - private static int flag(boolean hasFlag, int flag) { - if (hasFlag) { - return flag; - } else { - return 0; - } - } - - /** - * @see ApplicationInfo#flags - */ - public static int appInfoFlags(ParsingPackageRead pkg) { - // @formatter:off - return flag(pkg.isExternalStorage(), ApplicationInfo.FLAG_EXTERNAL_STORAGE) - | flag(pkg.isBaseHardwareAccelerated(), ApplicationInfo.FLAG_HARDWARE_ACCELERATED) - | flag(pkg.isAllowBackup(), ApplicationInfo.FLAG_ALLOW_BACKUP) - | flag(pkg.isKillAfterRestore(), ApplicationInfo.FLAG_KILL_AFTER_RESTORE) - | flag(pkg.isRestoreAnyVersion(), ApplicationInfo.FLAG_RESTORE_ANY_VERSION) - | flag(pkg.isFullBackupOnly(), ApplicationInfo.FLAG_FULL_BACKUP_ONLY) - | flag(pkg.isPersistent(), ApplicationInfo.FLAG_PERSISTENT) - | flag(pkg.isDebuggable(), ApplicationInfo.FLAG_DEBUGGABLE) - | flag(pkg.isVmSafeMode(), ApplicationInfo.FLAG_VM_SAFE_MODE) - | flag(pkg.isHasCode(), ApplicationInfo.FLAG_HAS_CODE) - | flag(pkg.isAllowTaskReparenting(), ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) - | flag(pkg.isAllowClearUserData(), ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) - | flag(pkg.isLargeHeap(), ApplicationInfo.FLAG_LARGE_HEAP) - | flag(pkg.isUsesCleartextTraffic(), ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC) - | flag(pkg.isSupportsRtl(), ApplicationInfo.FLAG_SUPPORTS_RTL) - | flag(pkg.isTestOnly(), ApplicationInfo.FLAG_TEST_ONLY) - | flag(pkg.isMultiArch(), ApplicationInfo.FLAG_MULTIARCH) - | flag(pkg.isExtractNativeLibs(), ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS) - | flag(pkg.isGame(), ApplicationInfo.FLAG_IS_GAME) - | flag(pkg.isSupportsSmallScreens(), ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) - | flag(pkg.isSupportsNormalScreens(), ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) - | flag(pkg.isSupportsLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) - | flag(pkg.isSupportsExtraLargeScreens(), ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) - | flag(pkg.isResizeable(), ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) - | flag(pkg.isAnyDensity(), ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES); - // @formatter:on - } - - /** @see ApplicationInfo#privateFlags */ - public static int appInfoPrivateFlags(ParsingPackageRead pkg) { - // @formatter:off - int privateFlags = flag(pkg.isStaticSharedLibrary(), ApplicationInfo.PRIVATE_FLAG_STATIC_SHARED_LIBRARY) - | flag(pkg.isOverlay(), ApplicationInfo.PRIVATE_FLAG_IS_RESOURCE_OVERLAY) - | flag(pkg.isIsolatedSplitLoading(), ApplicationInfo.PRIVATE_FLAG_ISOLATED_SPLIT_LOADING) - | flag(pkg.isHasDomainUrls(), ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) - | flag(pkg.isProfileableByShell(), ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL) - | flag(pkg.isBackupInForeground(), ApplicationInfo.PRIVATE_FLAG_BACKUP_IN_FOREGROUND) - | flag(pkg.isUseEmbeddedDex(), ApplicationInfo.PRIVATE_FLAG_USE_EMBEDDED_DEX) - | flag(pkg.isDefaultToDeviceProtectedStorage(), ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) - | flag(pkg.isDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_DIRECT_BOOT_AWARE) - | flag(pkg.isPartiallyDirectBootAware(), ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) - | flag(pkg.isAllowClearUserDataOnFailedRestore(), ApplicationInfo.PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE) - | flag(pkg.isAllowAudioPlaybackCapture(), ApplicationInfo.PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE) - | flag(pkg.isRequestLegacyExternalStorage(), ApplicationInfo.PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE) - | flag(pkg.isUsesNonSdkApi(), ApplicationInfo.PRIVATE_FLAG_USES_NON_SDK_API) - | flag(pkg.isHasFragileUserData(), ApplicationInfo.PRIVATE_FLAG_HAS_FRAGILE_USER_DATA) - | flag(pkg.isCantSaveState(), ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) - | flag(pkg.isResizeableActivityViaSdkVersion(), ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION) - | flag(pkg.isAllowNativeHeapPointerTagging(), ApplicationInfo.PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING); - // @formatter:on - - Boolean resizeableActivity = pkg.getResizeableActivity(); - if (resizeableActivity != null) { - if (resizeableActivity) { - privateFlags |= ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE; - } else { - privateFlags |= ApplicationInfo.PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE; - } - } - - return privateFlags; - } - - /** @see ApplicationInfo#privateFlagsExt */ - public static int appInfoPrivateFlagsExt(ParsingPackageRead pkg) { - // @formatter:off - int privateFlagsExt = - flag(pkg.isProfileable(), ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) - | flag(pkg.hasRequestForegroundServiceExemption(), - ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION) - | flag(pkg.areAttributionsUserVisible(), - ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) - | flag(pkg.isOnBackInvokedCallbackEnabled(), - ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK); - // @formatter:on - return privateFlagsExt; - } - - private static boolean checkUseInstalled(ParsingPackageRead pkg, - PackageUserState state, @PackageManager.PackageInfoFlagsBits long flags) { - // If available for the target user - return PackageUserStateUtils.isAvailable(state, flags); - } - - @NonNull - public static File getDataDir(ParsingPackageRead pkg, int userId) { - if ("android".equals(pkg.getPackageName())) { - return Environment.getDataSystemDirectory(); - } - - if (pkg.isDefaultToDeviceProtectedStorage() - && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { - return getDeviceProtectedDataDir(pkg, userId); - } else { - return getCredentialProtectedDataDir(pkg, userId); - } - } - - @NonNull - public static File getDeviceProtectedDataDir(ParsingPackageRead pkg, int userId) { - return Environment.getDataUserDePackageDirectory(pkg.getVolumeUuid(), userId, - pkg.getPackageName()); - } - - @NonNull - public static File getCredentialProtectedDataDir(ParsingPackageRead pkg, int userId) { - return Environment.getDataUserCePackageDirectory(pkg.getVolumeUuid(), userId, - pkg.getPackageName()); - } - - private static void assignUserFields(ParsingPackageRead pkg, ApplicationInfo info, int userId) { - // This behavior is undefined for no-state ApplicationInfos when called by a public API, - // since the uid is never assigned by the system. It will always effectively be appId 0. - info.uid = UserHandle.getUid(userId, UserHandle.getAppId(info.uid)); - - String pkgName = pkg.getPackageName(); - if ("android".equals(pkgName)) { - info.dataDir = SYSTEM_DATA_PATH; - return; - } - - // For performance reasons, all these paths are built as strings - String baseDataDirPrefix = - Environment.getDataDirectoryPath(pkg.getVolumeUuid()) + File.separator; - String userIdPkgSuffix = File.separator + userId + File.separator + pkgName; - info.credentialProtectedDataDir = baseDataDirPrefix + Environment.DIR_USER_CE - + userIdPkgSuffix; - info.deviceProtectedDataDir = baseDataDirPrefix + Environment.DIR_USER_DE + userIdPkgSuffix; - - if (pkg.isDefaultToDeviceProtectedStorage() - && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { - info.dataDir = info.deviceProtectedDataDir; - } else { - info.dataDir = info.credentialProtectedDataDir; - } - } - - private static void assignUserFields(ParsingPackageRead pkg, InstrumentationInfo info, - int userId) { - String pkgName = pkg.getPackageName(); - if ("android".equals(pkgName)) { - info.dataDir = SYSTEM_DATA_PATH; - return; - } - - // For performance reasons, all these paths are built as strings - String baseDataDirPrefix = - Environment.getDataDirectoryPath(pkg.getVolumeUuid()) + File.separator; - String userIdPkgSuffix = File.separator + userId + File.separator + pkgName; - info.credentialProtectedDataDir = baseDataDirPrefix + Environment.DIR_USER_CE - + userIdPkgSuffix; - info.deviceProtectedDataDir = baseDataDirPrefix + Environment.DIR_USER_DE + userIdPkgSuffix; - - if (pkg.isDefaultToDeviceProtectedStorage() - && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { - info.dataDir = info.deviceProtectedDataDir; - } else { - info.dataDir = info.credentialProtectedDataDir; - } - } -} diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java index b7b37b2630f72..17d718ab66b98 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java @@ -30,6 +30,7 @@ import android.os.Bundle; import android.util.SparseArray; import android.util.SparseIntArray; +import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedApexSystemService; import com.android.server.pm.pkg.component.ParsedAttribution; @@ -391,8 +392,6 @@ public interface ParsingPackage extends ParsingPackageRead { ParsingPackage setOnBackInvokedCallbackEnabled(boolean enableOnBackInvokedCallback); - // TODO(b/135203078): This class no longer has access to ParsedPackage, find a replacement - // for moving to the next step @CallSuper - Object hideAsParsed(); + ParsedPackage hideAsParsed(); } diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java index 803780fe2a9b8..ebb7365794184 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java @@ -20,11 +20,9 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; -import android.annotation.CallSuper; import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; @@ -103,7 +101,8 @@ import java.util.UUID; * * @hide */ -public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, Parcelable { +public abstract class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, + Parcelable { private static final SparseArray EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>(); public static ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class); @@ -568,9 +567,9 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, private Set mKnownActivityEmbeddingCerts; // Derived fields - @NonNull - private UUID mStorageUuid; private long mLongVersionCode; + @NonNull + protected UUID mStorageUuid; private int mLocaleConfigRes; @@ -663,15 +662,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, return this; } - @SuppressLint("MissingSuperCall") - @CallSuper - @Override - public Object hideAsParsed() { - assignDerivedFields(); - return this; - } - - private void assignDerivedFields() { + protected void assignDerivedFields() { mStorageUuid = StorageManager.convert(volumeUuid); mLongVersionCode = PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); } @@ -1059,16 +1050,6 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, + " " + packageName + "}"; } - @Deprecated - @Override - public ApplicationInfo toAppInfoWithoutState() { - ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags(); - appInfo.flags = PackageInfoWithoutStateUtils.appInfoFlags(this); - appInfo.privateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(this); - appInfo.privateFlagsExt = PackageInfoWithoutStateUtils.appInfoPrivateFlagsExt(this); - return appInfo; - } - public ApplicationInfo toAppInfoWithoutStateWithoutFlags() { ApplicationInfo appInfo = new ApplicationInfo(); @@ -1491,19 +1472,6 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, assignDerivedFields(); } - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public ParsingPackageImpl createFromParcel(Parcel source) { - return new ParsingPackageImpl(source); - } - - @Override - public ParsingPackageImpl[] newArray(int size) { - return new ParsingPackageImpl[size]; - } - }; - @Override public int getVersionCode() { return versionCode; diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java index c129f37b6d162..27da4cac575fd 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java @@ -91,7 +91,9 @@ import com.android.internal.os.ClassLoaderFactory; import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.pm.SharedUidMigration; +import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.permission.CompatibilityPermissionInfo; +import com.android.server.pm.pkg.AndroidPackageApi; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ComponentParseUtils; import com.android.server.pm.pkg.component.InstallConstraintsTagParser; @@ -301,7 +303,8 @@ public class ParsingPackageUtils { @NonNull String baseApkPath, @NonNull String path, @NonNull TypedArray manifestArray, boolean isCoreApp) { - return new ParsingPackageImpl(packageName, baseApkPath, path, manifestArray); + return PackageImpl.forParsing(packageName, baseApkPath, path, manifestArray, + isCoreApp); } }); result = parser.parsePackage(input, file, parseFlags, /* frameworkSplits= */ null); @@ -3312,6 +3315,15 @@ public class ParsingPackageUtils { return keySetMapping; } + public static void fillVersionCodes(@NonNull ParsingPackageRead pkg, + @NonNull PackageInfo info) { + info.versionCode = ((ParsingPackageHidden) pkg).getVersionCode(); + info.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor(); + } + + public static ApplicationInfo toAppInfoWithoutState(AndroidPackageApi pkg) { + return ((ParsingPackageHidden) pkg).toAppInfoWithoutState(); + } /** * Callback interface for retrieving information that may be needed while parsing diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt index 728fc6c8e5366..aa05319a701a5 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt @@ -63,6 +63,7 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag "toAppInfoWithoutState", "toAppInfoWithoutStateWithoutFlags", "assignDerivedFields", + "assignDerivedFields2", "buildFakeForDeletion", "capPermissionPriorities", "forParsing", diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index 63939c9f26959..efc1b5883cfa5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -83,6 +83,7 @@ import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement import org.mockito.AdditionalMatchers.or +import org.mockito.Mockito import org.mockito.quality.Strictness import java.io.File import java.io.IOException @@ -139,7 +140,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { .mockStatic(PackageManagerServiceUtils::class.java) .mockStatic(Environment::class.java) .mockStatic(SystemServerInitThreadPool::class.java) - .mockStatic(ParsingPackageUtils::class.java) + .mockStatic(ParsingPackageUtils::class.java, Mockito.CALLS_REAL_METHODS) .mockStatic(LockGuard::class.java) .mockStatic(EventLog::class.java) .mockStatic(LocalServices::class.java) diff --git a/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java b/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java index e137c374b4cc7..eaa0e9ba752f1 100644 --- a/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/CompatibilityModeTest.java @@ -29,13 +29,13 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.pm.ApplicationInfo; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; -import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import android.os.Build; import android.platform.test.annotations.Presubmit; +import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.pkg.PackageUserStateImpl; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import org.junit.After; import org.junit.Before; @@ -220,8 +220,8 @@ public class CompatibilityModeTest { info.targetSdkVersion = targetSdkVersion; info.flags |= flags; when(mMockAndroidPackage.toAppInfoWithoutState()).thenReturn(info); - return PackageInfoWithoutStateUtils.generateApplicationInfoUnchecked(mMockAndroidPackage, - 0 /*flags*/, mMockUserState, 0 /*userId*/, false /*assignUserFields*/); + return PackageInfoUtils.generateApplicationInfo(mMockAndroidPackage, + 0 /*flags*/, mMockUserState, 0 /*userId*/, null); } private void setGlobalCompatibilityMode(boolean enabled) { diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 0841bfc1d88c6..32e278b0540d4 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -66,7 +66,6 @@ import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.CompatibilityPermissionInfo; -import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedActivityImpl; @@ -87,7 +86,6 @@ import com.android.server.pm.pkg.component.ParsedService; import com.android.server.pm.pkg.component.ParsedServiceImpl; import com.android.server.pm.pkg.component.ParsedUsesPermission; import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import com.android.server.pm.pkg.parsing.ParsingPackage; import org.junit.Before; @@ -604,27 +602,27 @@ public class PackageParserTest { final File testFile = extractFile(TEST_APP4_APK); try { final ParsedPackage pkg = new TestPackageParser2().parsePackage(testFile, 0, false); - ApplicationInfo appInfo = PackageInfoWithoutStateUtils.generateApplicationInfo(pkg, 0, - PackageUserState.DEFAULT, 0); + ApplicationInfo appInfo = PackageInfoUtils.generateApplicationInfo(pkg, 0, + PackageUserStateInternal.DEFAULT, 0, null); for (ParsedActivity activity : pkg.getActivities()) { assertNotNull(activity.getMetaData()); - assertNull(PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(activity, 0, - appInfo).metaData); + assertNull(PackageInfoUtils.generateActivityInfo(pkg, activity, 0, + PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData); } for (ParsedProvider provider : pkg.getProviders()) { assertNotNull(provider.getMetaData()); - assertNull(PackageInfoWithoutStateUtils.generateProviderInfoUnchecked(provider, 0, - appInfo).metaData); + assertNull(PackageInfoUtils.generateProviderInfo(pkg, provider, 0, + PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData); } for (ParsedActivity receiver : pkg.getReceivers()) { assertNotNull(receiver.getMetaData()); - assertNull(PackageInfoWithoutStateUtils.generateActivityInfoUnchecked(receiver, 0, - appInfo).metaData); + assertNull(PackageInfoUtils.generateActivityInfo(pkg, receiver, 0, + PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData); } for (ParsedService service : pkg.getServices()) { assertNotNull(service.getMetaData()); - assertNull(PackageInfoWithoutStateUtils.generateServiceInfoUnchecked(service, 0, - appInfo).metaData); + assertNull(PackageInfoUtils.generateServiceInfo(pkg, service, 0, + PackageUserStateInternal.DEFAULT, appInfo, 0, null).metaData); } } finally { testFile.delete(); diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java index 4d1c58d2c274c..be37cf6bd7b04 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java @@ -34,6 +34,7 @@ import android.content.pm.parsing.result.ParseTypeImpl; import android.os.Build; import android.os.Bundle; import android.os.FileUtils; +import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.util.Pair; import android.util.SparseIntArray; @@ -52,7 +53,6 @@ import com.android.server.pm.pkg.component.ParsedComponent; import com.android.server.pm.pkg.component.ParsedIntentInfo; import com.android.server.pm.pkg.component.ParsedPermission; import com.android.server.pm.pkg.component.ParsedPermissionUtils; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import com.android.server.pm.pkg.parsing.ParsingPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; @@ -594,7 +594,8 @@ public class PackageParserLegacyCoreTest { throw new IllegalStateException(ret.getErrorMessage(), ret.getException()); } pkg.setSigningDetails(ret.getResult()); - PackageInfo pi = PackageInfoWithoutStateUtils.generate(pkg, apexInfo, flags); + PackageInfo pi = PackageInfoUtils.generate(pkg.hideAsParsed().setApex(true), apexInfo, + flags, null, UserHandle.USER_SYSTEM); assertEquals("com.google.android.tzdata", pi.applicationInfo.packageName); assertTrue(pi.applicationInfo.enabled); From dc151ad11568a22893b53ea564a74f956f950131 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Thu, 28 Jul 2022 22:40:23 +0000 Subject: [PATCH 2/4] Remove ParsingPackageImpl Pushes all of the members down into PackageImpl to simplify the class structure. Manually combines the Booleans classes and creates a new Booleans2 for the overflow above 64 values. Also manually merges the Parcelable implementations. Formatting is a mess, but that can be addressed in a future change that migrates to Codegen and reorganizes the members. Test: atest com.android.server.pm.test.parsing.parcelling Change-Id: I2e82f0ba51e4e94ffc24ac98d967d600370efff5 --- .../server/pm/parsing/pkg/PackageImpl.java | 2962 +++++++++++++++- .../pm/pkg/component/ParsedActivityImpl.java | 4 +- .../pm/pkg/component/ParsedComponentImpl.java | 2 +- .../component/ParsedInstrumentationImpl.java | 2 +- .../component/ParsedMainComponentImpl.java | 2 +- .../pm/pkg/component/ParsedProviderImpl.java | 2 +- .../pm/pkg/component/ParsedServiceImpl.java | 2 +- .../pm/pkg/parsing/ParsingPackageHidden.java | 2 +- .../pm/pkg/parsing/ParsingPackageImpl.java | 2991 ----------------- .../parsing/parcelling/AndroidPackageTest.kt | 4 + 10 files changed, 2905 insertions(+), 3068 deletions(-) delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java index 9c7db4244b04f..56f5da162cd06 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java @@ -16,45 +16,388 @@ package com.android.server.pm.parsing.pkg; -import android.annotation.IntDef; +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; +import static java.util.Collections.emptySet; + +import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.ConfigurationInfo; +import android.content.pm.FeatureGroupInfo; +import android.content.pm.FeatureInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; import android.content.pm.SigningDetails; import android.content.res.TypedArray; +import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.os.Parcel; +import android.os.Parcelable; import android.os.UserHandle; +import android.os.storage.StorageManager; import android.text.TextUtils; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Pair; +import android.util.SparseArray; +import android.util.SparseIntArray; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DataClass; +import com.android.internal.util.Parcelling; import com.android.internal.util.Parcelling.BuiltIn.ForInternedString; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.pkg.SELinuxUtil; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedActivityImpl; +import com.android.server.pm.pkg.component.ParsedApexSystemService; +import com.android.server.pm.pkg.component.ParsedApexSystemServiceImpl; +import com.android.server.pm.pkg.component.ParsedAttribution; +import com.android.server.pm.pkg.component.ParsedAttributionImpl; +import com.android.server.pm.pkg.component.ParsedComponent; +import com.android.server.pm.pkg.component.ParsedInstrumentation; +import com.android.server.pm.pkg.component.ParsedInstrumentationImpl; +import com.android.server.pm.pkg.component.ParsedIntentInfo; +import com.android.server.pm.pkg.component.ParsedMainComponent; +import com.android.server.pm.pkg.component.ParsedPermission; +import com.android.server.pm.pkg.component.ParsedPermissionGroup; +import com.android.server.pm.pkg.component.ParsedPermissionGroupImpl; +import com.android.server.pm.pkg.component.ParsedPermissionImpl; +import com.android.server.pm.pkg.component.ParsedProcess; import com.android.server.pm.pkg.component.ParsedProvider; +import com.android.server.pm.pkg.component.ParsedProviderImpl; import com.android.server.pm.pkg.component.ParsedService; +import com.android.server.pm.pkg.component.ParsedServiceImpl; +import com.android.server.pm.pkg.component.ParsedUsesPermission; +import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; import com.android.server.pm.pkg.parsing.ParsingPackage; -import com.android.server.pm.pkg.parsing.ParsingPackageImpl; +import com.android.server.pm.pkg.parsing.ParsingPackageHidden; +import com.android.server.pm.pkg.parsing.ParsingPackageRead; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; +import com.android.server.pm.pkg.parsing.ParsingUtils; + +import libcore.util.EmptyArray; import java.io.File; +import java.security.PublicKey; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; /** - * Extensions to {@link ParsingPackageImpl} including fields/state contained in the system server + * Extensions to {@link PackageImpl} including fields/state contained in the system server * and not exposed to the core SDK. * - * Many of the fields contained here will eventually be moved inside - * {@link com.android.server.pm.PackageSetting} or {@link android.content.pm.pkg.PackageUserState}. - * * @hide */ -public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, AndroidPackage, - AndroidPackageHidden { +public class PackageImpl implements ParsedPackage, AndroidPackage, + AndroidPackageHidden, ParsingPackage, ParsingPackageHidden, Parcelable { + + private static final SparseArray EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>(); + private static final Comparator ORDER_COMPARATOR = + (first, second) -> Integer.compare(second.getOrder(), first.getOrder()); + public static Parcelling.BuiltIn.ForBoolean sForBoolean = Parcelling.Cache.getOrCreate( + Parcelling.BuiltIn.ForBoolean.class); + public static ForInternedString sForInternedString = Parcelling.Cache.getOrCreate( + ForInternedString.class); + public static Parcelling.BuiltIn.ForInternedStringArray sForInternedStringArray = Parcelling.Cache.getOrCreate( + Parcelling.BuiltIn.ForInternedStringArray.class); + public static Parcelling.BuiltIn.ForInternedStringList sForInternedStringList = Parcelling.Cache.getOrCreate( + Parcelling.BuiltIn.ForInternedStringList.class); + public static Parcelling.BuiltIn.ForInternedStringValueMap sForInternedStringValueMap = + Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringValueMap.class); + public static Parcelling.BuiltIn.ForStringSet sForStringSet = Parcelling.Cache.getOrCreate( + Parcelling.BuiltIn.ForStringSet.class); + public static Parcelling.BuiltIn.ForInternedStringSet sForInternedStringSet = + Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringSet.class); + protected static ParsingUtils.StringPairListParceler sForIntentInfoPairs = + new ParsingUtils.StringPairListParceler(); + protected int versionCode; + protected int versionCodeMajor; + @NonNull + @DataClass.ParcelWith(ForInternedString.class) + protected String packageName; + @NonNull + protected String mBaseApkPath; + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List usesLibraries = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List usesOptionalLibraries = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List usesNativeLibraries = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List usesOptionalNativeLibraries = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List originalPackages = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List adoptPermissions = emptyList(); + /** + * @deprecated consider migrating to {@link #getUsesPermissions} which has + * more parsed details, such as flags + */ + @NonNull + @Deprecated + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List requestedPermissions = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + protected List protectedBroadcasts = emptyList(); + @NonNull + protected List activities = emptyList(); + @NonNull + protected List apexSystemServices = emptyList(); + @NonNull + protected List receivers = emptyList(); + @NonNull + protected List services = emptyList(); + @NonNull + protected List providers = emptyList(); + @NonNull + protected List permissions = emptyList(); + @NonNull + protected List permissionGroups = emptyList(); + @NonNull + protected List instrumentations = emptyList(); + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + protected String volumeUuid; + @NonNull + @DataClass.ParcelWith(ForInternedString.class) + protected String mPath; + @Nullable + protected String[] splitCodePaths; + @NonNull + protected UUID mStorageUuid; + // These are objects because null represents not explicitly set + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean supportsSmallScreens; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean supportsNormalScreens; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean supportsLargeScreens; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean supportsExtraLargeScreens; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean resizeable; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean anyDensity; + private int baseRevisionCode; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String versionName; + private int compileSdkVersion; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String compileSdkVersionCodeName; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String restrictedAccountType; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String requiredAccountType; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String overlayTarget; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String overlayTargetOverlayableName; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String overlayCategory; + private int overlayPriority; + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringValueMap.class) + private Map overlayables = emptyMap(); + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String sdkLibName; + private int sdkLibVersionMajor; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String staticSharedLibName; + private long staticSharedLibVersion; + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List libraryNames = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List usesStaticLibraries = emptyList(); + @Nullable + private long[] usesStaticLibrariesVersions; + @Nullable + private String[][] usesStaticLibrariesCertDigests; + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List usesSdkLibraries = emptyList(); + @Nullable + private long[] usesSdkLibrariesVersionsMajor; + @Nullable + private String[][] usesSdkLibrariesCertDigests; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String sharedUserId; + private int sharedUserLabel; + @NonNull + private List configPreferences = emptyList(); + @NonNull + private List reqFeatures = emptyList(); + @NonNull + private List featureGroups = emptyList(); + @Nullable + private byte[] restrictUpdateHash; + @NonNull + private List usesPermissions = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List implicitPermissions = emptyList(); + @NonNull + private Set upgradeKeySets = emptySet(); + @NonNull + private Map> keySetMapping = emptyMap(); + @NonNull + private List attributions = emptyList(); + @NonNull +// @DataClass.ParcelWith(ParsingUtils.StringPairListParceler.class) + private List> preferredActivityFilters = emptyList(); + /** + * Map from a process name to a {@link ParsedProcess}. + */ + @NonNull + private Map processes = emptyMap(); + @Nullable + private Bundle metaData; + @NonNull + private Map mProperties = emptyMap(); + @NonNull + private SigningDetails signingDetails = SigningDetails.UNKNOWN; + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List queriesIntents = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) + private List queriesPackages = emptyList(); + @NonNull + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class) + private Set queriesProviders = emptySet(); + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringArray.class) + private String[] splitClassLoaderNames; + @Nullable + private SparseArray splitDependencies; + @Nullable + private int[] splitFlags; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringArray.class) + private String[] splitNames; + @Nullable + private int[] splitRevisionCodes; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String appComponentFactory; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String backupAgentName; + private int banner; + private int category = ApplicationInfo.CATEGORY_UNDEFINED; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String classLoaderName; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String className; + private int compatibleWidthLimitDp; + private int descriptionRes; + private int fullBackupContent; + private int dataExtractionRules; + private int iconRes; + private int installLocation = ParsingPackageUtils.PARSE_DEFAULT_INSTALL_LOCATION; + private int labelRes; + private int largestWidthLimitDp; + private int logo; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String manageSpaceActivityName; + private float maxAspectRatio; + private float minAspectRatio; + @Nullable + private SparseIntArray minExtensionVersions; + private int minSdkVersion = ParsingUtils.DEFAULT_MIN_SDK_VERSION; + private int maxSdkVersion = ParsingUtils.DEFAULT_MAX_SDK_VERSION; + private int networkSecurityConfigRes; + @Nullable + private CharSequence nonLocalizedLabel; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String permission; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String processName; + private int requiresSmallestWidthDp; + private int roundIconRes; + private int targetSandboxVersion; + private int targetSdkVersion = ParsingUtils.DEFAULT_TARGET_SDK_VERSION; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String taskAffinity; + private int theme; + private int uiOptions; + @Nullable + @DataClass.ParcelWith(ForInternedString.class) + private String zygotePreloadName; + /** + * @see ParsingPackageRead#getResizeableActivity() + */ + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean resizeableActivity; + private int autoRevokePermissions; + @ApplicationInfo.GwpAsanMode + private int gwpAsanMode; + @ApplicationInfo.MemtagMode + private int memtagMode; + @ApplicationInfo.NativeHeapZeroInitialized + private int nativeHeapZeroInitialized; + @Nullable + @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) + private Boolean requestRawExternalStorageAccess; + // TODO(chiuwinson): Non-null + @Nullable + private ArraySet mimeGroups; + // Usually there's code to set enabled to true during parsing, but it's possible to install + // an APK targeting tag. That code would be skipped + // and never assign this, so initialize this to true for those cases. + private long mBooleans = Booleans.ENABLED; + private long mBooleans2; + @Nullable + private Set mKnownActivityEmbeddingCerts; + // Derived fields + private long mLongVersionCode; + private int mLocaleConfigRes; @NonNull public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath, @@ -74,9 +417,9 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An */ @NonNull public static AndroidPackage buildFakeForDeletion(String packageName, String volumeUuid) { - return ((ParsedPackage) PackageImpl.forTesting(packageName) + return PackageImpl.forTesting(packageName) .setVolumeUuid(volumeUuid) - .hideAsParsed()) + .hideAsParsed() .hideAsFinal(); } @@ -127,44 +470,2063 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An // during ApplicationInfo generation. private boolean nativeLibraryRootRequiresIsa; - private int mBooleans; - - /** - * @see ParsingPackageImpl.Booleans - */ - private static class Booleans { - @IntDef({ - CORE_APP, - SYSTEM, - FACTORY_TEST, - SYSTEM_EXT, - PRIVILEGED, - OEM, - VENDOR, - PRODUCT, - ODM, - SIGNED_WITH_PLATFORM_KEY, - NATIVE_LIBRARY_ROOT_REQUIRES_ISA, - STUB, - }) - public @interface Flags {} - - private static final int CORE_APP = 1; - private static final int SYSTEM = 1 << 1; - private static final int FACTORY_TEST = 1 << 2; - private static final int SYSTEM_EXT = 1 << 3; - private static final int PRIVILEGED = 1 << 4; - private static final int OEM = 1 << 5; - private static final int VENDOR = 1 << 6; - private static final int PRODUCT = 1 << 7; - private static final int ODM = 1 << 8; - private static final int SIGNED_WITH_PLATFORM_KEY = 1 << 9; - private static final int NATIVE_LIBRARY_ROOT_REQUIRES_ISA = 1 << 10; - private static final int STUB = 1 << 11; - private static final int APEX = 1 << 12; + @Override + public PackageImpl addActivity(ParsedActivity parsedActivity) { + this.activities = CollectionUtils.add(this.activities, parsedActivity); + addMimeGroupsFromComponent(parsedActivity); + return this; } - private ParsedPackage setBoolean(@Booleans.Flags int flag, boolean value) { + @Override + public PackageImpl addAdoptPermission(String adoptPermission) { + this.adoptPermissions = CollectionUtils.add(this.adoptPermissions, + TextUtils.safeIntern(adoptPermission)); + return this; + } + + @Override + public final PackageImpl addApexSystemService( + ParsedApexSystemService parsedApexSystemService) { + this.apexSystemServices = CollectionUtils.add( + this.apexSystemServices, parsedApexSystemService); + return this; + } + + @Override + public PackageImpl addAttribution(ParsedAttribution attribution) { + this.attributions = CollectionUtils.add(this.attributions, attribution); + return this; + } + + @Override + public PackageImpl addConfigPreference(ConfigurationInfo configPreference) { + this.configPreferences = CollectionUtils.add(this.configPreferences, configPreference); + return this; + } + + @Override + public PackageImpl addFeatureGroup(FeatureGroupInfo featureGroup) { + this.featureGroups = CollectionUtils.add(this.featureGroups, featureGroup); + return this; + } + + @Override + public PackageImpl addImplicitPermission(String permission) { + addUsesPermission(new ParsedUsesPermissionImpl(permission, 0 /*usesPermissionFlags*/)); + this.implicitPermissions = CollectionUtils.add(this.implicitPermissions, + TextUtils.safeIntern(permission)); + return this; + } + + @Override + public PackageImpl addInstrumentation(ParsedInstrumentation instrumentation) { + this.instrumentations = CollectionUtils.add(this.instrumentations, instrumentation); + return this; + } + + @Override + public PackageImpl addKeySet(String keySetName, PublicKey publicKey) { + ArraySet publicKeys = keySetMapping.get(keySetName); + if (publicKeys == null) { + publicKeys = new ArraySet<>(); + } + publicKeys.add(publicKey); + keySetMapping = CollectionUtils.add(this.keySetMapping, keySetName, publicKeys); + return this; + } + + @Override + public PackageImpl addLibraryName(String libraryName) { + this.libraryNames = CollectionUtils.add(this.libraryNames, + TextUtils.safeIntern(libraryName)); + return this; + } + + private void addMimeGroupsFromComponent(ParsedComponent component) { + for (int i = component.getIntents().size() - 1; i >= 0; i--) { + IntentFilter filter = component.getIntents().get(i).getIntentFilter(); + for (int groupIndex = filter.countMimeGroups() - 1; groupIndex >= 0; groupIndex--) { + mimeGroups = ArrayUtils.add(mimeGroups, filter.getMimeGroup(groupIndex)); + } + } + } + + @Override + public PackageImpl addOriginalPackage(String originalPackage) { + this.originalPackages = CollectionUtils.add(this.originalPackages, originalPackage); + return this; + } + + @Override + public ParsingPackage addOverlayable(String overlayableName, String actorName) { + this.overlayables = CollectionUtils.add(this.overlayables, overlayableName, + TextUtils.safeIntern(actorName)); + return this; + } + + @Override + public PackageImpl addPermission(ParsedPermission permission) { + this.permissions = CollectionUtils.add(this.permissions, permission); + return this; + } + + @Override + public PackageImpl addPermissionGroup(ParsedPermissionGroup permissionGroup) { + this.permissionGroups = CollectionUtils.add(this.permissionGroups, permissionGroup); + return this; + } + + @Override + public PackageImpl addPreferredActivityFilter(String className, + ParsedIntentInfo intentInfo) { + this.preferredActivityFilters = CollectionUtils.add(this.preferredActivityFilters, + Pair.create(className, intentInfo)); + return this; + } + + @Override + public PackageImpl addProperty(@Nullable PackageManager.Property property) { + if (property == null) { + return this; + } + this.mProperties = CollectionUtils.add(this.mProperties, property.getName(), property); + return this; + } + + @Override + public PackageImpl addProtectedBroadcast(String protectedBroadcast) { + if (!this.protectedBroadcasts.contains(protectedBroadcast)) { + this.protectedBroadcasts = CollectionUtils.add(this.protectedBroadcasts, + TextUtils.safeIntern(protectedBroadcast)); + } + return this; + } + + @Override + public PackageImpl addProvider(ParsedProvider parsedProvider) { + this.providers = CollectionUtils.add(this.providers, parsedProvider); + addMimeGroupsFromComponent(parsedProvider); + return this; + } + + @Override + public PackageImpl addQueriesIntent(Intent intent) { + this.queriesIntents = CollectionUtils.add(this.queriesIntents, intent); + return this; + } + + @Override + public PackageImpl addQueriesPackage(String packageName) { + this.queriesPackages = CollectionUtils.add(this.queriesPackages, + TextUtils.safeIntern(packageName)); + return this; + } + + @Override + public PackageImpl addQueriesProvider(String authority) { + this.queriesProviders = CollectionUtils.add(this.queriesProviders, authority); + return this; + } + + @Override + public PackageImpl addReceiver(ParsedActivity parsedReceiver) { + this.receivers = CollectionUtils.add(this.receivers, parsedReceiver); + addMimeGroupsFromComponent(parsedReceiver); + return this; + } + + @Override + public PackageImpl addReqFeature(FeatureInfo reqFeature) { + this.reqFeatures = CollectionUtils.add(this.reqFeatures, reqFeature); + return this; + } + + @Override + public PackageImpl addService(ParsedService parsedService) { + this.services = CollectionUtils.add(this.services, parsedService); + addMimeGroupsFromComponent(parsedService); + return this; + } + + @Override + public PackageImpl addUsesLibrary(String libraryName) { + this.usesLibraries = CollectionUtils.add(this.usesLibraries, + TextUtils.safeIntern(libraryName)); + return this; + } + + @Override + public final PackageImpl addUsesNativeLibrary(String libraryName) { + this.usesNativeLibraries = CollectionUtils.add(this.usesNativeLibraries, + TextUtils.safeIntern(libraryName)); + return this; + } + + @Override + public PackageImpl addUsesOptionalLibrary(String libraryName) { + this.usesOptionalLibraries = CollectionUtils.add(this.usesOptionalLibraries, + TextUtils.safeIntern(libraryName)); + return this; + } + + @Override + public final PackageImpl addUsesOptionalNativeLibrary(String libraryName) { + this.usesOptionalNativeLibraries = CollectionUtils.add(this.usesOptionalNativeLibraries, + TextUtils.safeIntern(libraryName)); + return this; + } + + @Override + public PackageImpl addUsesPermission(ParsedUsesPermission permission) { + this.usesPermissions = CollectionUtils.add(this.usesPermissions, permission); + + // Continue populating legacy data structures to avoid performance + // issues until all that code can be migrated + this.requestedPermissions = CollectionUtils.add(this.requestedPermissions, + permission.getName()); + + return this; + } + + @Override + public PackageImpl addUsesSdkLibrary(String libraryName, long versionMajor, + String[] certSha256Digests) { + this.usesSdkLibraries = CollectionUtils.add(this.usesSdkLibraries, + TextUtils.safeIntern(libraryName)); + this.usesSdkLibrariesVersionsMajor = ArrayUtils.appendLong( + this.usesSdkLibrariesVersionsMajor, versionMajor, true); + this.usesSdkLibrariesCertDigests = ArrayUtils.appendElement(String[].class, + this.usesSdkLibrariesCertDigests, certSha256Digests, true); + return this; + } + + @Override + public PackageImpl addUsesStaticLibrary(String libraryName, long version, + String[] certSha256Digests) { + this.usesStaticLibraries = CollectionUtils.add(this.usesStaticLibraries, + TextUtils.safeIntern(libraryName)); + this.usesStaticLibrariesVersions = ArrayUtils.appendLong(this.usesStaticLibrariesVersions, + version, true); + this.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String[].class, + this.usesStaticLibrariesCertDigests, certSha256Digests, true); + return this; + } + + @Override + public boolean areAttributionsUserVisible() { + return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE); + } + + @Override + public PackageImpl asSplit(String[] splitNames, String[] splitCodePaths, + int[] splitRevisionCodes, SparseArray splitDependencies) { + this.splitNames = splitNames; + this.splitCodePaths = splitCodePaths; + this.splitRevisionCodes = splitRevisionCodes; + this.splitDependencies = splitDependencies; + + int count = splitNames.length; + this.splitFlags = new int[count]; + this.splitClassLoaderNames = new String[count]; + return this; + } + + protected void assignDerivedFields() { + mStorageUuid = StorageManager.convert(volumeUuid); + mLongVersionCode = PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); + } + + /** + * Create a map from a process name to the custom application class for this process, + * which comes from . + * + * The original information is stored in {@link #processes}, but it's stored in + * a form of: [process name] -[1:N]-> [package name] -[1:N]-> [class name]. + * We scan it and collect the process names and their app class names, only for this package. + * + * The resulting map only contains processes with a custom application class set. + */ + @Nullable + private ArrayMap buildAppClassNamesByProcess() { + if (ArrayUtils.size(processes) == 0) { + return null; + } + final ArrayMap ret = new ArrayMap<>(4); + for (String processName : processes.keySet()) { + final ParsedProcess process = processes.get(processName); + final ArrayMap appClassesByPackage = + process.getAppClassNamesByPackage(); + + for (int i = 0; i < appClassesByPackage.size(); i++) { + final String packageName = appClassesByPackage.keyAt(i); + + if (this.packageName.equals(packageName)) { + final String appClassName = appClassesByPackage.valueAt(i); + if (!TextUtils.isEmpty(appClassName)) { + ret.put(processName, appClassName); + } + } + } + } + return ret; + } + + @Override + public String toString() { + return "Package{" + + Integer.toHexString(System.identityHashCode(this)) + + " " + packageName + "}"; + } + + @NonNull + @Override + public List getActivities() { + return activities; + } + + @NonNull + @Override + public List getAdoptPermissions() { + return adoptPermissions; + } + + @NonNull + @Override + public List getApexSystemServices() { + return apexSystemServices; + } + + @Nullable + @Override + public String getAppComponentFactory() { + return appComponentFactory; + } + + @NonNull + @Override + public List getAttributions() { + return attributions; + } + + @Override + public int getAutoRevokePermissions() { + return autoRevokePermissions; + } + + @Nullable + @Override + public String getBackupAgentName() { + return backupAgentName; + } + + @Override + public int getBanner() { + return banner; + } + + @NonNull + @Override + public String getBaseApkPath() { + return mBaseApkPath; + } + + @Override + public int getBaseRevisionCode() { + return baseRevisionCode; + } + + @Override + public int getCategory() { + return category; + } + + @Nullable + @Override + public String getClassLoaderName() { + return classLoaderName; + } + + @Nullable + @Override + public String getClassName() { + return className; + } + + @Override + public int getCompatibleWidthLimitDp() { + return compatibleWidthLimitDp; + } + + @Override + public int getCompileSdkVersion() { + return compileSdkVersion; + } + + @Nullable + @Override + public String getCompileSdkVersionCodeName() { + return compileSdkVersionCodeName; + } + + @NonNull + @Override + public List getConfigPreferences() { + return configPreferences; + } + + @Override + public int getDataExtractionRules() { + return dataExtractionRules; + } + + @Override + public int getDescriptionRes() { + return descriptionRes; + } + + @NonNull + @Override + public List getFeatureGroups() { + return featureGroups; + } + + @Override + public int getFullBackupContent() { + return fullBackupContent; + } + + @ApplicationInfo.GwpAsanMode + @Override + public int getGwpAsanMode() { + return gwpAsanMode; + } + + @Override + public int getIconRes() { + return iconRes; + } + + @NonNull + @Override + public List getImplicitPermissions() { + return implicitPermissions; + } + + @Override + public int getInstallLocation() { + return installLocation; + } + + @NonNull + @Override + public List getInstrumentations() { + return instrumentations; + } + + @NonNull + @Override + public Map> getKeySetMapping() { + return keySetMapping; + } + + @NonNull + @Override + public Set getKnownActivityEmbeddingCerts() { + return mKnownActivityEmbeddingCerts == null ? Collections.emptySet() + : mKnownActivityEmbeddingCerts; + } + + @Override + public int getLabelRes() { + return labelRes; + } + + @Override + public int getLargestWidthLimitDp() { + return largestWidthLimitDp; + } + + @NonNull + @Override + public List getLibraryNames() { + return libraryNames; + } + + @Override + public int getLocaleConfigRes() { + return mLocaleConfigRes; + } + + @Override + public int getLogo() { + return logo; + } + + @Nullable + @Override + public String getManageSpaceActivityName() { + return manageSpaceActivityName; + } + + @Override + public float getMaxAspectRatio() { + return maxAspectRatio; + } + + @Override + public int getMaxSdkVersion() { + return maxSdkVersion; + } + + @ApplicationInfo.MemtagMode + @Override + public int getMemtagMode() { + return memtagMode; + } + + @Nullable + @Override + public Bundle getMetaData() { + return metaData; + } + + @Override + @Nullable + public Set getMimeGroups() { + return mimeGroups; + } + + @Override + public float getMinAspectRatio() { + return minAspectRatio; + } + + @Nullable + @Override + public SparseIntArray getMinExtensionVersions() { + return minExtensionVersions; + } + + @Override + public int getMinSdkVersion() { + return minSdkVersion; + } + + @ApplicationInfo.NativeHeapZeroInitialized + @Override + public int getNativeHeapZeroInitialized() { + return nativeHeapZeroInitialized; + } + + @Override + public int getNetworkSecurityConfigRes() { + return networkSecurityConfigRes; + } + + @Nullable + @Override + public CharSequence getNonLocalizedLabel() { + return nonLocalizedLabel; + } + + @NonNull + @Override + public List getOriginalPackages() { + return originalPackages; + } + + @Nullable + @Override + public String getOverlayCategory() { + return overlayCategory; + } + + @Override + public int getOverlayPriority() { + return overlayPriority; + } + + @Nullable + @Override + public String getOverlayTarget() { + return overlayTarget; + } + + @Nullable + @Override + public String getOverlayTargetOverlayableName() { + return overlayTargetOverlayableName; + } + + @NonNull + @Override + public Map getOverlayables() { + return overlayables; + } + + @NonNull + @Override + public String getPackageName() { + return packageName; + } + + @NonNull + @Override + public String getPath() { + return mPath; + } + + @Nullable + @Override + public String getPermission() { + return permission; + } + + @NonNull + @Override + public List getPermissionGroups() { + return permissionGroups; + } + + @NonNull + @Override + public List getPermissions() { + return permissions; + } + + @NonNull + @Override + public List> getPreferredActivityFilters() { + return preferredActivityFilters; + } + + @NonNull + @Override + public String getProcessName() { + return processName != null ? processName : packageName; + } + + @NonNull + @Override + public Map getProcesses() { + return processes; + } + + @NonNull + @Override + public Map getProperties() { + return mProperties; + } + + @NonNull + @Override + public List getProtectedBroadcasts() { + return protectedBroadcasts; + } + + @NonNull + @Override + public List getProviders() { + return providers; + } + + @NonNull + @Override + public List getQueriesIntents() { + return queriesIntents; + } + + @NonNull + @Override + public List getQueriesPackages() { + return queriesPackages; + } + + @NonNull + @Override + public Set getQueriesProviders() { + return queriesProviders; + } + + @NonNull + @Override + public List getReceivers() { + return receivers; + } + + @NonNull + @Override + public List getRequestedFeatures() { + return reqFeatures; + } + + /** + * @deprecated consider migrating to {@link #getUsesPermissions} which has + * more parsed details, such as flags + */ + @NonNull + @Override + @Deprecated + public List getRequestedPermissions() { + return requestedPermissions; + } + + @Nullable + @Override + public String getRequiredAccountType() { + return requiredAccountType; + } + + @Override + public int getRequiresSmallestWidthDp() { + return requiresSmallestWidthDp; + } + + /** + * @see ParsingPackageRead#getResizeableActivity() + */ + @Nullable + @Override + public Boolean getResizeableActivity() { + return resizeableActivity; + } + + @Nullable + @Override + public byte[] getRestrictUpdateHash() { + return restrictUpdateHash; + } + + @Nullable + @Override + public String getRestrictedAccountType() { + return restrictedAccountType; + } + + @Override + public int getRoundIconRes() { + return roundIconRes; + } + + @Nullable + @Override + public String getSdkLibName() { + return sdkLibName; + } + + @Override + public int getSdkLibVersionMajor() { + return sdkLibVersionMajor; + } + + @NonNull + @Override + public List getServices() { + return services; + } + + @Nullable + @Override + public String getSharedUserId() { + return sharedUserId; + } + + @Override + public int getSharedUserLabel() { + return sharedUserLabel; + } + + @NonNull + @Override + public SigningDetails getSigningDetails() { + return signingDetails; + } + + @NonNull + @Override + public String[] getSplitClassLoaderNames() { + return splitClassLoaderNames == null ? EmptyArray.STRING : splitClassLoaderNames; + } + + @NonNull + @Override + public String[] getSplitCodePaths() { + return splitCodePaths == null ? EmptyArray.STRING : splitCodePaths; + } + + @Nullable + @Override + public SparseArray getSplitDependencies() { + return splitDependencies == null ? EMPTY_INT_ARRAY_SPARSE_ARRAY : splitDependencies; + } + + @Nullable + @Override + public int[] getSplitFlags() { + return splitFlags; + } + + @NonNull + @Override + public String[] getSplitNames() { + return splitNames == null ? EmptyArray.STRING : splitNames; + } + + @NonNull + @Override + public int[] getSplitRevisionCodes() { + return splitRevisionCodes == null ? EmptyArray.INT : splitRevisionCodes; + } + + @Nullable + @Override + public String getStaticSharedLibName() { + return staticSharedLibName; + } + + @Override + public long getStaticSharedLibVersion() { + return staticSharedLibVersion; + } + + @Override + public int getTargetSandboxVersion() { + return targetSandboxVersion; + } + + @Override + public int getTargetSdkVersion() { + return targetSdkVersion; + } + + @Nullable + @Override + public String getTaskAffinity() { + return taskAffinity; + } + + @Override + public int getTheme() { + return theme; + } + + @Override + public int getUiOptions() { + return uiOptions; + } + + @NonNull + @Override + public Set getUpgradeKeySets() { + return upgradeKeySets; + } + + @NonNull + @Override + public List getUsesLibraries() { + return usesLibraries; + } + + @NonNull + @Override + public List getUsesNativeLibraries() { + return usesNativeLibraries; + } + + @NonNull + @Override + public List getUsesOptionalLibraries() { + return usesOptionalLibraries; + } + + @NonNull + @Override + public List getUsesOptionalNativeLibraries() { + return usesOptionalNativeLibraries; + } + + @NonNull + @Override + public List getUsesPermissions() { + return usesPermissions; + } + + @NonNull + @Override + public List getUsesSdkLibraries() { return usesSdkLibraries; } + + @Nullable + @Override + public String[][] getUsesSdkLibrariesCertDigests() { return usesSdkLibrariesCertDigests; } + + @Nullable + @Override + public long[] getUsesSdkLibrariesVersionsMajor() { return usesSdkLibrariesVersionsMajor; } + + @NonNull + @Override + public List getUsesStaticLibraries() { + return usesStaticLibraries; + } + + @Nullable + @Override + public String[][] getUsesStaticLibrariesCertDigests() { + return usesStaticLibrariesCertDigests; + } + + @Nullable + @Override + public long[] getUsesStaticLibrariesVersions() { + return usesStaticLibrariesVersions; + } + + @Override + public int getVersionCode() { + return versionCode; + } + + @Override + public int getVersionCodeMajor() { + return versionCodeMajor; + } + + @Nullable + @Override + public String getVersionName() { + return versionName; + } + + @Nullable + @Override + public String getVolumeUuid() { + return volumeUuid; + } + + @Nullable + @Override + public String getZygotePreloadName() { + return zygotePreloadName; + } + + @Override + public boolean hasPreserveLegacyExternalStorage() { + return getBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE); + } + + @Override + public boolean hasRequestForegroundServiceExemption() { + return getBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION); + } + + @Nullable + @Override + public Boolean hasRequestRawExternalStorageAccess() { + return requestRawExternalStorageAccess; + } + + @Override + public boolean isAllowAudioPlaybackCapture() { + return getBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE); + } + + @Override + public boolean isAllowBackup() { + return getBoolean(Booleans.ALLOW_BACKUP); + } + + @Override + public boolean isAllowClearUserData() { + return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA); + } + + @Override + public boolean isAllowClearUserDataOnFailedRestore() { + return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE); + } + + @Override + public boolean isAllowNativeHeapPointerTagging() { + return getBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING); + } + + @Override + public boolean isAllowTaskReparenting() { + return getBoolean(Booleans.ALLOW_TASK_REPARENTING); + } + + public boolean isAnyDensity() { + if (anyDensity == null) { + return targetSdkVersion >= Build.VERSION_CODES.DONUT; + } + + return anyDensity; + } + + @Override + public boolean isBackupInForeground() { + return getBoolean(Booleans.BACKUP_IN_FOREGROUND); + } + + @Override + public boolean isBaseHardwareAccelerated() { + return getBoolean(Booleans.BASE_HARDWARE_ACCELERATED); + } + + @Override + public boolean isCantSaveState() { + return getBoolean(Booleans.CANT_SAVE_STATE); + } + + @Override + public boolean isCrossProfile() { + return getBoolean(Booleans.CROSS_PROFILE); + } + + @Override + public boolean isDebuggable() { + return getBoolean(Booleans.DEBUGGABLE); + } + + @Override + public boolean isDefaultToDeviceProtectedStorage() { + return getBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE); + } + + @Override + public boolean isDirectBootAware() { + return getBoolean(Booleans.DIRECT_BOOT_AWARE); + } + + @Override + public boolean isEnabled() { + return getBoolean(Booleans.ENABLED); + } + + @Override + public boolean isExternalStorage() { + return getBoolean(Booleans.EXTERNAL_STORAGE); + } + + @Override + public boolean isExtractNativeLibs() { + return getBoolean(Booleans.EXTRACT_NATIVE_LIBS); + } + + @Override + public boolean isForceQueryable() { + return getBoolean(Booleans.FORCE_QUERYABLE); + } + + @Override + public boolean isFullBackupOnly() { + return getBoolean(Booleans.FULL_BACKUP_ONLY); + } + + @Override + public boolean isGame() { + return getBoolean(Booleans.GAME); + } + + @Override + public boolean isHasCode() { + return getBoolean(Booleans.HAS_CODE); + } + + @Override + public boolean isHasDomainUrls() { + return getBoolean(Booleans.HAS_DOMAIN_URLS); + } + + @Override + public boolean isHasFragileUserData() { + return getBoolean(Booleans.HAS_FRAGILE_USER_DATA); + } + + @Override + public boolean isIsolatedSplitLoading() { + return getBoolean(Booleans.ISOLATED_SPLIT_LOADING); + } + + @Override + public boolean isKillAfterRestore() { + return getBoolean(Booleans.KILL_AFTER_RESTORE); + } + + @Override + public boolean isLargeHeap() { + return getBoolean(Booleans.LARGE_HEAP); + } + + @Override + public boolean isLeavingSharedUid() { + return getBoolean(Booleans.LEAVING_SHARED_UID); + } + + @Override + public boolean isMultiArch() { + return getBoolean(Booleans.MULTI_ARCH); + } + + @Override + public boolean isOnBackInvokedCallbackEnabled() { + return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK); + } + + @Override + public boolean isOverlay() { + return getBoolean(Booleans.OVERLAY); + } + + @Override + public boolean isOverlayIsStatic() { + return getBoolean(Booleans.OVERLAY_IS_STATIC); + } + + @Override + public boolean isPartiallyDirectBootAware() { + return getBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE); + } + + @Override + public boolean isPersistent() { + return getBoolean(Booleans.PERSISTENT); + } + + @Override + public boolean isProfileable() { + return !getBoolean(Booleans.DISALLOW_PROFILING); + } + + @Override + public boolean isProfileableByShell() { + return isProfileable() && getBoolean(Booleans.PROFILEABLE_BY_SHELL); + } + + @Override + public boolean isRequestLegacyExternalStorage() { + return getBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE); + } + + @Override + public boolean isRequiredForAllUsers() { + return getBoolean(Booleans.REQUIRED_FOR_ALL_USERS); + } + + @Override + public boolean isResetEnabledSettingsOnAppDataCleared() { + return getBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED); + } + + public boolean isResizeable() { + if (resizeable == null) { + return targetSdkVersion >= Build.VERSION_CODES.DONUT; + } + + return resizeable; + } + + @Override + public boolean isResizeableActivityViaSdkVersion() { + return getBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION); + } + + @Override + public boolean isRestoreAnyVersion() { + return getBoolean(Booleans.RESTORE_ANY_VERSION); + } + + @Override + public boolean isSdkLibrary() { + return getBoolean(Booleans.SDK_LIBRARY); + } + + @Override + public boolean isStaticSharedLibrary() { + return getBoolean(Booleans.STATIC_SHARED_LIBRARY); + } + + public boolean isSupportsExtraLargeScreens() { + if (supportsExtraLargeScreens == null) { + return targetSdkVersion >= Build.VERSION_CODES.GINGERBREAD; + } + + return supportsExtraLargeScreens; + } + + public boolean isSupportsLargeScreens() { + if (supportsLargeScreens == null) { + return targetSdkVersion >= Build.VERSION_CODES.DONUT; + } + + return supportsLargeScreens; + } + + public boolean isSupportsNormalScreens() { + return supportsNormalScreens == null || supportsNormalScreens; + } + + @Override + public boolean isSupportsRtl() { + return getBoolean(Booleans.SUPPORTS_RTL); + } + + public boolean isSupportsSmallScreens() { + if (supportsSmallScreens == null) { + return targetSdkVersion >= Build.VERSION_CODES.DONUT; + } + + return supportsSmallScreens; + } + + @Override + public boolean isTestOnly() { + return getBoolean(Booleans.TEST_ONLY); + } + + @Override + public boolean isUse32BitAbi() { + return getBoolean(Booleans.USE_32_BIT_ABI); + } + + @Override + public boolean isUseEmbeddedDex() { + return getBoolean(Booleans.USE_EMBEDDED_DEX); + } + + @Override + public boolean isUsesCleartextTraffic() { + return getBoolean(Booleans.USES_CLEARTEXT_TRAFFIC); + } + + @Override + public boolean isUsesNonSdkApi() { + return getBoolean(Booleans.USES_NON_SDK_API); + } + + @Override + public boolean isVisibleToInstantApps() { + return getBoolean(Booleans.VISIBLE_TO_INSTANT_APPS); + } + + @Override + public boolean isVmSafeMode() { + return getBoolean(Booleans.VM_SAFE_MODE); + } + + @Override public PackageImpl removeUsesOptionalNativeLibrary(String libraryName) { + this.usesOptionalNativeLibraries = CollectionUtils.remove(this.usesOptionalNativeLibraries, + libraryName); + return this; + } + + @Override + public PackageImpl setAllowAudioPlaybackCapture(boolean value) { + return setBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE, value); + } + + @Override + public PackageImpl setAllowBackup(boolean value) { + return setBoolean(Booleans.ALLOW_BACKUP, value); + } + + @Override + public PackageImpl setAllowClearUserData(boolean value) { + return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA, value); + } + + @Override + public PackageImpl setAllowClearUserDataOnFailedRestore(boolean value) { + return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, value); + } + + @Override + public PackageImpl setAllowNativeHeapPointerTagging(boolean value) { + return setBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING, value); + } + + @Override + public PackageImpl setAllowTaskReparenting(boolean value) { + return setBoolean(Booleans.ALLOW_TASK_REPARENTING, value); + } + + @Override + public PackageImpl setAnyDensity(int anyDensity) { + if (anyDensity == 1) { + return this; + } + + this.anyDensity = anyDensity < 0; + return this; + } + + @Override + public PackageImpl setAppComponentFactory(@Nullable String appComponentFactory) { + this.appComponentFactory = appComponentFactory; + return this; + } + + @Override + public ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible) { + setBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE, attributionsAreUserVisible); + return this; + } + + @Override + public PackageImpl setAutoRevokePermissions(int value) { + autoRevokePermissions = value; + return this; + } + + @Override + public PackageImpl setBackupAgentName(@Nullable String backupAgentName) { + this.backupAgentName = backupAgentName; + return this; + } + + @Override + public PackageImpl setBackupInForeground(boolean value) { + return setBoolean(Booleans.BACKUP_IN_FOREGROUND, value); + } + + @Override + public PackageImpl setBanner(int value) { + banner = value; + return this; + } + + @Override + public PackageImpl setBaseHardwareAccelerated(boolean value) { + return setBoolean(Booleans.BASE_HARDWARE_ACCELERATED, value); + } + + @Override + public PackageImpl setBaseRevisionCode(int value) { + baseRevisionCode = value; + return this; + } + + @Override + public PackageImpl setCantSaveState(boolean value) { + return setBoolean(Booleans.CANT_SAVE_STATE, value); + } + + @Override + public PackageImpl setCategory(int value) { + category = value; + return this; + } + + @Override + public PackageImpl setClassLoaderName(@Nullable String classLoaderName) { + this.classLoaderName = classLoaderName; + return this; + } + + @Override + public PackageImpl setClassName(@Nullable String className) { + this.className = className == null ? null : className.trim(); + return this; + } + + @Override + public PackageImpl setCompatibleWidthLimitDp(int value) { + compatibleWidthLimitDp = value; + return this; + } + + @Override + public PackageImpl setCompileSdkVersion(int value) { + compileSdkVersion = value; + return this; + } + + @Override + public ParsingPackage setCompileSdkVersionCodeName(String compileSdkVersionCodeName) { + this.compileSdkVersionCodeName = compileSdkVersionCodeName; + return this; + } + + @Override + public PackageImpl setCrossProfile(boolean value) { + return setBoolean(Booleans.CROSS_PROFILE, value); + } + + @Override + public PackageImpl setDataExtractionRules(int value) { + dataExtractionRules = value; + return this; + } + + @Override + public PackageImpl setDebuggable(boolean value) { + return setBoolean(Booleans.DEBUGGABLE, value); + } + + @Override + public PackageImpl setDescriptionRes(int value) { + descriptionRes = value; + return this; + } + + @Override + public PackageImpl setEnabled(boolean value) { + return setBoolean(Booleans.ENABLED, value); + } + + @Override + public PackageImpl setExternalStorage(boolean value) { + return setBoolean(Booleans.EXTERNAL_STORAGE, value); + } + + @Override + public PackageImpl setExtractNativeLibs(boolean value) { + return setBoolean(Booleans.EXTRACT_NATIVE_LIBS, value); + } + + @Override + public PackageImpl setForceQueryable(boolean value) { + return setBoolean(Booleans.FORCE_QUERYABLE, value); + } + + @Override + public PackageImpl setFullBackupContent(int value) { + fullBackupContent = value; + return this; + } + + @Override + public PackageImpl setFullBackupOnly(boolean value) { + return setBoolean(Booleans.FULL_BACKUP_ONLY, value); + } + + @Override + public PackageImpl setGame(boolean value) { + return setBoolean(Booleans.GAME, value); + } + + @Override + public PackageImpl setGwpAsanMode(@ApplicationInfo.GwpAsanMode int value) { + gwpAsanMode = value; + return this; + } + + @Override + public PackageImpl setHasCode(boolean value) { + return setBoolean(Booleans.HAS_CODE, value); + } + + @Override + public PackageImpl setHasDomainUrls(boolean value) { + return setBoolean(Booleans.HAS_DOMAIN_URLS, value); + } + + @Override + public PackageImpl setHasFragileUserData(boolean value) { + return setBoolean(Booleans.HAS_FRAGILE_USER_DATA, value); + } + + @Override + public PackageImpl setIconRes(int value) { + iconRes = value; + return this; + } + + @Override + public PackageImpl setInstallLocation(int value) { + installLocation = value; + return this; + } + + @Override + public PackageImpl setIsolatedSplitLoading(boolean value) { + return setBoolean(Booleans.ISOLATED_SPLIT_LOADING, value); + } + + @Override + public PackageImpl setKillAfterRestore(boolean value) { + return setBoolean(Booleans.KILL_AFTER_RESTORE, value); + } + + @Override + public ParsingPackage setKnownActivityEmbeddingCerts( + @Nullable Set knownEmbeddingCerts) { + mKnownActivityEmbeddingCerts = knownEmbeddingCerts; + return this; + } + + @Override + public PackageImpl setLabelRes(int value) { + labelRes = value; + return this; + } + + @Override + public PackageImpl setLargeHeap(boolean value) { + return setBoolean(Booleans.LARGE_HEAP, value); + } + + @Override + public PackageImpl setLargestWidthLimitDp(int value) { + largestWidthLimitDp = value; + return this; + } + + @Override + public PackageImpl setLeavingSharedUid(boolean value) { + return setBoolean(Booleans.LEAVING_SHARED_UID, value); + } + + @Override + public PackageImpl setLocaleConfigRes(int value) { + mLocaleConfigRes = value; + return this; + } + + @Override + public PackageImpl setLogo(int value) { + logo = value; + return this; + } + + @Override + public PackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) { + this.manageSpaceActivityName = manageSpaceActivityName; + return this; + } + + @Override + public PackageImpl setMaxAspectRatio(float value) { + maxAspectRatio = value; + return this; + } + + @Override + public PackageImpl setMaxSdkVersion(int value) { + maxSdkVersion = value; + return this; + } + + @Override + public PackageImpl setMemtagMode(@ApplicationInfo.MemtagMode int value) { + memtagMode = value; + return this; + } + + @Override + public PackageImpl setMetaData(@Nullable Bundle value) { + metaData = value; + return this; + } + + @Override + public PackageImpl setMinAspectRatio(float value) { + minAspectRatio = value; + return this; + } + + @Override + public PackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) { + minExtensionVersions = value; + return this; + } + + @Override + public PackageImpl setMinSdkVersion(int value) { + minSdkVersion = value; + return this; + } + + @Override + public PackageImpl setMultiArch(boolean value) { + return setBoolean(Booleans.MULTI_ARCH, value); + } + + @Override + public PackageImpl setNativeHeapZeroInitialized( + @ApplicationInfo.NativeHeapZeroInitialized int value) { + nativeHeapZeroInitialized = value; + return this; + } + + @Override + public PackageImpl setNetworkSecurityConfigRes(int value) { + networkSecurityConfigRes = value; + return this; + } + + @Override + public PackageImpl setNonLocalizedLabel(@Nullable CharSequence value) { + nonLocalizedLabel = value == null ? null : value.toString().trim(); + return this; + } + + @Override + public ParsingPackage setOnBackInvokedCallbackEnabled(boolean value) { + setBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK, value); + return this; + } + + @Override + public PackageImpl setOverlay(boolean value) { + return setBoolean(Booleans.OVERLAY, value); + } + + @Override + public PackageImpl setOverlayCategory(@Nullable String overlayCategory) { + this.overlayCategory = overlayCategory; + return this; + } + + @Override + public PackageImpl setOverlayIsStatic(boolean value) { + return setBoolean(Booleans.OVERLAY_IS_STATIC, value); + } + + @Override + public PackageImpl setOverlayPriority(int value) { + overlayPriority = value; + return this; + } + + @Override + public PackageImpl setOverlayTarget(@Nullable String overlayTarget) { + this.overlayTarget = TextUtils.safeIntern(overlayTarget); + return this; + } + + @Override + public PackageImpl setOverlayTargetOverlayableName( + @Nullable String overlayTargetOverlayableName) { + this.overlayTargetOverlayableName = overlayTargetOverlayableName; + return this; + } + + @Override + public PackageImpl setPartiallyDirectBootAware(boolean value) { + return setBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE, value); + } + + @Override + public PackageImpl setPermission(@Nullable String permission) { + this.permission = permission; + return this; + } + + @Override + public PackageImpl setPreserveLegacyExternalStorage(boolean value) { + return setBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE, value); + } + + @Override + public PackageImpl setProcessName(String processName) { + this.processName = processName; + return this; + } + + @Override + public PackageImpl setProcesses(@NonNull Map value) { + processes = value; + return this; + } + + @Override + public PackageImpl setProfileable(boolean value) { + return setBoolean(Booleans.DISALLOW_PROFILING, !value); + } + + @Override + public PackageImpl setProfileableByShell(boolean value) { + return setBoolean(Booleans.PROFILEABLE_BY_SHELL, value); + } + + @Override + public PackageImpl setRequestForegroundServiceExemption(boolean value) { + return setBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION, value); + } + + @Override + public PackageImpl setRequestLegacyExternalStorage(boolean value) { + return setBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE, value); + } + + @Override + public PackageImpl setRequestRawExternalStorageAccess(@Nullable Boolean value) { + requestRawExternalStorageAccess = value; + return this; + } + + @Override + public PackageImpl setRequiredAccountType(@Nullable String requiredAccountType) { + this.requiredAccountType = TextUtils.nullIfEmpty(requiredAccountType); + return this; + } + + @Override + public PackageImpl setRequiredForAllUsers(boolean value) { + return setBoolean(Booleans.REQUIRED_FOR_ALL_USERS, value); + } + + @Override + public PackageImpl setRequiresSmallestWidthDp(int value) { + requiresSmallestWidthDp = value; + return this; + } + + @Override + public ParsingPackage setResetEnabledSettingsOnAppDataCleared( + boolean resetEnabledSettingsOnAppDataCleared) { + setBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED, + resetEnabledSettingsOnAppDataCleared); + return this; + } + + @Override + public PackageImpl setResizeable(int resizeable) { + if (resizeable == 1) { + return this; + } + + this.resizeable = resizeable < 0; + return this; + } + + /** + * @see ParsingPackageRead#getResizeableActivity() + */ + @Override + public PackageImpl setResizeableActivity(@Nullable Boolean value) { + resizeableActivity = value; + return this; + } + + @Override + public PackageImpl setResizeableActivityViaSdkVersion(boolean value) { + return setBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION, value); + } + + @Override + public PackageImpl setRestoreAnyVersion(boolean value) { + return setBoolean(Booleans.RESTORE_ANY_VERSION, value); + } + + @Override + public PackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) { + this.restrictedAccountType = restrictedAccountType; + return this; + } + + @Override + public PackageImpl setRoundIconRes(int value) { + roundIconRes = value; + return this; + } + + @Override + public PackageImpl setSdkLibName(String sdkLibName) { + this.sdkLibName = TextUtils.safeIntern(sdkLibName); + return this; + } + + @Override + public PackageImpl setSdkLibVersionMajor(int sdkLibVersionMajor) { + this.sdkLibVersionMajor = sdkLibVersionMajor; + return this; + } + + @Override + public PackageImpl setSdkLibrary(boolean value) { + return setBoolean(Booleans.SDK_LIBRARY, value); + } + + @Override + public PackageImpl setSharedUserId(String sharedUserId) { + this.sharedUserId = TextUtils.safeIntern(sharedUserId); + return this; + } + + @Override + public PackageImpl setSharedUserLabel(int value) { + sharedUserLabel = value; + return this; + } + + @Override + public PackageImpl setSplitClassLoaderName(int splitIndex, String classLoaderName) { + this.splitClassLoaderNames[splitIndex] = classLoaderName; + return this; + } + + @Override + public PackageImpl setSplitHasCode(int splitIndex, boolean splitHasCode) { + this.splitFlags[splitIndex] = splitHasCode + ? this.splitFlags[splitIndex] | ApplicationInfo.FLAG_HAS_CODE + : this.splitFlags[splitIndex] & ~ApplicationInfo.FLAG_HAS_CODE; + return this; + } + + @Override + public PackageImpl setStaticSharedLibName(String staticSharedLibName) { + this.staticSharedLibName = TextUtils.safeIntern(staticSharedLibName); + return this; + } + + @Override + public PackageImpl setStaticSharedLibVersion(long value) { + staticSharedLibVersion = value; + return this; + } + + @Override + public PackageImpl setStaticSharedLibrary(boolean value) { + return setBoolean(Booleans.STATIC_SHARED_LIBRARY, value); + } + + @Override + public PackageImpl setSupportsExtraLargeScreens(int supportsExtraLargeScreens) { + if (supportsExtraLargeScreens == 1) { + return this; + } + + this.supportsExtraLargeScreens = supportsExtraLargeScreens < 0; + return this; + } + + @Override + public PackageImpl setSupportsLargeScreens(int supportsLargeScreens) { + if (supportsLargeScreens == 1) { + return this; + } + + this.supportsLargeScreens = supportsLargeScreens < 0; + return this; + } + + @Override + public PackageImpl setSupportsNormalScreens(int supportsNormalScreens) { + if (supportsNormalScreens == 1) { + return this; + } + + this.supportsNormalScreens = supportsNormalScreens < 0; + return this; + } + + @Override + public PackageImpl setSupportsRtl(boolean value) { + return setBoolean(Booleans.SUPPORTS_RTL, value); + } + + @Override + public PackageImpl setSupportsSmallScreens(int supportsSmallScreens) { + if (supportsSmallScreens == 1) { + return this; + } + + this.supportsSmallScreens = supportsSmallScreens < 0; + return this; + } + + @Override + public PackageImpl setTargetSandboxVersion(int value) { + targetSandboxVersion = value; + return this; + } + + @Override + public PackageImpl setTargetSdkVersion(int value) { + targetSdkVersion = value; + return this; + } + + @Override + public PackageImpl setTaskAffinity(@Nullable String taskAffinity) { + this.taskAffinity = taskAffinity; + return this; + } + + @Override + public PackageImpl setTestOnly(boolean value) { + return setBoolean(Booleans.TEST_ONLY, value); + } + + @Override + public PackageImpl setTheme(int value) { + theme = value; + return this; + } + + @Override + public PackageImpl setUiOptions(int value) { + uiOptions = value; + return this; + } + + @Override + public PackageImpl setUpgradeKeySets(@NonNull Set value) { + upgradeKeySets = value; + return this; + } + + @Override + public PackageImpl setUse32BitAbi(boolean value) { + return setBoolean(Booleans.USE_32_BIT_ABI, value); + } + + @Override + public PackageImpl setUseEmbeddedDex(boolean value) { + return setBoolean(Booleans.USE_EMBEDDED_DEX, value); + } + + @Override + public PackageImpl setUsesCleartextTraffic(boolean value) { + return setBoolean(Booleans.USES_CLEARTEXT_TRAFFIC, value); + } + + @Override + public PackageImpl setUsesNonSdkApi(boolean value) { + return setBoolean(Booleans.USES_NON_SDK_API, value); + } + + @Override + public PackageImpl setVersionName(String versionName) { + this.versionName = versionName; + return this; + } + + @Override + public PackageImpl setVisibleToInstantApps(boolean value) { + return setBoolean(Booleans.VISIBLE_TO_INSTANT_APPS, value); + } + + @Override + public PackageImpl setVmSafeMode(boolean value) { + return setBoolean(Booleans.VM_SAFE_MODE, value); + } + + @Override + public PackageImpl setVolumeUuid(@Nullable String volumeUuid) { + this.volumeUuid = TextUtils.safeIntern(volumeUuid); + return this; + } + + @Override + public PackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) { + this.zygotePreloadName = zygotePreloadName; + return this; + } + + @Override + public PackageImpl sortActivities() { + Collections.sort(this.activities, ORDER_COMPARATOR); + return this; + } + + @Override + public PackageImpl sortReceivers() { + Collections.sort(this.receivers, ORDER_COMPARATOR); + return this; + } + + @Override + public PackageImpl sortServices() { + Collections.sort(this.services, ORDER_COMPARATOR); + return this; + } + + public ApplicationInfo toAppInfoWithoutStateWithoutFlags() { + ApplicationInfo appInfo = new ApplicationInfo(); + + // Lines that are commented below are state related and should not be assigned here. + // They are left in as placeholders, since there is no good backwards compatible way to + // separate these. + appInfo.appComponentFactory = appComponentFactory; + appInfo.backupAgentName = backupAgentName; + appInfo.banner = banner; + appInfo.category = category; + appInfo.classLoaderName = classLoaderName; + appInfo.className = className; + appInfo.compatibleWidthLimitDp = compatibleWidthLimitDp; + appInfo.compileSdkVersion = compileSdkVersion; + appInfo.compileSdkVersionCodename = compileSdkVersionCodeName; +// appInfo.credentialProtectedDataDir + appInfo.crossProfile = isCrossProfile(); +// appInfo.dataDir + appInfo.descriptionRes = descriptionRes; +// appInfo.deviceProtectedDataDir + appInfo.enabled = getBoolean(Booleans.ENABLED); +// appInfo.enabledSetting + appInfo.fullBackupContent = fullBackupContent; + appInfo.dataExtractionRulesRes = dataExtractionRules; + // TODO(b/135203078): See PackageImpl#getHiddenApiEnforcementPolicy +// appInfo.mHiddenApiPolicy +// appInfo.hiddenUntilInstalled + appInfo.icon = + (ParsingPackageUtils.sUseRoundIcon && roundIconRes != 0) ? roundIconRes : iconRes; + appInfo.iconRes = iconRes; + appInfo.roundIconRes = roundIconRes; + appInfo.installLocation = installLocation; + appInfo.labelRes = labelRes; + appInfo.largestWidthLimitDp = largestWidthLimitDp; + appInfo.logo = logo; + appInfo.manageSpaceActivityName = manageSpaceActivityName; + appInfo.maxAspectRatio = maxAspectRatio; + appInfo.metaData = metaData; + appInfo.minAspectRatio = minAspectRatio; + appInfo.minSdkVersion = minSdkVersion; + appInfo.name = className; +// appInfo.nativeLibraryDir +// appInfo.nativeLibraryRootDir +// appInfo.nativeLibraryRootRequiresIsa + appInfo.networkSecurityConfigRes = networkSecurityConfigRes; + appInfo.nonLocalizedLabel = nonLocalizedLabel; + appInfo.packageName = packageName; + appInfo.permission = permission; +// appInfo.primaryCpuAbi + appInfo.processName = getProcessName(); + appInfo.requiresSmallestWidthDp = requiresSmallestWidthDp; +// appInfo.resourceDirs +// appInfo.secondaryCpuAbi +// appInfo.secondaryNativeLibraryDir +// appInfo.seInfo +// appInfo.seInfoUser +// appInfo.sharedLibraryFiles +// appInfo.sharedLibraryInfos +// appInfo.showUserIcon + appInfo.splitClassLoaderNames = splitClassLoaderNames; + appInfo.splitDependencies = (splitDependencies == null || splitDependencies.size() == 0) + ? null : splitDependencies; + appInfo.splitNames = splitNames; + appInfo.storageUuid = mStorageUuid; + appInfo.targetSandboxVersion = targetSandboxVersion; + appInfo.targetSdkVersion = targetSdkVersion; + appInfo.taskAffinity = taskAffinity; + appInfo.theme = theme; +// appInfo.uid + appInfo.uiOptions = uiOptions; + appInfo.volumeUuid = volumeUuid; + appInfo.zygotePreloadName = zygotePreloadName; + appInfo.setGwpAsanMode(gwpAsanMode); + appInfo.setMemtagMode(memtagMode); + appInfo.setNativeHeapZeroInitialized(nativeHeapZeroInitialized); + appInfo.setRequestRawExternalStorageAccess(requestRawExternalStorageAccess); + appInfo.setBaseCodePath(mBaseApkPath); + appInfo.setBaseResourcePath(mBaseApkPath); + appInfo.setCodePath(mPath); + appInfo.setResourcePath(mPath); + appInfo.setSplitCodePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths); + appInfo.setSplitResourcePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths); + appInfo.setVersionCode(mLongVersionCode); + appInfo.setAppClassNamesByProcess(buildAppClassNamesByProcess()); + appInfo.setLocaleConfigRes(mLocaleConfigRes); + if (mKnownActivityEmbeddingCerts != null) { + appInfo.setKnownActivityEmbeddingCerts(mKnownActivityEmbeddingCerts); + } + + return appInfo; + } + + private PackageImpl setBoolean(@Booleans.Flags long flag, boolean value) { if (value) { mBooleans |= flag; } else { @@ -173,10 +2535,23 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An return this; } - private boolean getBoolean(@Booleans.Flags int flag) { + private boolean getBoolean(@Booleans.Flags long flag) { return (mBooleans & flag) != 0; } + private PackageImpl setBoolean2(@Booleans2.Flags long flag, boolean value) { + if (value) { + mBooleans2 |= flag; + } else { + mBooleans2 &= ~flag; + } + return this; + } + + private boolean getBoolean2(@Booleans2.Flags long flag) { + return (mBooleans2 & flag) != 0; + } + // Derived fields private int mBaseAppInfoFlags; private int mBaseAppInfoPrivateFlags; @@ -187,14 +2562,35 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @VisibleForTesting public PackageImpl(@NonNull String packageName, @NonNull String baseApkPath, @NonNull String path, @Nullable TypedArray manifestArray, boolean isCoreApp) { - super(packageName, baseApkPath, path, manifestArray); + this.packageName = TextUtils.safeIntern(packageName); + this.mBaseApkPath = baseApkPath; + this.mPath = path; + + if (manifestArray != null) { + versionCode = manifestArray.getInteger(R.styleable.AndroidManifest_versionCode, 0); + versionCodeMajor = manifestArray.getInteger( + R.styleable.AndroidManifest_versionCodeMajor, 0); + setBaseRevisionCode( + manifestArray.getInteger(R.styleable.AndroidManifest_revisionCode, 0)); + setVersionName(manifestArray.getNonConfigurationString( + R.styleable.AndroidManifest_versionName, 0)); + + setCompileSdkVersion(manifestArray.getInteger( + R.styleable.AndroidManifest_compileSdkVersion, 0)); + setCompileSdkVersionCodeName(manifestArray.getNonConfigurationString( + R.styleable.AndroidManifest_compileSdkVersionCodename, 0)); + + setIsolatedSplitLoading(manifestArray.getBoolean( + R.styleable.AndroidManifest_isolatedSplits, false)); + + } this.manifestPackageName = this.packageName; setBoolean(Booleans.CORE_APP, isCoreApp); } @Override - public ParsedPackage hideAsParsed() { - super.assignDerivedFields(); + public PackageImpl hideAsParsed() { + assignDerivedFields(); return this; } @@ -253,37 +2649,38 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public PackageImpl removeUsesOptionalLibrary(String libraryName) { - super.removeUsesOptionalLibrary(libraryName); + this.usesOptionalLibraries = CollectionUtils.remove(this.usesOptionalLibraries, + libraryName); return this; } @Override public PackageImpl setSigningDetails(@NonNull SigningDetails value) { - super.setSigningDetails(value); + signingDetails = value; return this; } @Override public PackageImpl setRestrictUpdateHash(@Nullable byte... value) { - super.setRestrictUpdateHash(value); + restrictUpdateHash = value; return this; } @Override public PackageImpl setPersistent(boolean value) { - super.setPersistent(value); + setBoolean(Booleans.PERSISTENT, value); return this; } @Override public PackageImpl setDefaultToDeviceProtectedStorage(boolean value) { - super.setDefaultToDeviceProtectedStorage(value); + setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE, value); return this; } @Override public PackageImpl setDirectBootAware(boolean value) { - super.setDirectBootAware(value); + setBoolean(Booleans.DIRECT_BOOT_AWARE, value); return this; } @@ -481,25 +2878,25 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An } @Override - public ParsedPackage setCoreApp(boolean coreApp) { + public PackageImpl setCoreApp(boolean coreApp) { return setBoolean(Booleans.CORE_APP, coreApp); } @Override - public ParsedPackage setVersionCode(int versionCode) { + public PackageImpl setVersionCode(int versionCode) { this.versionCode = versionCode; return this; } @Override - public ParsedPackage setVersionCodeMajor(int versionCodeMajor) { + public PackageImpl setVersionCodeMajor(int versionCodeMajor) { this.versionCodeMajor = versionCodeMajor; return this; } @Override public ApplicationInfo toAppInfoWithoutState() { - ApplicationInfo appInfo = super.toAppInfoWithoutStateWithoutFlags(); + ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags(); appInfo.flags = mBaseAppInfoFlags; appInfo.privateFlags = mBaseAppInfoPrivateFlags; appInfo.privateFlagsExt = mBaseAppInfoPrivateFlagsExt; @@ -522,7 +2919,140 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); + sForBoolean.parcel(this.supportsSmallScreens, dest, flags); + sForBoolean.parcel(this.supportsNormalScreens, dest, flags); + sForBoolean.parcel(this.supportsLargeScreens, dest, flags); + sForBoolean.parcel(this.supportsExtraLargeScreens, dest, flags); + sForBoolean.parcel(this.resizeable, dest, flags); + sForBoolean.parcel(this.anyDensity, dest, flags); + dest.writeInt(this.versionCode); + dest.writeInt(this.versionCodeMajor); + dest.writeInt(this.baseRevisionCode); + sForInternedString.parcel(this.versionName, dest, flags); + dest.writeInt(this.compileSdkVersion); + dest.writeString(this.compileSdkVersionCodeName); + sForInternedString.parcel(this.packageName, dest, flags); + dest.writeString(this.mBaseApkPath); + dest.writeString(this.restrictedAccountType); + dest.writeString(this.requiredAccountType); + sForInternedString.parcel(this.overlayTarget, dest, flags); + dest.writeString(this.overlayTargetOverlayableName); + dest.writeString(this.overlayCategory); + dest.writeInt(this.overlayPriority); + sForInternedStringValueMap.parcel(this.overlayables, dest, flags); + sForInternedString.parcel(this.sdkLibName, dest, flags); + dest.writeInt(this.sdkLibVersionMajor); + sForInternedString.parcel(this.staticSharedLibName, dest, flags); + dest.writeLong(this.staticSharedLibVersion); + sForInternedStringList.parcel(this.libraryNames, dest, flags); + sForInternedStringList.parcel(this.usesLibraries, dest, flags); + sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags); + sForInternedStringList.parcel(this.usesNativeLibraries, dest, flags); + sForInternedStringList.parcel(this.usesOptionalNativeLibraries, dest, flags); + + sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags); + dest.writeLongArray(this.usesStaticLibrariesVersions); + if (this.usesStaticLibrariesCertDigests == null) { + dest.writeInt(-1); + } else { + dest.writeInt(this.usesStaticLibrariesCertDigests.length); + for (int index = 0; index < this.usesStaticLibrariesCertDigests.length; index++) { + dest.writeStringArray(this.usesStaticLibrariesCertDigests[index]); + } + } + + sForInternedStringList.parcel(this.usesSdkLibraries, dest, flags); + dest.writeLongArray(this.usesSdkLibrariesVersionsMajor); + if (this.usesSdkLibrariesCertDigests == null) { + dest.writeInt(-1); + } else { + dest.writeInt(this.usesSdkLibrariesCertDigests.length); + for (int index = 0; index < this.usesSdkLibrariesCertDigests.length; index++) { + dest.writeStringArray(this.usesSdkLibrariesCertDigests[index]); + } + } + + sForInternedString.parcel(this.sharedUserId, dest, flags); + dest.writeInt(this.sharedUserLabel); + dest.writeTypedList(this.configPreferences); + dest.writeTypedList(this.reqFeatures); + dest.writeTypedList(this.featureGroups); + dest.writeByteArray(this.restrictUpdateHash); + dest.writeStringList(this.originalPackages); + sForInternedStringList.parcel(this.adoptPermissions, dest, flags); + sForInternedStringList.parcel(this.requestedPermissions, dest, flags); + ParsingUtils.writeParcelableList(dest, this.usesPermissions); + sForInternedStringList.parcel(this.implicitPermissions, dest, flags); + sForStringSet.parcel(this.upgradeKeySets, dest, flags); + ParsingPackageUtils.writeKeySetMapping(dest, this.keySetMapping); + sForInternedStringList.parcel(this.protectedBroadcasts, dest, flags); + ParsingUtils.writeParcelableList(dest, this.activities); + ParsingUtils.writeParcelableList(dest, this.apexSystemServices); + ParsingUtils.writeParcelableList(dest, this.receivers); + ParsingUtils.writeParcelableList(dest, this.services); + ParsingUtils.writeParcelableList(dest, this.providers); + ParsingUtils.writeParcelableList(dest, this.attributions); + ParsingUtils.writeParcelableList(dest, this.permissions); + ParsingUtils.writeParcelableList(dest, this.permissionGroups); + ParsingUtils.writeParcelableList(dest, this.instrumentations); + sForIntentInfoPairs.parcel(this.preferredActivityFilters, dest, flags); + dest.writeMap(this.processes); + dest.writeBundle(this.metaData); + sForInternedString.parcel(this.volumeUuid, dest, flags); + dest.writeParcelable(this.signingDetails, flags); + dest.writeString(this.mPath); + dest.writeTypedList(this.queriesIntents, flags); + sForInternedStringList.parcel(this.queriesPackages, dest, flags); + sForInternedStringSet.parcel(this.queriesProviders, dest, flags); + dest.writeString(this.appComponentFactory); + dest.writeString(this.backupAgentName); + dest.writeInt(this.banner); + dest.writeInt(this.category); + dest.writeString(this.classLoaderName); + dest.writeString(this.className); + dest.writeInt(this.compatibleWidthLimitDp); + dest.writeInt(this.descriptionRes); + dest.writeInt(this.fullBackupContent); + dest.writeInt(this.dataExtractionRules); + dest.writeInt(this.iconRes); + dest.writeInt(this.installLocation); + dest.writeInt(this.labelRes); + dest.writeInt(this.largestWidthLimitDp); + dest.writeInt(this.logo); + dest.writeString(this.manageSpaceActivityName); + dest.writeFloat(this.maxAspectRatio); + dest.writeFloat(this.minAspectRatio); + dest.writeInt(this.minSdkVersion); + dest.writeInt(this.maxSdkVersion); + dest.writeInt(this.networkSecurityConfigRes); + dest.writeCharSequence(this.nonLocalizedLabel); + dest.writeString(this.permission); + dest.writeString(this.processName); + dest.writeInt(this.requiresSmallestWidthDp); + dest.writeInt(this.roundIconRes); + dest.writeInt(this.targetSandboxVersion); + dest.writeInt(this.targetSdkVersion); + dest.writeString(this.taskAffinity); + dest.writeInt(this.theme); + dest.writeInt(this.uiOptions); + dest.writeString(this.zygotePreloadName); + dest.writeStringArray(this.splitClassLoaderNames); + dest.writeStringArray(this.splitCodePaths); + dest.writeSparseArray(this.splitDependencies); + dest.writeIntArray(this.splitFlags); + dest.writeStringArray(this.splitNames); + dest.writeIntArray(this.splitRevisionCodes); + sForBoolean.parcel(this.resizeableActivity, dest, flags); + dest.writeInt(this.autoRevokePermissions); + dest.writeArraySet(this.mimeGroups); + dest.writeInt(this.gwpAsanMode); + dest.writeSparseIntArray(this.minExtensionVersions); + dest.writeMap(this.mProperties); + dest.writeInt(this.memtagMode); + dest.writeInt(this.nativeHeapZeroInitialized); + sForBoolean.parcel(this.requestRawExternalStorageAccess, dest, flags); + dest.writeInt(this.mLocaleConfigRes); + sForStringSet.parcel(mKnownActivityEmbeddingCerts, dest, flags); sForInternedString.parcel(this.manifestPackageName, dest, flags); dest.writeString(this.nativeLibraryDir); dest.writeString(this.nativeLibraryRootDir); @@ -532,11 +3062,157 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An dest.writeString(this.secondaryNativeLibraryDir); dest.writeString(this.seInfo); dest.writeInt(this.uid); - dest.writeInt(this.mBooleans); + dest.writeLong(this.mBooleans); + dest.writeLong(this.mBooleans2); } public PackageImpl(Parcel in) { - super(in); + // We use the boot classloader for all classes that we load. + final ClassLoader boot = Object.class.getClassLoader(); + this.supportsSmallScreens = sForBoolean.unparcel(in); + this.supportsNormalScreens = sForBoolean.unparcel(in); + this.supportsLargeScreens = sForBoolean.unparcel(in); + this.supportsExtraLargeScreens = sForBoolean.unparcel(in); + this.resizeable = sForBoolean.unparcel(in); + this.anyDensity = sForBoolean.unparcel(in); + this.versionCode = in.readInt(); + this.versionCodeMajor = in.readInt(); + this.baseRevisionCode = in.readInt(); + this.versionName = sForInternedString.unparcel(in); + this.compileSdkVersion = in.readInt(); + this.compileSdkVersionCodeName = in.readString(); + this.packageName = sForInternedString.unparcel(in); + this.mBaseApkPath = in.readString(); + this.restrictedAccountType = in.readString(); + this.requiredAccountType = in.readString(); + this.overlayTarget = sForInternedString.unparcel(in); + this.overlayTargetOverlayableName = in.readString(); + this.overlayCategory = in.readString(); + this.overlayPriority = in.readInt(); + this.overlayables = sForInternedStringValueMap.unparcel(in); + this.sdkLibName = sForInternedString.unparcel(in); + this.sdkLibVersionMajor = in.readInt(); + this.staticSharedLibName = sForInternedString.unparcel(in); + this.staticSharedLibVersion = in.readLong(); + this.libraryNames = sForInternedStringList.unparcel(in); + this.usesLibraries = sForInternedStringList.unparcel(in); + this.usesOptionalLibraries = sForInternedStringList.unparcel(in); + this.usesNativeLibraries = sForInternedStringList.unparcel(in); + this.usesOptionalNativeLibraries = sForInternedStringList.unparcel(in); + + this.usesStaticLibraries = sForInternedStringList.unparcel(in); + this.usesStaticLibrariesVersions = in.createLongArray(); + { + int digestsSize = in.readInt(); + if (digestsSize >= 0) { + this.usesStaticLibrariesCertDigests = new String[digestsSize][]; + for (int index = 0; index < digestsSize; index++) { + this.usesStaticLibrariesCertDigests[index] = sForInternedStringArray.unparcel( + in); + } + } + } + + this.usesSdkLibraries = sForInternedStringList.unparcel(in); + this.usesSdkLibrariesVersionsMajor = in.createLongArray(); + { + int digestsSize = in.readInt(); + if (digestsSize >= 0) { + this.usesSdkLibrariesCertDigests = new String[digestsSize][]; + for (int index = 0; index < digestsSize; index++) { + this.usesSdkLibrariesCertDigests[index] = sForInternedStringArray.unparcel(in); + } + } + } + + this.sharedUserId = sForInternedString.unparcel(in); + this.sharedUserLabel = in.readInt(); + this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR); + this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR); + this.featureGroups = in.createTypedArrayList(FeatureGroupInfo.CREATOR); + this.restrictUpdateHash = in.createByteArray(); + this.originalPackages = in.createStringArrayList(); + this.adoptPermissions = sForInternedStringList.unparcel(in); + this.requestedPermissions = sForInternedStringList.unparcel(in); + this.usesPermissions = ParsingUtils.createTypedInterfaceList(in, + ParsedUsesPermissionImpl.CREATOR); + this.implicitPermissions = sForInternedStringList.unparcel(in); + this.upgradeKeySets = sForStringSet.unparcel(in); + this.keySetMapping = ParsingPackageUtils.readKeySetMapping(in); + this.protectedBroadcasts = sForInternedStringList.unparcel(in); + + this.activities = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR); + this.apexSystemServices = ParsingUtils.createTypedInterfaceList(in, + ParsedApexSystemServiceImpl.CREATOR); + this.receivers = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR); + this.services = ParsingUtils.createTypedInterfaceList(in, ParsedServiceImpl.CREATOR); + this.providers = ParsingUtils.createTypedInterfaceList(in, ParsedProviderImpl.CREATOR); + this.attributions = ParsingUtils.createTypedInterfaceList(in, + ParsedAttributionImpl.CREATOR); + this.permissions = ParsingUtils.createTypedInterfaceList(in, ParsedPermissionImpl.CREATOR); + this.permissionGroups = ParsingUtils.createTypedInterfaceList(in, + ParsedPermissionGroupImpl.CREATOR); + this.instrumentations = ParsingUtils.createTypedInterfaceList(in, + ParsedInstrumentationImpl.CREATOR); + this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in); + this.processes = in.readHashMap(ParsedProcess.class.getClassLoader()); + this.metaData = in.readBundle(boot); + this.volumeUuid = sForInternedString.unparcel(in); + this.signingDetails = in.readParcelable(boot, android.content.pm.SigningDetails.class); + this.mPath = in.readString(); + this.queriesIntents = in.createTypedArrayList(Intent.CREATOR); + this.queriesPackages = sForInternedStringList.unparcel(in); + this.queriesProviders = sForInternedStringSet.unparcel(in); + this.appComponentFactory = in.readString(); + this.backupAgentName = in.readString(); + this.banner = in.readInt(); + this.category = in.readInt(); + this.classLoaderName = in.readString(); + this.className = in.readString(); + this.compatibleWidthLimitDp = in.readInt(); + this.descriptionRes = in.readInt(); + this.fullBackupContent = in.readInt(); + this.dataExtractionRules = in.readInt(); + this.iconRes = in.readInt(); + this.installLocation = in.readInt(); + this.labelRes = in.readInt(); + this.largestWidthLimitDp = in.readInt(); + this.logo = in.readInt(); + this.manageSpaceActivityName = in.readString(); + this.maxAspectRatio = in.readFloat(); + this.minAspectRatio = in.readFloat(); + this.minSdkVersion = in.readInt(); + this.maxSdkVersion = in.readInt(); + this.networkSecurityConfigRes = in.readInt(); + this.nonLocalizedLabel = in.readCharSequence(); + this.permission = in.readString(); + this.processName = in.readString(); + this.requiresSmallestWidthDp = in.readInt(); + this.roundIconRes = in.readInt(); + this.targetSandboxVersion = in.readInt(); + this.targetSdkVersion = in.readInt(); + this.taskAffinity = in.readString(); + this.theme = in.readInt(); + this.uiOptions = in.readInt(); + this.zygotePreloadName = in.readString(); + this.splitClassLoaderNames = in.createStringArray(); + this.splitCodePaths = in.createStringArray(); + this.splitDependencies = in.readSparseArray(boot); + this.splitFlags = in.createIntArray(); + this.splitNames = in.createStringArray(); + this.splitRevisionCodes = in.createIntArray(); + this.resizeableActivity = sForBoolean.unparcel(in); + + this.autoRevokePermissions = in.readInt(); + this.mimeGroups = (ArraySet) in.readArraySet(boot); + this.gwpAsanMode = in.readInt(); + this.minExtensionVersions = in.readSparseIntArray(); + this.mProperties = in.readHashMap(boot); + this.memtagMode = in.readInt(); + this.nativeHeapZeroInitialized = in.readInt(); + this.requestRawExternalStorageAccess = sForBoolean.unparcel(in); + this.mLocaleConfigRes = in.readInt(); + this.mKnownActivityEmbeddingCerts = sForStringSet.unparcel(in); this.manifestPackageName = sForInternedString.unparcel(in); this.nativeLibraryDir = in.readString(); this.nativeLibraryRootDir = in.readString(); @@ -546,9 +3222,10 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An this.secondaryNativeLibraryDir = in.readString(); this.seInfo = in.readString(); this.uid = in.readInt(); - this.mBooleans = in.readInt(); + this.mBooleans = in.readLong(); + this.mBooleans2 = in.readLong(); - super.assignDerivedFields(); + assignDerivedFields(); assignDerivedFields2(); } @@ -572,7 +3249,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An } public boolean isStub() { - return getBoolean(Booleans.STUB); + return getBoolean2(Booleans2.STUB); } @Nullable @@ -633,7 +3310,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public boolean isApex() { - return getBoolean(Booleans.APEX); + return getBoolean2(Booleans2.APEX); } @Override @@ -681,7 +3358,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public PackageImpl setStub(boolean value) { - setBoolean(Booleans.STUB, value); + setBoolean2(Booleans2.STUB, value); return this; } @@ -705,7 +3382,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public PackageImpl setApex(boolean isApex) { - setBoolean(Booleans.APEX, isApex); + setBoolean2(Booleans2.APEX, isApex); return this; } @@ -767,4 +3444,151 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An public String getBaseAppDataDeviceProtectedDirForSystemUser() { return mBaseAppDataDeviceProtectedDirForSystemUser; } + + /** + * Flags used for a internal bitset. These flags should never be persisted or exposed outside + * of this class. It is expected that PackageCacher explicitly clears itself whenever the + * Parcelable implementation changes such that all these flags can be re-ordered or invalidated. + */ + private static class Booleans { + @LongDef({ + EXTERNAL_STORAGE, + BASE_HARDWARE_ACCELERATED, + ALLOW_BACKUP, + KILL_AFTER_RESTORE, + RESTORE_ANY_VERSION, + FULL_BACKUP_ONLY, + PERSISTENT, + DEBUGGABLE, + VM_SAFE_MODE, + HAS_CODE, + ALLOW_TASK_REPARENTING, + ALLOW_CLEAR_USER_DATA, + LARGE_HEAP, + USES_CLEARTEXT_TRAFFIC, + SUPPORTS_RTL, + TEST_ONLY, + MULTI_ARCH, + EXTRACT_NATIVE_LIBS, + GAME, + STATIC_SHARED_LIBRARY, + OVERLAY, + ISOLATED_SPLIT_LOADING, + HAS_DOMAIN_URLS, + PROFILEABLE_BY_SHELL, + BACKUP_IN_FOREGROUND, + USE_EMBEDDED_DEX, + DEFAULT_TO_DEVICE_PROTECTED_STORAGE, + DIRECT_BOOT_AWARE, + PARTIALLY_DIRECT_BOOT_AWARE, + RESIZEABLE_ACTIVITY_VIA_SDK_VERSION, + ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, + ALLOW_AUDIO_PLAYBACK_CAPTURE, + REQUEST_LEGACY_EXTERNAL_STORAGE, + USES_NON_SDK_API, + HAS_FRAGILE_USER_DATA, + CANT_SAVE_STATE, + ALLOW_NATIVE_HEAP_POINTER_TAGGING, + PRESERVE_LEGACY_EXTERNAL_STORAGE, + REQUIRED_FOR_ALL_USERS, + OVERLAY_IS_STATIC, + USE_32_BIT_ABI, + VISIBLE_TO_INSTANT_APPS, + FORCE_QUERYABLE, + CROSS_PROFILE, + ENABLED, + DISALLOW_PROFILING, + REQUEST_FOREGROUND_SERVICE_EXEMPTION, + ATTRIBUTIONS_ARE_USER_VISIBLE, + RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED, + SDK_LIBRARY, + CORE_APP, + SYSTEM, + FACTORY_TEST, + SYSTEM_EXT, + PRIVILEGED, + OEM, + VENDOR, + PRODUCT, + ODM, + SIGNED_WITH_PLATFORM_KEY, + NATIVE_LIBRARY_ROOT_REQUIRES_ISA, + }) + public @interface Flags {} + + private static final long EXTERNAL_STORAGE = 1L; + private static final long BASE_HARDWARE_ACCELERATED = 1L << 1; + private static final long ALLOW_BACKUP = 1L << 2; + private static final long KILL_AFTER_RESTORE = 1L << 3; + private static final long RESTORE_ANY_VERSION = 1L << 4; + private static final long FULL_BACKUP_ONLY = 1L << 5; + private static final long PERSISTENT = 1L << 6; + private static final long DEBUGGABLE = 1L << 7; + private static final long VM_SAFE_MODE = 1L << 8; + private static final long HAS_CODE = 1L << 9; + private static final long ALLOW_TASK_REPARENTING = 1L << 10; + private static final long ALLOW_CLEAR_USER_DATA = 1L << 11; + private static final long LARGE_HEAP = 1L << 12; + private static final long USES_CLEARTEXT_TRAFFIC = 1L << 13; + private static final long SUPPORTS_RTL = 1L << 14; + private static final long TEST_ONLY = 1L << 15; + private static final long MULTI_ARCH = 1L << 16; + private static final long EXTRACT_NATIVE_LIBS = 1L << 17; + private static final long GAME = 1L << 18; + private static final long STATIC_SHARED_LIBRARY = 1L << 19; + private static final long OVERLAY = 1L << 20; + private static final long ISOLATED_SPLIT_LOADING = 1L << 21; + private static final long HAS_DOMAIN_URLS = 1L << 22; + private static final long PROFILEABLE_BY_SHELL = 1L << 23; + private static final long BACKUP_IN_FOREGROUND = 1L << 24; + private static final long USE_EMBEDDED_DEX = 1L << 25; + private static final long DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1L << 26; + private static final long DIRECT_BOOT_AWARE = 1L << 27; + private static final long PARTIALLY_DIRECT_BOOT_AWARE = 1L << 28; + private static final long RESIZEABLE_ACTIVITY_VIA_SDK_VERSION = 1L << 29; + private static final long ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE = 1L << 30; + private static final long ALLOW_AUDIO_PLAYBACK_CAPTURE = 1L << 31; + private static final long REQUEST_LEGACY_EXTERNAL_STORAGE = 1L << 32; + private static final long USES_NON_SDK_API = 1L << 33; + private static final long HAS_FRAGILE_USER_DATA = 1L << 34; + private static final long CANT_SAVE_STATE = 1L << 35; + private static final long ALLOW_NATIVE_HEAP_POINTER_TAGGING = 1L << 36; + private static final long PRESERVE_LEGACY_EXTERNAL_STORAGE = 1L << 37; + private static final long REQUIRED_FOR_ALL_USERS = 1L << 38; + private static final long OVERLAY_IS_STATIC = 1L << 39; + private static final long USE_32_BIT_ABI = 1L << 40; + private static final long VISIBLE_TO_INSTANT_APPS = 1L << 41; + private static final long FORCE_QUERYABLE = 1L << 42; + private static final long CROSS_PROFILE = 1L << 43; + private static final long ENABLED = 1L << 44; + private static final long DISALLOW_PROFILING = 1L << 45; + private static final long REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1L << 46; + private static final long ATTRIBUTIONS_ARE_USER_VISIBLE = 1L << 47; + private static final long RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED = 1L << 48; + private static final long SDK_LIBRARY = 1L << 49; + private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 50; + private static final long LEAVING_SHARED_UID = 1L << 51; + private static final long CORE_APP = 1L << 52; + private static final long SYSTEM = 1L << 53; + private static final long FACTORY_TEST = 1L << 54; + private static final long SYSTEM_EXT = 1L << 56; + private static final long PRIVILEGED = 1L << 57; + private static final long OEM = 1L << 58; + private static final long VENDOR = 1L << 59; + private static final long PRODUCT = 1L << 60; + private static final long ODM = 1L << 61; + private static final long SIGNED_WITH_PLATFORM_KEY = 1L << 62; + private static final long NATIVE_LIBRARY_ROOT_REQUIRES_ISA = 1L << 63; + } + + private static class Booleans2 { + @LongDef({ + STUB, + APEX, + }) + public @interface Flags {} + + private static final long STUB = 1L; + private static final long APEX = 1L << 1; + } } diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedActivityImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedActivityImpl.java index acd5a813e32fb..aebe133cccd05 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedActivityImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedActivityImpl.java @@ -22,8 +22,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VER import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_UNSPECIFIED; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForStringSet; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForStringSet; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedComponentImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedComponentImpl.java index c1a4b2e76edbf..f8d678ee39ac9 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedComponentImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedComponentImpl.java @@ -16,7 +16,7 @@ package com.android.server.pm.pkg.component; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; import static java.util.Collections.emptyMap; diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedInstrumentationImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedInstrumentationImpl.java index 23ebdc8d5bf6e..8a0d356925d4a 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedInstrumentationImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedInstrumentationImpl.java @@ -16,7 +16,7 @@ package com.android.server.pm.pkg.component; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedMainComponentImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedMainComponentImpl.java index a2f2f93188731..c670e7c1b4f7c 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedMainComponentImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedMainComponentImpl.java @@ -16,7 +16,7 @@ package com.android.server.pm.pkg.component; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java index e77ecb3946d0b..6f4b4c84a07ea 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedProviderImpl.java @@ -16,7 +16,7 @@ package com.android.server.pm.pkg.component; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/pm/pkg/component/ParsedServiceImpl.java b/services/core/java/com/android/server/pm/pkg/component/ParsedServiceImpl.java index c00e01a032f5d..47e993cb02be0 100644 --- a/services/core/java/com/android/server/pm/pkg/component/ParsedServiceImpl.java +++ b/services/core/java/com/android/server/pm/pkg/component/ParsedServiceImpl.java @@ -16,7 +16,7 @@ package com.android.server.pm.pkg.component; -import static com.android.server.pm.pkg.parsing.ParsingPackageImpl.sForInternedString; +import static com.android.server.pm.parsing.pkg.PackageImpl.sForInternedString; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java index 66e01a6bfb09e..a7f0c97964e63 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java @@ -28,7 +28,7 @@ import android.content.pm.PackageInfo; * * @hide */ -interface ParsingPackageHidden { +public interface ParsingPackageHidden { /** * @see PackageInfo#versionCode diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java deleted file mode 100644 index ebb7365794184..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java +++ /dev/null @@ -1,2991 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; -import static java.util.Collections.emptySet; - -import android.annotation.LongDef; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ApplicationInfo; -import android.content.pm.ConfigurationInfo; -import android.content.pm.FeatureGroupInfo; -import android.content.pm.FeatureInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.Property; -import android.content.pm.SigningDetails; -import android.content.res.TypedArray; -import android.os.Build; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.storage.StorageManager; -import android.text.TextUtils; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.util.Pair; -import android.util.SparseArray; -import android.util.SparseIntArray; - -import com.android.internal.R; -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.ArrayUtils; -import com.android.internal.util.CollectionUtils; -import com.android.internal.util.DataClass; -import com.android.internal.util.Parcelling; -import com.android.internal.util.Parcelling.BuiltIn.ForBoolean; -import com.android.internal.util.Parcelling.BuiltIn.ForInternedString; -import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringArray; -import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringList; -import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringSet; -import com.android.internal.util.Parcelling.BuiltIn.ForInternedStringValueMap; -import com.android.internal.util.Parcelling.BuiltIn.ForStringSet; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedActivityImpl; -import com.android.server.pm.pkg.component.ParsedApexSystemService; -import com.android.server.pm.pkg.component.ParsedApexSystemServiceImpl; -import com.android.server.pm.pkg.component.ParsedAttribution; -import com.android.server.pm.pkg.component.ParsedAttributionImpl; -import com.android.server.pm.pkg.component.ParsedComponent; -import com.android.server.pm.pkg.component.ParsedInstrumentation; -import com.android.server.pm.pkg.component.ParsedInstrumentationImpl; -import com.android.server.pm.pkg.component.ParsedIntentInfo; -import com.android.server.pm.pkg.component.ParsedMainComponent; -import com.android.server.pm.pkg.component.ParsedPermission; -import com.android.server.pm.pkg.component.ParsedPermissionGroup; -import com.android.server.pm.pkg.component.ParsedPermissionGroupImpl; -import com.android.server.pm.pkg.component.ParsedPermissionImpl; -import com.android.server.pm.pkg.component.ParsedProcess; -import com.android.server.pm.pkg.component.ParsedProvider; -import com.android.server.pm.pkg.component.ParsedProviderImpl; -import com.android.server.pm.pkg.component.ParsedService; -import com.android.server.pm.pkg.component.ParsedServiceImpl; -import com.android.server.pm.pkg.component.ParsedUsesPermission; -import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; - -import libcore.util.EmptyArray; - -import java.security.PublicKey; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -/** - * The backing data for a package that was parsed from disk. - * - * The field nullability annotations here are for internal reference. For effective nullability, - * see the parent interfaces. - * - * TODO(b/135203078): Convert Lists used as sets into Sets, to better express intended use case - * - * @hide - */ -public abstract class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden, - Parcelable { - - private static final SparseArray EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>(); - public static ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class); - public static ForInternedString sForInternedString = Parcelling.Cache.getOrCreate( - ForInternedString.class); - public static ForInternedStringArray sForInternedStringArray = Parcelling.Cache.getOrCreate( - ForInternedStringArray.class); - public static ForInternedStringList sForInternedStringList = Parcelling.Cache.getOrCreate( - ForInternedStringList.class); - public static ForInternedStringValueMap sForInternedStringValueMap = - Parcelling.Cache.getOrCreate(ForInternedStringValueMap.class); - public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class); - public static ForInternedStringSet sForInternedStringSet = - Parcelling.Cache.getOrCreate(ForInternedStringSet.class); - protected static ParsingUtils.StringPairListParceler sForIntentInfoPairs = - new ParsingUtils.StringPairListParceler(); - - private static final Comparator ORDER_COMPARATOR = - (first, second) -> Integer.compare(second.getOrder(), first.getOrder()); - - // These are objects because null represents not explicitly set - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean supportsSmallScreens; - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean supportsNormalScreens; - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean supportsLargeScreens; - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean supportsExtraLargeScreens; - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean resizeable; - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean anyDensity; - - protected int versionCode; - protected int versionCodeMajor; - private int baseRevisionCode; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String versionName; - - private int compileSdkVersion; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String compileSdkVersionCodeName; - - @NonNull - @DataClass.ParcelWith(ForInternedString.class) - protected String packageName; - - @NonNull - protected String mBaseApkPath; - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String restrictedAccountType; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String requiredAccountType; - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String overlayTarget; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String overlayTargetOverlayableName; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String overlayCategory; - private int overlayPriority; - @NonNull - @DataClass.ParcelWith(ForInternedStringValueMap.class) - private Map overlayables = emptyMap(); - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String sdkLibName; - private int sdkLibVersionMajor; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String staticSharedLibName; - private long staticSharedLibVersion; - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List libraryNames = emptyList(); - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List usesLibraries = emptyList(); - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List usesOptionalLibraries = emptyList(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List usesNativeLibraries = emptyList(); - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List usesOptionalNativeLibraries = emptyList(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List usesStaticLibraries = emptyList(); - @Nullable - private long[] usesStaticLibrariesVersions; - @Nullable - private String[][] usesStaticLibrariesCertDigests; - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List usesSdkLibraries = emptyList(); - @Nullable - private long[] usesSdkLibrariesVersionsMajor; - @Nullable - private String[][] usesSdkLibrariesCertDigests; - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String sharedUserId; - - private int sharedUserLabel; - @NonNull - private List configPreferences = emptyList(); - @NonNull - private List reqFeatures = emptyList(); - @NonNull - private List featureGroups = emptyList(); - - @Nullable - private byte[] restrictUpdateHash; - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List originalPackages = emptyList(); - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List adoptPermissions = emptyList(); - /** - * @deprecated consider migrating to {@link #getUsesPermissions} which has - * more parsed details, such as flags - */ - @NonNull - @Deprecated - @DataClass.ParcelWith(ForInternedStringList.class) - protected List requestedPermissions = emptyList(); - - @NonNull - private List usesPermissions = emptyList(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List implicitPermissions = emptyList(); - - @NonNull - private Set upgradeKeySets = emptySet(); - @NonNull - private Map> keySetMapping = emptyMap(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - protected List protectedBroadcasts = emptyList(); - - @NonNull - protected List activities = emptyList(); - - @NonNull - protected List apexSystemServices = emptyList(); - - @NonNull - protected List receivers = emptyList(); - - @NonNull - protected List services = emptyList(); - - @NonNull - protected List providers = emptyList(); - - @NonNull - private List attributions = emptyList(); - - @NonNull - protected List permissions = emptyList(); - - @NonNull - protected List permissionGroups = emptyList(); - - @NonNull - protected List instrumentations = emptyList(); - - @NonNull -// @DataClass.ParcelWith(ParsingUtils.StringPairListParceler.class) - private List> preferredActivityFilters = emptyList(); - - /** - * Map from a process name to a {@link ParsedProcess}. - */ - @NonNull - private Map processes = emptyMap(); - - @Nullable - private Bundle metaData; - - @NonNull - private Map mProperties = emptyMap(); - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - protected String volumeUuid; - @NonNull - private SigningDetails signingDetails = SigningDetails.UNKNOWN; - - @NonNull - @DataClass.ParcelWith(ForInternedString.class) - protected String mPath; - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List queriesIntents = emptyList(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringList.class) - private List queriesPackages = emptyList(); - - @NonNull - @DataClass.ParcelWith(ForInternedStringSet.class) - private Set queriesProviders = emptySet(); - - @Nullable - @DataClass.ParcelWith(ForInternedStringArray.class) - private String[] splitClassLoaderNames; - @Nullable - protected String[] splitCodePaths; - @Nullable - private SparseArray splitDependencies; - @Nullable - private int[] splitFlags; - @Nullable - @DataClass.ParcelWith(ForInternedStringArray.class) - private String[] splitNames; - @Nullable - private int[] splitRevisionCodes; - - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String appComponentFactory; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String backupAgentName; - private int banner; - private int category = ApplicationInfo.CATEGORY_UNDEFINED; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String classLoaderName; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String className; - private int compatibleWidthLimitDp; - private int descriptionRes; - - private int fullBackupContent; - private int dataExtractionRules; - private int iconRes; - private int installLocation = ParsingPackageUtils.PARSE_DEFAULT_INSTALL_LOCATION; - private int labelRes; - private int largestWidthLimitDp; - private int logo; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String manageSpaceActivityName; - private float maxAspectRatio; - private float minAspectRatio; - @Nullable - private SparseIntArray minExtensionVersions; - private int minSdkVersion = ParsingUtils.DEFAULT_MIN_SDK_VERSION; - private int maxSdkVersion = ParsingUtils.DEFAULT_MAX_SDK_VERSION; - private int networkSecurityConfigRes; - @Nullable - private CharSequence nonLocalizedLabel; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String permission; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String processName; - private int requiresSmallestWidthDp; - private int roundIconRes; - private int targetSandboxVersion; - private int targetSdkVersion = ParsingUtils.DEFAULT_TARGET_SDK_VERSION; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String taskAffinity; - private int theme; - - private int uiOptions; - @Nullable - @DataClass.ParcelWith(ForInternedString.class) - private String zygotePreloadName; - - /** - * @see ParsingPackageRead#getResizeableActivity() - */ - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean resizeableActivity; - - private int autoRevokePermissions; - - @ApplicationInfo.GwpAsanMode - private int gwpAsanMode; - - @ApplicationInfo.MemtagMode - private int memtagMode; - - @ApplicationInfo.NativeHeapZeroInitialized - private int nativeHeapZeroInitialized; - - @Nullable - @DataClass.ParcelWith(ForBoolean.class) - private Boolean requestRawExternalStorageAccess; - - // TODO(chiuwinson): Non-null - @Nullable - private ArraySet mimeGroups; - - // Usually there's code to set enabled to true during parsing, but it's possible to install - // an APK targeting tag. That code would be skipped - // and never assign this, so initialize this to true for those cases. - private long mBooleans = Booleans.ENABLED; - - /** - * Flags used for a internal bitset. These flags should never be persisted or exposed outside - * of this class. It is expected that PackageCacher explicitly clears itself whenever the - * Parcelable implementation changes such that all these flags can be re-ordered or invalidated. - */ - protected static class Booleans { - @LongDef({ - EXTERNAL_STORAGE, - BASE_HARDWARE_ACCELERATED, - ALLOW_BACKUP, - KILL_AFTER_RESTORE, - RESTORE_ANY_VERSION, - FULL_BACKUP_ONLY, - PERSISTENT, - DEBUGGABLE, - VM_SAFE_MODE, - HAS_CODE, - ALLOW_TASK_REPARENTING, - ALLOW_CLEAR_USER_DATA, - LARGE_HEAP, - USES_CLEARTEXT_TRAFFIC, - SUPPORTS_RTL, - TEST_ONLY, - MULTI_ARCH, - EXTRACT_NATIVE_LIBS, - GAME, - STATIC_SHARED_LIBRARY, - OVERLAY, - ISOLATED_SPLIT_LOADING, - HAS_DOMAIN_URLS, - PROFILEABLE_BY_SHELL, - BACKUP_IN_FOREGROUND, - USE_EMBEDDED_DEX, - DEFAULT_TO_DEVICE_PROTECTED_STORAGE, - DIRECT_BOOT_AWARE, - PARTIALLY_DIRECT_BOOT_AWARE, - RESIZEABLE_ACTIVITY_VIA_SDK_VERSION, - ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, - ALLOW_AUDIO_PLAYBACK_CAPTURE, - REQUEST_LEGACY_EXTERNAL_STORAGE, - USES_NON_SDK_API, - HAS_FRAGILE_USER_DATA, - CANT_SAVE_STATE, - ALLOW_NATIVE_HEAP_POINTER_TAGGING, - PRESERVE_LEGACY_EXTERNAL_STORAGE, - REQUIRED_FOR_ALL_USERS, - OVERLAY_IS_STATIC, - USE_32_BIT_ABI, - VISIBLE_TO_INSTANT_APPS, - FORCE_QUERYABLE, - CROSS_PROFILE, - ENABLED, - DISALLOW_PROFILING, - REQUEST_FOREGROUND_SERVICE_EXEMPTION, - ATTRIBUTIONS_ARE_USER_VISIBLE, - RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED, - SDK_LIBRARY, - }) - public @interface Values {} - private static final long EXTERNAL_STORAGE = 1L; - private static final long BASE_HARDWARE_ACCELERATED = 1L << 1; - private static final long ALLOW_BACKUP = 1L << 2; - private static final long KILL_AFTER_RESTORE = 1L << 3; - private static final long RESTORE_ANY_VERSION = 1L << 4; - private static final long FULL_BACKUP_ONLY = 1L << 5; - private static final long PERSISTENT = 1L << 6; - private static final long DEBUGGABLE = 1L << 7; - private static final long VM_SAFE_MODE = 1L << 8; - private static final long HAS_CODE = 1L << 9; - private static final long ALLOW_TASK_REPARENTING = 1L << 10; - private static final long ALLOW_CLEAR_USER_DATA = 1L << 11; - private static final long LARGE_HEAP = 1L << 12; - private static final long USES_CLEARTEXT_TRAFFIC = 1L << 13; - private static final long SUPPORTS_RTL = 1L << 14; - private static final long TEST_ONLY = 1L << 15; - private static final long MULTI_ARCH = 1L << 16; - private static final long EXTRACT_NATIVE_LIBS = 1L << 17; - private static final long GAME = 1L << 18; - private static final long STATIC_SHARED_LIBRARY = 1L << 19; - private static final long OVERLAY = 1L << 20; - private static final long ISOLATED_SPLIT_LOADING = 1L << 21; - private static final long HAS_DOMAIN_URLS = 1L << 22; - private static final long PROFILEABLE_BY_SHELL = 1L << 23; - private static final long BACKUP_IN_FOREGROUND = 1L << 24; - private static final long USE_EMBEDDED_DEX = 1L << 25; - private static final long DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1L << 26; - private static final long DIRECT_BOOT_AWARE = 1L << 27; - private static final long PARTIALLY_DIRECT_BOOT_AWARE = 1L << 28; - private static final long RESIZEABLE_ACTIVITY_VIA_SDK_VERSION = 1L << 29; - private static final long ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE = 1L << 30; - private static final long ALLOW_AUDIO_PLAYBACK_CAPTURE = 1L << 31; - private static final long REQUEST_LEGACY_EXTERNAL_STORAGE = 1L << 32; - private static final long USES_NON_SDK_API = 1L << 33; - private static final long HAS_FRAGILE_USER_DATA = 1L << 34; - private static final long CANT_SAVE_STATE = 1L << 35; - private static final long ALLOW_NATIVE_HEAP_POINTER_TAGGING = 1L << 36; - private static final long PRESERVE_LEGACY_EXTERNAL_STORAGE = 1L << 37; - private static final long REQUIRED_FOR_ALL_USERS = 1L << 38; - private static final long OVERLAY_IS_STATIC = 1L << 39; - private static final long USE_32_BIT_ABI = 1L << 40; - private static final long VISIBLE_TO_INSTANT_APPS = 1L << 41; - private static final long FORCE_QUERYABLE = 1L << 42; - private static final long CROSS_PROFILE = 1L << 43; - private static final long ENABLED = 1L << 44; - private static final long DISALLOW_PROFILING = 1L << 45; - private static final long REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1L << 46; - private static final long ATTRIBUTIONS_ARE_USER_VISIBLE = 1L << 47; - private static final long RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED = 1L << 48; - private static final long SDK_LIBRARY = 1L << 49; - private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 50; - private static final long LEAVING_SHARED_UID = 1L << 51; - } - - private ParsingPackageImpl setBoolean(@Booleans.Values long flag, boolean value) { - if (value) { - mBooleans |= flag; - } else { - mBooleans &= ~flag; - } - return this; - } - - private boolean getBoolean(@Booleans.Values long flag) { - return (mBooleans & flag) != 0; - } - - @Nullable - private Set mKnownActivityEmbeddingCerts; - - // Derived fields - private long mLongVersionCode; - @NonNull - protected UUID mStorageUuid; - - private int mLocaleConfigRes; - - @VisibleForTesting - public ParsingPackageImpl(@NonNull String packageName, @NonNull String baseApkPath, - @NonNull String path, @Nullable TypedArray manifestArray) { - this.packageName = TextUtils.safeIntern(packageName); - this.mBaseApkPath = baseApkPath; - this.mPath = path; - - if (manifestArray != null) { - versionCode = manifestArray.getInteger(R.styleable.AndroidManifest_versionCode, 0); - versionCodeMajor = manifestArray.getInteger( - R.styleable.AndroidManifest_versionCodeMajor, 0); - setBaseRevisionCode( - manifestArray.getInteger(R.styleable.AndroidManifest_revisionCode, 0)); - setVersionName(manifestArray.getNonConfigurationString( - R.styleable.AndroidManifest_versionName, 0)); - - setCompileSdkVersion(manifestArray.getInteger( - R.styleable.AndroidManifest_compileSdkVersion, 0)); - setCompileSdkVersionCodeName(manifestArray.getNonConfigurationString( - R.styleable.AndroidManifest_compileSdkVersionCodename, 0)); - - setIsolatedSplitLoading(manifestArray.getBoolean( - R.styleable.AndroidManifest_isolatedSplits, false)); - - } - } - - public boolean isSupportsSmallScreens() { - if (supportsSmallScreens == null) { - return targetSdkVersion >= Build.VERSION_CODES.DONUT; - } - - return supportsSmallScreens; - } - - public boolean isSupportsNormalScreens() { - return supportsNormalScreens == null || supportsNormalScreens; - } - - public boolean isSupportsLargeScreens() { - if (supportsLargeScreens == null) { - return targetSdkVersion >= Build.VERSION_CODES.DONUT; - } - - return supportsLargeScreens; - } - - public boolean isSupportsExtraLargeScreens() { - if (supportsExtraLargeScreens == null) { - return targetSdkVersion >= Build.VERSION_CODES.GINGERBREAD; - } - - return supportsExtraLargeScreens; - } - - public boolean isResizeable() { - if (resizeable == null) { - return targetSdkVersion >= Build.VERSION_CODES.DONUT; - } - - return resizeable; - } - - public boolean isAnyDensity() { - if (anyDensity == null) { - return targetSdkVersion >= Build.VERSION_CODES.DONUT; - } - - return anyDensity; - } - - @Override - public ParsingPackageImpl sortActivities() { - Collections.sort(this.activities, ORDER_COMPARATOR); - return this; - } - - @Override - public ParsingPackageImpl sortReceivers() { - Collections.sort(this.receivers, ORDER_COMPARATOR); - return this; - } - - @Override - public ParsingPackageImpl sortServices() { - Collections.sort(this.services, ORDER_COMPARATOR); - return this; - } - - protected void assignDerivedFields() { - mStorageUuid = StorageManager.convert(volumeUuid); - mLongVersionCode = PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); - } - - @Override - public ParsingPackageImpl addConfigPreference(ConfigurationInfo configPreference) { - this.configPreferences = CollectionUtils.add(this.configPreferences, configPreference); - return this; - } - - @Override - public ParsingPackageImpl addReqFeature(FeatureInfo reqFeature) { - this.reqFeatures = CollectionUtils.add(this.reqFeatures, reqFeature); - return this; - } - - @Override - public ParsingPackageImpl addFeatureGroup(FeatureGroupInfo featureGroup) { - this.featureGroups = CollectionUtils.add(this.featureGroups, featureGroup); - return this; - } - - @Override - public ParsingPackageImpl addProperty(@Nullable Property property) { - if (property == null) { - return this; - } - this.mProperties = CollectionUtils.add(this.mProperties, property.getName(), property); - return this; - } - - @Override - public ParsingPackageImpl addProtectedBroadcast(String protectedBroadcast) { - if (!this.protectedBroadcasts.contains(protectedBroadcast)) { - this.protectedBroadcasts = CollectionUtils.add(this.protectedBroadcasts, - TextUtils.safeIntern(protectedBroadcast)); - } - return this; - } - - @Override - public ParsingPackageImpl addInstrumentation(ParsedInstrumentation instrumentation) { - this.instrumentations = CollectionUtils.add(this.instrumentations, instrumentation); - return this; - } - - @Override - public ParsingPackageImpl addOriginalPackage(String originalPackage) { - this.originalPackages = CollectionUtils.add(this.originalPackages, originalPackage); - return this; - } - - @Override - public ParsingPackage addOverlayable(String overlayableName, String actorName) { - this.overlayables = CollectionUtils.add(this.overlayables, overlayableName, - TextUtils.safeIntern(actorName)); - return this; - } - - @Override - public ParsingPackageImpl addAdoptPermission(String adoptPermission) { - this.adoptPermissions = CollectionUtils.add(this.adoptPermissions, - TextUtils.safeIntern(adoptPermission)); - return this; - } - - @Override - public ParsingPackageImpl addPermission(ParsedPermission permission) { - this.permissions = CollectionUtils.add(this.permissions, permission); - return this; - } - - @Override - public ParsingPackageImpl addPermissionGroup(ParsedPermissionGroup permissionGroup) { - this.permissionGroups = CollectionUtils.add(this.permissionGroups, permissionGroup); - return this; - } - - @Override - public ParsingPackageImpl addUsesPermission(ParsedUsesPermission permission) { - this.usesPermissions = CollectionUtils.add(this.usesPermissions, permission); - - // Continue populating legacy data structures to avoid performance - // issues until all that code can be migrated - this.requestedPermissions = CollectionUtils.add(this.requestedPermissions, - permission.getName()); - - return this; - } - - @Override - public ParsingPackageImpl addImplicitPermission(String permission) { - addUsesPermission(new ParsedUsesPermissionImpl(permission, 0 /*usesPermissionFlags*/)); - this.implicitPermissions = CollectionUtils.add(this.implicitPermissions, - TextUtils.safeIntern(permission)); - return this; - } - - @Override - public ParsingPackageImpl addKeySet(String keySetName, PublicKey publicKey) { - ArraySet publicKeys = keySetMapping.get(keySetName); - if (publicKeys == null) { - publicKeys = new ArraySet<>(); - } - publicKeys.add(publicKey); - keySetMapping = CollectionUtils.add(this.keySetMapping, keySetName, publicKeys); - return this; - } - - @Override - public ParsingPackageImpl addActivity(ParsedActivity parsedActivity) { - this.activities = CollectionUtils.add(this.activities, parsedActivity); - addMimeGroupsFromComponent(parsedActivity); - return this; - } - - @Override - public final ParsingPackageImpl addApexSystemService( - ParsedApexSystemService parsedApexSystemService) { - this.apexSystemServices = CollectionUtils.add( - this.apexSystemServices, parsedApexSystemService); - return this; - } - - @Override - public ParsingPackageImpl addReceiver(ParsedActivity parsedReceiver) { - this.receivers = CollectionUtils.add(this.receivers, parsedReceiver); - addMimeGroupsFromComponent(parsedReceiver); - return this; - } - - @Override - public ParsingPackageImpl addService(ParsedService parsedService) { - this.services = CollectionUtils.add(this.services, parsedService); - addMimeGroupsFromComponent(parsedService); - return this; - } - - @Override - public ParsingPackageImpl addProvider(ParsedProvider parsedProvider) { - this.providers = CollectionUtils.add(this.providers, parsedProvider); - addMimeGroupsFromComponent(parsedProvider); - return this; - } - - @Override - public ParsingPackageImpl addAttribution(ParsedAttribution attribution) { - this.attributions = CollectionUtils.add(this.attributions, attribution); - return this; - } - - @Override - public ParsingPackageImpl addLibraryName(String libraryName) { - this.libraryNames = CollectionUtils.add(this.libraryNames, - TextUtils.safeIntern(libraryName)); - return this; - } - - @Override - public ParsingPackageImpl addUsesOptionalLibrary(String libraryName) { - this.usesOptionalLibraries = CollectionUtils.add(this.usesOptionalLibraries, - TextUtils.safeIntern(libraryName)); - return this; - } - - @Override - public ParsingPackageImpl addUsesLibrary(String libraryName) { - this.usesLibraries = CollectionUtils.add(this.usesLibraries, - TextUtils.safeIntern(libraryName)); - return this; - } - - @Override - public ParsingPackageImpl removeUsesOptionalLibrary(String libraryName) { - this.usesOptionalLibraries = CollectionUtils.remove(this.usesOptionalLibraries, - libraryName); - return this; - } - - @Override - public final ParsingPackageImpl addUsesOptionalNativeLibrary(String libraryName) { - this.usesOptionalNativeLibraries = CollectionUtils.add(this.usesOptionalNativeLibraries, - TextUtils.safeIntern(libraryName)); - return this; - } - - @Override - public final ParsingPackageImpl addUsesNativeLibrary(String libraryName) { - this.usesNativeLibraries = CollectionUtils.add(this.usesNativeLibraries, - TextUtils.safeIntern(libraryName)); - return this; - } - - @Override public ParsingPackageImpl removeUsesOptionalNativeLibrary(String libraryName) { - this.usesOptionalNativeLibraries = CollectionUtils.remove(this.usesOptionalNativeLibraries, - libraryName); - return this; - } - - @Override - public ParsingPackageImpl addUsesSdkLibrary(String libraryName, long versionMajor, - String[] certSha256Digests) { - this.usesSdkLibraries = CollectionUtils.add(this.usesSdkLibraries, - TextUtils.safeIntern(libraryName)); - this.usesSdkLibrariesVersionsMajor = ArrayUtils.appendLong( - this.usesSdkLibrariesVersionsMajor, versionMajor, true); - this.usesSdkLibrariesCertDigests = ArrayUtils.appendElement(String[].class, - this.usesSdkLibrariesCertDigests, certSha256Digests, true); - return this; - } - - @Override - public ParsingPackageImpl addUsesStaticLibrary(String libraryName, long version, - String[] certSha256Digests) { - this.usesStaticLibraries = CollectionUtils.add(this.usesStaticLibraries, - TextUtils.safeIntern(libraryName)); - this.usesStaticLibrariesVersions = ArrayUtils.appendLong(this.usesStaticLibrariesVersions, - version, true); - this.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String[].class, - this.usesStaticLibrariesCertDigests, certSha256Digests, true); - return this; - } - - @Override - public ParsingPackageImpl addPreferredActivityFilter(String className, - ParsedIntentInfo intentInfo) { - this.preferredActivityFilters = CollectionUtils.add(this.preferredActivityFilters, - Pair.create(className, intentInfo)); - return this; - } - - @Override - public ParsingPackageImpl addQueriesIntent(Intent intent) { - this.queriesIntents = CollectionUtils.add(this.queriesIntents, intent); - return this; - } - - @Override - public ParsingPackageImpl addQueriesPackage(String packageName) { - this.queriesPackages = CollectionUtils.add(this.queriesPackages, - TextUtils.safeIntern(packageName)); - return this; - } - - @Override - public ParsingPackageImpl addQueriesProvider(String authority) { - this.queriesProviders = CollectionUtils.add(this.queriesProviders, authority); - return this; - } - - @Override - public ParsingPackageImpl setSupportsSmallScreens(int supportsSmallScreens) { - if (supportsSmallScreens == 1) { - return this; - } - - this.supportsSmallScreens = supportsSmallScreens < 0; - return this; - } - - @Override - public ParsingPackageImpl setSupportsNormalScreens(int supportsNormalScreens) { - if (supportsNormalScreens == 1) { - return this; - } - - this.supportsNormalScreens = supportsNormalScreens < 0; - return this; - } - - @Override - public ParsingPackageImpl setSupportsLargeScreens(int supportsLargeScreens) { - if (supportsLargeScreens == 1) { - return this; - } - - this.supportsLargeScreens = supportsLargeScreens < 0; - return this; - } - - @Override - public ParsingPackageImpl setSupportsExtraLargeScreens(int supportsExtraLargeScreens) { - if (supportsExtraLargeScreens == 1) { - return this; - } - - this.supportsExtraLargeScreens = supportsExtraLargeScreens < 0; - return this; - } - - @Override - public ParsingPackageImpl setResizeable(int resizeable) { - if (resizeable == 1) { - return this; - } - - this.resizeable = resizeable < 0; - return this; - } - - @Override - public ParsingPackageImpl setAnyDensity(int anyDensity) { - if (anyDensity == 1) { - return this; - } - - this.anyDensity = anyDensity < 0; - return this; - } - - @Override - public ParsingPackageImpl asSplit(String[] splitNames, String[] splitCodePaths, - int[] splitRevisionCodes, SparseArray splitDependencies) { - this.splitNames = splitNames; - this.splitCodePaths = splitCodePaths; - this.splitRevisionCodes = splitRevisionCodes; - this.splitDependencies = splitDependencies; - - int count = splitNames.length; - this.splitFlags = new int[count]; - this.splitClassLoaderNames = new String[count]; - return this; - } - - @Override - public ParsingPackageImpl setSplitHasCode(int splitIndex, boolean splitHasCode) { - this.splitFlags[splitIndex] = splitHasCode - ? this.splitFlags[splitIndex] | ApplicationInfo.FLAG_HAS_CODE - : this.splitFlags[splitIndex] & ~ApplicationInfo.FLAG_HAS_CODE; - return this; - } - - @Override - public ParsingPackageImpl setSplitClassLoaderName(int splitIndex, String classLoaderName) { - this.splitClassLoaderNames[splitIndex] = classLoaderName; - return this; - } - - @Override - public ParsingPackageImpl setRequiredAccountType(@Nullable String requiredAccountType) { - this.requiredAccountType = TextUtils.nullIfEmpty(requiredAccountType); - return this; - } - - @Override - public ParsingPackageImpl setOverlayTarget(@Nullable String overlayTarget) { - this.overlayTarget = TextUtils.safeIntern(overlayTarget); - return this; - } - - @Override - public ParsingPackageImpl setVolumeUuid(@Nullable String volumeUuid) { - this.volumeUuid = TextUtils.safeIntern(volumeUuid); - return this; - } - - @Override - public ParsingPackageImpl setStaticSharedLibName(String staticSharedLibName) { - this.staticSharedLibName = TextUtils.safeIntern(staticSharedLibName); - return this; - } - - @Override - public ParsingPackageImpl setSharedUserId(String sharedUserId) { - this.sharedUserId = TextUtils.safeIntern(sharedUserId); - return this; - } - - @Override - public ParsingPackageImpl setNonLocalizedLabel(@Nullable CharSequence value) { - nonLocalizedLabel = value == null ? null : value.toString().trim(); - return this; - } - - @NonNull - @Override - public String getProcessName() { - return processName != null ? processName : packageName; - } - - @Override - public String toString() { - return "Package{" - + Integer.toHexString(System.identityHashCode(this)) - + " " + packageName + "}"; - } - - public ApplicationInfo toAppInfoWithoutStateWithoutFlags() { - ApplicationInfo appInfo = new ApplicationInfo(); - - // Lines that are commented below are state related and should not be assigned here. - // They are left in as placeholders, since there is no good backwards compatible way to - // separate these. - appInfo.appComponentFactory = appComponentFactory; - appInfo.backupAgentName = backupAgentName; - appInfo.banner = banner; - appInfo.category = category; - appInfo.classLoaderName = classLoaderName; - appInfo.className = className; - appInfo.compatibleWidthLimitDp = compatibleWidthLimitDp; - appInfo.compileSdkVersion = compileSdkVersion; - appInfo.compileSdkVersionCodename = compileSdkVersionCodeName; -// appInfo.credentialProtectedDataDir - appInfo.crossProfile = isCrossProfile(); -// appInfo.dataDir - appInfo.descriptionRes = descriptionRes; -// appInfo.deviceProtectedDataDir - appInfo.enabled = getBoolean(Booleans.ENABLED); -// appInfo.enabledSetting - appInfo.fullBackupContent = fullBackupContent; - appInfo.dataExtractionRulesRes = dataExtractionRules; - // TODO(b/135203078): See ParsingPackageImpl#getHiddenApiEnforcementPolicy -// appInfo.mHiddenApiPolicy -// appInfo.hiddenUntilInstalled - appInfo.icon = - (ParsingPackageUtils.sUseRoundIcon && roundIconRes != 0) ? roundIconRes : iconRes; - appInfo.iconRes = iconRes; - appInfo.roundIconRes = roundIconRes; - appInfo.installLocation = installLocation; - appInfo.labelRes = labelRes; - appInfo.largestWidthLimitDp = largestWidthLimitDp; - appInfo.logo = logo; - appInfo.manageSpaceActivityName = manageSpaceActivityName; - appInfo.maxAspectRatio = maxAspectRatio; - appInfo.metaData = metaData; - appInfo.minAspectRatio = minAspectRatio; - appInfo.minSdkVersion = minSdkVersion; - appInfo.name = className; -// appInfo.nativeLibraryDir -// appInfo.nativeLibraryRootDir -// appInfo.nativeLibraryRootRequiresIsa - appInfo.networkSecurityConfigRes = networkSecurityConfigRes; - appInfo.nonLocalizedLabel = nonLocalizedLabel; - appInfo.packageName = packageName; - appInfo.permission = permission; -// appInfo.primaryCpuAbi - appInfo.processName = getProcessName(); - appInfo.requiresSmallestWidthDp = requiresSmallestWidthDp; -// appInfo.resourceDirs -// appInfo.secondaryCpuAbi -// appInfo.secondaryNativeLibraryDir -// appInfo.seInfo -// appInfo.seInfoUser -// appInfo.sharedLibraryFiles -// appInfo.sharedLibraryInfos -// appInfo.showUserIcon - appInfo.splitClassLoaderNames = splitClassLoaderNames; - appInfo.splitDependencies = (splitDependencies == null || splitDependencies.size() == 0) - ? null : splitDependencies; - appInfo.splitNames = splitNames; - appInfo.storageUuid = mStorageUuid; - appInfo.targetSandboxVersion = targetSandboxVersion; - appInfo.targetSdkVersion = targetSdkVersion; - appInfo.taskAffinity = taskAffinity; - appInfo.theme = theme; -// appInfo.uid - appInfo.uiOptions = uiOptions; - appInfo.volumeUuid = volumeUuid; - appInfo.zygotePreloadName = zygotePreloadName; - appInfo.setGwpAsanMode(gwpAsanMode); - appInfo.setMemtagMode(memtagMode); - appInfo.setNativeHeapZeroInitialized(nativeHeapZeroInitialized); - appInfo.setRequestRawExternalStorageAccess(requestRawExternalStorageAccess); - appInfo.setBaseCodePath(mBaseApkPath); - appInfo.setBaseResourcePath(mBaseApkPath); - appInfo.setCodePath(mPath); - appInfo.setResourcePath(mPath); - appInfo.setSplitCodePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths); - appInfo.setSplitResourcePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths); - appInfo.setVersionCode(mLongVersionCode); - appInfo.setAppClassNamesByProcess(buildAppClassNamesByProcess()); - appInfo.setLocaleConfigRes(mLocaleConfigRes); - if (mKnownActivityEmbeddingCerts != null) { - appInfo.setKnownActivityEmbeddingCerts(mKnownActivityEmbeddingCerts); - } - - return appInfo; - } - - /** - * Create a map from a process name to the custom application class for this process, - * which comes from . - * - * The original information is stored in {@link #processes}, but it's stored in - * a form of: [process name] -[1:N]-> [package name] -[1:N]-> [class name]. - * We scan it and collect the process names and their app class names, only for this package. - * - * The resulting map only contains processes with a custom application class set. - */ - @Nullable - private ArrayMap buildAppClassNamesByProcess() { - if (ArrayUtils.size(processes) == 0) { - return null; - } - final ArrayMap ret = new ArrayMap<>(4); - for (String processName : processes.keySet()) { - final ParsedProcess process = processes.get(processName); - final ArrayMap appClassesByPackage = - process.getAppClassNamesByPackage(); - - for (int i = 0; i < appClassesByPackage.size(); i++) { - final String packageName = appClassesByPackage.keyAt(i); - - if (this.packageName.equals(packageName)) { - final String appClassName = appClassesByPackage.valueAt(i); - if (!TextUtils.isEmpty(appClassName)) { - ret.put(processName, appClassName); - } - } - } - } - return ret; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - sForBoolean.parcel(this.supportsSmallScreens, dest, flags); - sForBoolean.parcel(this.supportsNormalScreens, dest, flags); - sForBoolean.parcel(this.supportsLargeScreens, dest, flags); - sForBoolean.parcel(this.supportsExtraLargeScreens, dest, flags); - sForBoolean.parcel(this.resizeable, dest, flags); - sForBoolean.parcel(this.anyDensity, dest, flags); - dest.writeInt(this.versionCode); - dest.writeInt(this.versionCodeMajor); - dest.writeInt(this.baseRevisionCode); - sForInternedString.parcel(this.versionName, dest, flags); - dest.writeInt(this.compileSdkVersion); - dest.writeString(this.compileSdkVersionCodeName); - sForInternedString.parcel(this.packageName, dest, flags); - dest.writeString(this.mBaseApkPath); - dest.writeString(this.restrictedAccountType); - dest.writeString(this.requiredAccountType); - sForInternedString.parcel(this.overlayTarget, dest, flags); - dest.writeString(this.overlayTargetOverlayableName); - dest.writeString(this.overlayCategory); - dest.writeInt(this.overlayPriority); - sForInternedStringValueMap.parcel(this.overlayables, dest, flags); - sForInternedString.parcel(this.sdkLibName, dest, flags); - dest.writeInt(this.sdkLibVersionMajor); - sForInternedString.parcel(this.staticSharedLibName, dest, flags); - dest.writeLong(this.staticSharedLibVersion); - sForInternedStringList.parcel(this.libraryNames, dest, flags); - sForInternedStringList.parcel(this.usesLibraries, dest, flags); - sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags); - sForInternedStringList.parcel(this.usesNativeLibraries, dest, flags); - sForInternedStringList.parcel(this.usesOptionalNativeLibraries, dest, flags); - - sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags); - dest.writeLongArray(this.usesStaticLibrariesVersions); - if (this.usesStaticLibrariesCertDigests == null) { - dest.writeInt(-1); - } else { - dest.writeInt(this.usesStaticLibrariesCertDigests.length); - for (int index = 0; index < this.usesStaticLibrariesCertDigests.length; index++) { - dest.writeStringArray(this.usesStaticLibrariesCertDigests[index]); - } - } - - sForInternedStringList.parcel(this.usesSdkLibraries, dest, flags); - dest.writeLongArray(this.usesSdkLibrariesVersionsMajor); - if (this.usesSdkLibrariesCertDigests == null) { - dest.writeInt(-1); - } else { - dest.writeInt(this.usesSdkLibrariesCertDigests.length); - for (int index = 0; index < this.usesSdkLibrariesCertDigests.length; index++) { - dest.writeStringArray(this.usesSdkLibrariesCertDigests[index]); - } - } - - sForInternedString.parcel(this.sharedUserId, dest, flags); - dest.writeInt(this.sharedUserLabel); - dest.writeTypedList(this.configPreferences); - dest.writeTypedList(this.reqFeatures); - dest.writeTypedList(this.featureGroups); - dest.writeByteArray(this.restrictUpdateHash); - dest.writeStringList(this.originalPackages); - sForInternedStringList.parcel(this.adoptPermissions, dest, flags); - sForInternedStringList.parcel(this.requestedPermissions, dest, flags); - ParsingUtils.writeParcelableList(dest, this.usesPermissions); - sForInternedStringList.parcel(this.implicitPermissions, dest, flags); - sForStringSet.parcel(this.upgradeKeySets, dest, flags); - ParsingPackageUtils.writeKeySetMapping(dest, this.keySetMapping); - sForInternedStringList.parcel(this.protectedBroadcasts, dest, flags); - ParsingUtils.writeParcelableList(dest, this.activities); - ParsingUtils.writeParcelableList(dest, this.apexSystemServices); - ParsingUtils.writeParcelableList(dest, this.receivers); - ParsingUtils.writeParcelableList(dest, this.services); - ParsingUtils.writeParcelableList(dest, this.providers); - ParsingUtils.writeParcelableList(dest, this.attributions); - ParsingUtils.writeParcelableList(dest, this.permissions); - ParsingUtils.writeParcelableList(dest, this.permissionGroups); - ParsingUtils.writeParcelableList(dest, this.instrumentations); - sForIntentInfoPairs.parcel(this.preferredActivityFilters, dest, flags); - dest.writeMap(this.processes); - dest.writeBundle(this.metaData); - sForInternedString.parcel(this.volumeUuid, dest, flags); - dest.writeParcelable(this.signingDetails, flags); - dest.writeString(this.mPath); - dest.writeTypedList(this.queriesIntents, flags); - sForInternedStringList.parcel(this.queriesPackages, dest, flags); - sForInternedStringSet.parcel(this.queriesProviders, dest, flags); - dest.writeString(this.appComponentFactory); - dest.writeString(this.backupAgentName); - dest.writeInt(this.banner); - dest.writeInt(this.category); - dest.writeString(this.classLoaderName); - dest.writeString(this.className); - dest.writeInt(this.compatibleWidthLimitDp); - dest.writeInt(this.descriptionRes); - dest.writeInt(this.fullBackupContent); - dest.writeInt(this.dataExtractionRules); - dest.writeInt(this.iconRes); - dest.writeInt(this.installLocation); - dest.writeInt(this.labelRes); - dest.writeInt(this.largestWidthLimitDp); - dest.writeInt(this.logo); - dest.writeString(this.manageSpaceActivityName); - dest.writeFloat(this.maxAspectRatio); - dest.writeFloat(this.minAspectRatio); - dest.writeInt(this.minSdkVersion); - dest.writeInt(this.maxSdkVersion); - dest.writeInt(this.networkSecurityConfigRes); - dest.writeCharSequence(this.nonLocalizedLabel); - dest.writeString(this.permission); - dest.writeString(this.processName); - dest.writeInt(this.requiresSmallestWidthDp); - dest.writeInt(this.roundIconRes); - dest.writeInt(this.targetSandboxVersion); - dest.writeInt(this.targetSdkVersion); - dest.writeString(this.taskAffinity); - dest.writeInt(this.theme); - dest.writeInt(this.uiOptions); - dest.writeString(this.zygotePreloadName); - dest.writeStringArray(this.splitClassLoaderNames); - dest.writeStringArray(this.splitCodePaths); - dest.writeSparseArray(this.splitDependencies); - dest.writeIntArray(this.splitFlags); - dest.writeStringArray(this.splitNames); - dest.writeIntArray(this.splitRevisionCodes); - sForBoolean.parcel(this.resizeableActivity, dest, flags); - dest.writeInt(this.autoRevokePermissions); - dest.writeArraySet(this.mimeGroups); - dest.writeInt(this.gwpAsanMode); - dest.writeSparseIntArray(this.minExtensionVersions); - dest.writeLong(this.mBooleans); - dest.writeMap(this.mProperties); - dest.writeInt(this.memtagMode); - dest.writeInt(this.nativeHeapZeroInitialized); - sForBoolean.parcel(this.requestRawExternalStorageAccess, dest, flags); - dest.writeInt(this.mLocaleConfigRes); - sForStringSet.parcel(mKnownActivityEmbeddingCerts, dest, flags); - } - - public ParsingPackageImpl(Parcel in) { - // We use the boot classloader for all classes that we load. - final ClassLoader boot = Object.class.getClassLoader(); - this.supportsSmallScreens = sForBoolean.unparcel(in); - this.supportsNormalScreens = sForBoolean.unparcel(in); - this.supportsLargeScreens = sForBoolean.unparcel(in); - this.supportsExtraLargeScreens = sForBoolean.unparcel(in); - this.resizeable = sForBoolean.unparcel(in); - this.anyDensity = sForBoolean.unparcel(in); - this.versionCode = in.readInt(); - this.versionCodeMajor = in.readInt(); - this.baseRevisionCode = in.readInt(); - this.versionName = sForInternedString.unparcel(in); - this.compileSdkVersion = in.readInt(); - this.compileSdkVersionCodeName = in.readString(); - this.packageName = sForInternedString.unparcel(in); - this.mBaseApkPath = in.readString(); - this.restrictedAccountType = in.readString(); - this.requiredAccountType = in.readString(); - this.overlayTarget = sForInternedString.unparcel(in); - this.overlayTargetOverlayableName = in.readString(); - this.overlayCategory = in.readString(); - this.overlayPriority = in.readInt(); - this.overlayables = sForInternedStringValueMap.unparcel(in); - this.sdkLibName = sForInternedString.unparcel(in); - this.sdkLibVersionMajor = in.readInt(); - this.staticSharedLibName = sForInternedString.unparcel(in); - this.staticSharedLibVersion = in.readLong(); - this.libraryNames = sForInternedStringList.unparcel(in); - this.usesLibraries = sForInternedStringList.unparcel(in); - this.usesOptionalLibraries = sForInternedStringList.unparcel(in); - this.usesNativeLibraries = sForInternedStringList.unparcel(in); - this.usesOptionalNativeLibraries = sForInternedStringList.unparcel(in); - - this.usesStaticLibraries = sForInternedStringList.unparcel(in); - this.usesStaticLibrariesVersions = in.createLongArray(); - { - int digestsSize = in.readInt(); - if (digestsSize >= 0) { - this.usesStaticLibrariesCertDigests = new String[digestsSize][]; - for (int index = 0; index < digestsSize; index++) { - this.usesStaticLibrariesCertDigests[index] = sForInternedStringArray.unparcel( - in); - } - } - } - - this.usesSdkLibraries = sForInternedStringList.unparcel(in); - this.usesSdkLibrariesVersionsMajor = in.createLongArray(); - { - int digestsSize = in.readInt(); - if (digestsSize >= 0) { - this.usesSdkLibrariesCertDigests = new String[digestsSize][]; - for (int index = 0; index < digestsSize; index++) { - this.usesSdkLibrariesCertDigests[index] = sForInternedStringArray.unparcel(in); - } - } - } - - this.sharedUserId = sForInternedString.unparcel(in); - this.sharedUserLabel = in.readInt(); - this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR); - this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR); - this.featureGroups = in.createTypedArrayList(FeatureGroupInfo.CREATOR); - this.restrictUpdateHash = in.createByteArray(); - this.originalPackages = in.createStringArrayList(); - this.adoptPermissions = sForInternedStringList.unparcel(in); - this.requestedPermissions = sForInternedStringList.unparcel(in); - this.usesPermissions = ParsingUtils.createTypedInterfaceList(in, - ParsedUsesPermissionImpl.CREATOR); - this.implicitPermissions = sForInternedStringList.unparcel(in); - this.upgradeKeySets = sForStringSet.unparcel(in); - this.keySetMapping = ParsingPackageUtils.readKeySetMapping(in); - this.protectedBroadcasts = sForInternedStringList.unparcel(in); - - this.activities = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR); - this.apexSystemServices = ParsingUtils.createTypedInterfaceList(in, - ParsedApexSystemServiceImpl.CREATOR); - this.receivers = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR); - this.services = ParsingUtils.createTypedInterfaceList(in, ParsedServiceImpl.CREATOR); - this.providers = ParsingUtils.createTypedInterfaceList(in, ParsedProviderImpl.CREATOR); - this.attributions = ParsingUtils.createTypedInterfaceList(in, - ParsedAttributionImpl.CREATOR); - this.permissions = ParsingUtils.createTypedInterfaceList(in, ParsedPermissionImpl.CREATOR); - this.permissionGroups = ParsingUtils.createTypedInterfaceList(in, - ParsedPermissionGroupImpl.CREATOR); - this.instrumentations = ParsingUtils.createTypedInterfaceList(in, - ParsedInstrumentationImpl.CREATOR); - this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in); - this.processes = in.readHashMap(ParsedProcess.class.getClassLoader()); - this.metaData = in.readBundle(boot); - this.volumeUuid = sForInternedString.unparcel(in); - this.signingDetails = in.readParcelable(boot, android.content.pm.SigningDetails.class); - this.mPath = in.readString(); - this.queriesIntents = in.createTypedArrayList(Intent.CREATOR); - this.queriesPackages = sForInternedStringList.unparcel(in); - this.queriesProviders = sForInternedStringSet.unparcel(in); - this.appComponentFactory = in.readString(); - this.backupAgentName = in.readString(); - this.banner = in.readInt(); - this.category = in.readInt(); - this.classLoaderName = in.readString(); - this.className = in.readString(); - this.compatibleWidthLimitDp = in.readInt(); - this.descriptionRes = in.readInt(); - this.fullBackupContent = in.readInt(); - this.dataExtractionRules = in.readInt(); - this.iconRes = in.readInt(); - this.installLocation = in.readInt(); - this.labelRes = in.readInt(); - this.largestWidthLimitDp = in.readInt(); - this.logo = in.readInt(); - this.manageSpaceActivityName = in.readString(); - this.maxAspectRatio = in.readFloat(); - this.minAspectRatio = in.readFloat(); - this.minSdkVersion = in.readInt(); - this.maxSdkVersion = in.readInt(); - this.networkSecurityConfigRes = in.readInt(); - this.nonLocalizedLabel = in.readCharSequence(); - this.permission = in.readString(); - this.processName = in.readString(); - this.requiresSmallestWidthDp = in.readInt(); - this.roundIconRes = in.readInt(); - this.targetSandboxVersion = in.readInt(); - this.targetSdkVersion = in.readInt(); - this.taskAffinity = in.readString(); - this.theme = in.readInt(); - this.uiOptions = in.readInt(); - this.zygotePreloadName = in.readString(); - this.splitClassLoaderNames = in.createStringArray(); - this.splitCodePaths = in.createStringArray(); - this.splitDependencies = in.readSparseArray(boot); - this.splitFlags = in.createIntArray(); - this.splitNames = in.createStringArray(); - this.splitRevisionCodes = in.createIntArray(); - this.resizeableActivity = sForBoolean.unparcel(in); - - this.autoRevokePermissions = in.readInt(); - this.mimeGroups = (ArraySet) in.readArraySet(boot); - this.gwpAsanMode = in.readInt(); - this.minExtensionVersions = in.readSparseIntArray(); - this.mBooleans = in.readLong(); - this.mProperties = in.readHashMap(boot); - this.memtagMode = in.readInt(); - this.nativeHeapZeroInitialized = in.readInt(); - this.requestRawExternalStorageAccess = sForBoolean.unparcel(in); - this.mLocaleConfigRes = in.readInt(); - this.mKnownActivityEmbeddingCerts = sForStringSet.unparcel(in); - assignDerivedFields(); - } - - @Override - public int getVersionCode() { - return versionCode; - } - - @Override - public int getVersionCodeMajor() { - return versionCodeMajor; - } - - @Override - public long getLongVersionCode() { - return mLongVersionCode; - } - - @Override - public int getBaseRevisionCode() { - return baseRevisionCode; - } - - @Nullable - @Override - public String getVersionName() { - return versionName; - } - - @Override - public int getCompileSdkVersion() { - return compileSdkVersion; - } - - @Nullable - @Override - public String getCompileSdkVersionCodeName() { - return compileSdkVersionCodeName; - } - - @NonNull - @Override - public String getPackageName() { - return packageName; - } - - @NonNull - @Override - public String getBaseApkPath() { - return mBaseApkPath; - } - - @Override - public boolean isRequiredForAllUsers() { - return getBoolean(Booleans.REQUIRED_FOR_ALL_USERS); - } - - @Nullable - @Override - public String getRestrictedAccountType() { - return restrictedAccountType; - } - - @Nullable - @Override - public String getRequiredAccountType() { - return requiredAccountType; - } - - @Nullable - @Override - public String getOverlayTarget() { - return overlayTarget; - } - - @Nullable - @Override - public String getOverlayTargetOverlayableName() { - return overlayTargetOverlayableName; - } - - @Nullable - @Override - public String getOverlayCategory() { - return overlayCategory; - } - - @Override - public int getOverlayPriority() { - return overlayPriority; - } - - @Override - public boolean isOverlayIsStatic() { - return getBoolean(Booleans.OVERLAY_IS_STATIC); - } - - @NonNull - @Override - public Map getOverlayables() { - return overlayables; - } - - @Nullable - @Override - public String getSdkLibName() { - return sdkLibName; - } - - @Override - public int getSdkLibVersionMajor() { - return sdkLibVersionMajor; - } - - @Nullable - @Override - public String getStaticSharedLibName() { - return staticSharedLibName; - } - - @Override - public long getStaticSharedLibVersion() { - return staticSharedLibVersion; - } - - @NonNull - @Override - public List getLibraryNames() { - return libraryNames; - } - - @NonNull - @Override - public List getUsesLibraries() { - return usesLibraries; - } - - @NonNull - @Override - public List getUsesOptionalLibraries() { - return usesOptionalLibraries; - } - - @NonNull - @Override - public List getUsesNativeLibraries() { - return usesNativeLibraries; - } - - @NonNull - @Override - public List getUsesOptionalNativeLibraries() { - return usesOptionalNativeLibraries; - } - - @NonNull - @Override - public List getUsesStaticLibraries() { - return usesStaticLibraries; - } - - @Nullable - @Override - public long[] getUsesStaticLibrariesVersions() { - return usesStaticLibrariesVersions; - } - - @Nullable - @Override - public String[][] getUsesStaticLibrariesCertDigests() { - return usesStaticLibrariesCertDigests; - } - - @NonNull - @Override - public List getUsesSdkLibraries() { return usesSdkLibraries; } - - @Nullable - @Override - public long[] getUsesSdkLibrariesVersionsMajor() { return usesSdkLibrariesVersionsMajor; } - - @Nullable - @Override - public String[][] getUsesSdkLibrariesCertDigests() { return usesSdkLibrariesCertDigests; } - - @Nullable - @Override - public String getSharedUserId() { - return sharedUserId; - } - - @Override - public int getSharedUserLabel() { - return sharedUserLabel; - } - - @NonNull - @Override - public List getConfigPreferences() { - return configPreferences; - } - - @NonNull - @Override - public List getRequestedFeatures() { - return reqFeatures; - } - - @NonNull - @Override - public List getFeatureGroups() { - return featureGroups; - } - - @Nullable - @Override - public byte[] getRestrictUpdateHash() { - return restrictUpdateHash; - } - - @NonNull - @Override - public List getOriginalPackages() { - return originalPackages; - } - - @NonNull - @Override - public List getAdoptPermissions() { - return adoptPermissions; - } - - /** - * @deprecated consider migrating to {@link #getUsesPermissions} which has - * more parsed details, such as flags - */ - @NonNull - @Override - @Deprecated - public List getRequestedPermissions() { - return requestedPermissions; - } - - @NonNull - @Override - public List getUsesPermissions() { - return usesPermissions; - } - - @NonNull - @Override - public List getImplicitPermissions() { - return implicitPermissions; - } - - @NonNull - @Override - public Map getProperties() { - return mProperties; - } - - @NonNull - @Override - public Set getUpgradeKeySets() { - return upgradeKeySets; - } - - @NonNull - @Override - public Map> getKeySetMapping() { - return keySetMapping; - } - - @NonNull - @Override - public List getProtectedBroadcasts() { - return protectedBroadcasts; - } - - @NonNull - @Override - public List getActivities() { - return activities; - } - - @NonNull - @Override - public List getApexSystemServices() { - return apexSystemServices; - } - - @NonNull - @Override - public List getReceivers() { - return receivers; - } - - @NonNull - @Override - public List getServices() { - return services; - } - - @NonNull - @Override - public List getProviders() { - return providers; - } - - @NonNull - @Override - public List getAttributions() { - return attributions; - } - - @NonNull - @Override - public List getPermissions() { - return permissions; - } - - @NonNull - @Override - public List getPermissionGroups() { - return permissionGroups; - } - - @NonNull - @Override - public List getInstrumentations() { - return instrumentations; - } - - @NonNull - @Override - public List> getPreferredActivityFilters() { - return preferredActivityFilters; - } - - @NonNull - @Override - public Map getProcesses() { - return processes; - } - - @Nullable - @Override - public Bundle getMetaData() { - return metaData; - } - - private void addMimeGroupsFromComponent(ParsedComponent component) { - for (int i = component.getIntents().size() - 1; i >= 0; i--) { - IntentFilter filter = component.getIntents().get(i).getIntentFilter(); - for (int groupIndex = filter.countMimeGroups() - 1; groupIndex >= 0; groupIndex--) { - mimeGroups = ArrayUtils.add(mimeGroups, filter.getMimeGroup(groupIndex)); - } - } - } - - @Override - @Nullable - public Set getMimeGroups() { - return mimeGroups; - } - - @Nullable - @Override - public String getVolumeUuid() { - return volumeUuid; - } - - @NonNull - @Override - public SigningDetails getSigningDetails() { - return signingDetails; - } - - @NonNull - @Override - public String getPath() { - return mPath; - } - - @Override - public boolean isUse32BitAbi() { - return getBoolean(Booleans.USE_32_BIT_ABI); - } - - @Override - public boolean isVisibleToInstantApps() { - return getBoolean(Booleans.VISIBLE_TO_INSTANT_APPS); - } - - @Override - public boolean isForceQueryable() { - return getBoolean(Booleans.FORCE_QUERYABLE); - } - - @NonNull - @Override - public List getQueriesIntents() { - return queriesIntents; - } - - @NonNull - @Override - public List getQueriesPackages() { - return queriesPackages; - } - - @NonNull - @Override - public Set getQueriesProviders() { - return queriesProviders; - } - - @NonNull - @Override - public String[] getSplitClassLoaderNames() { - return splitClassLoaderNames == null ? EmptyArray.STRING : splitClassLoaderNames; - } - - @NonNull - @Override - public String[] getSplitCodePaths() { - return splitCodePaths == null ? EmptyArray.STRING : splitCodePaths; - } - - @Nullable - @Override - public SparseArray getSplitDependencies() { - return splitDependencies == null ? EMPTY_INT_ARRAY_SPARSE_ARRAY : splitDependencies; - } - - @Nullable - @Override - public int[] getSplitFlags() { - return splitFlags; - } - - @NonNull - @Override - public String[] getSplitNames() { - return splitNames == null ? EmptyArray.STRING : splitNames; - } - - @NonNull - @Override - public int[] getSplitRevisionCodes() { - return splitRevisionCodes == null ? EmptyArray.INT : splitRevisionCodes; - } - - @Nullable - @Override - public String getAppComponentFactory() { - return appComponentFactory; - } - - @Nullable - @Override - public String getBackupAgentName() { - return backupAgentName; - } - - @Override - public int getBanner() { - return banner; - } - - @Override - public int getCategory() { - return category; - } - - @Nullable - @Override - public String getClassLoaderName() { - return classLoaderName; - } - - @Nullable - @Override - public String getClassName() { - return className; - } - - @Override - public int getCompatibleWidthLimitDp() { - return compatibleWidthLimitDp; - } - - @Override - public int getDescriptionRes() { - return descriptionRes; - } - - @Override - public boolean isEnabled() { - return getBoolean(Booleans.ENABLED); - } - - @Override - public boolean isCrossProfile() { - return getBoolean(Booleans.CROSS_PROFILE); - } - - @Override - public int getFullBackupContent() { - return fullBackupContent; - } - - @Override - public int getDataExtractionRules() { - return dataExtractionRules; - } - - @Override - public int getIconRes() { - return iconRes; - } - - @Override - public int getInstallLocation() { - return installLocation; - } - - @Override - public int getLabelRes() { - return labelRes; - } - - @Override - public int getLargestWidthLimitDp() { - return largestWidthLimitDp; - } - - @Override - public int getLogo() { - return logo; - } - - @Nullable - @Override - public String getManageSpaceActivityName() { - return manageSpaceActivityName; - } - - @Override - public float getMaxAspectRatio() { - return maxAspectRatio; - } - - @Override - public float getMinAspectRatio() { - return minAspectRatio; - } - - @Nullable - @Override - public SparseIntArray getMinExtensionVersions() { - return minExtensionVersions; - } - - @Override - public int getMinSdkVersion() { - return minSdkVersion; - } - - @Override - public int getMaxSdkVersion() { - return maxSdkVersion; - } - - @Override - public int getNetworkSecurityConfigRes() { - return networkSecurityConfigRes; - } - - @Nullable - @Override - public CharSequence getNonLocalizedLabel() { - return nonLocalizedLabel; - } - - @Nullable - @Override - public String getPermission() { - return permission; - } - - @Override - public int getRequiresSmallestWidthDp() { - return requiresSmallestWidthDp; - } - - @Override - public int getRoundIconRes() { - return roundIconRes; - } - - @Override - public int getTargetSdkVersion() { - return targetSdkVersion; - } - - @Override - public int getTargetSandboxVersion() { - return targetSandboxVersion; - } - - @Nullable - @Override - public String getTaskAffinity() { - return taskAffinity; - } - - @Override - public int getTheme() { - return theme; - } - - @Override - public int getUiOptions() { - return uiOptions; - } - - @Nullable - @Override - public String getZygotePreloadName() { - return zygotePreloadName; - } - - @Override - public boolean isExternalStorage() { - return getBoolean(Booleans.EXTERNAL_STORAGE); - } - - @Override - public boolean isBaseHardwareAccelerated() { - return getBoolean(Booleans.BASE_HARDWARE_ACCELERATED); - } - - @Override - public boolean isAllowBackup() { - return getBoolean(Booleans.ALLOW_BACKUP); - } - - @Override - public boolean isKillAfterRestore() { - return getBoolean(Booleans.KILL_AFTER_RESTORE); - } - - @Override - public boolean isRestoreAnyVersion() { - return getBoolean(Booleans.RESTORE_ANY_VERSION); - } - - @Override - public boolean isFullBackupOnly() { - return getBoolean(Booleans.FULL_BACKUP_ONLY); - } - - @Override - public boolean isPersistent() { - return getBoolean(Booleans.PERSISTENT); - } - - @Override - public boolean isDebuggable() { - return getBoolean(Booleans.DEBUGGABLE); - } - - @Override - public boolean isVmSafeMode() { - return getBoolean(Booleans.VM_SAFE_MODE); - } - - @Override - public boolean isHasCode() { - return getBoolean(Booleans.HAS_CODE); - } - - @Override - public boolean isAllowTaskReparenting() { - return getBoolean(Booleans.ALLOW_TASK_REPARENTING); - } - - @Override - public boolean isAllowClearUserData() { - return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA); - } - - @Override - public boolean isLargeHeap() { - return getBoolean(Booleans.LARGE_HEAP); - } - - @Override - public boolean isUsesCleartextTraffic() { - return getBoolean(Booleans.USES_CLEARTEXT_TRAFFIC); - } - - @Override - public boolean isSupportsRtl() { - return getBoolean(Booleans.SUPPORTS_RTL); - } - - @Override - public boolean isTestOnly() { - return getBoolean(Booleans.TEST_ONLY); - } - - @Override - public boolean isMultiArch() { - return getBoolean(Booleans.MULTI_ARCH); - } - - @Override - public boolean isExtractNativeLibs() { - return getBoolean(Booleans.EXTRACT_NATIVE_LIBS); - } - - @Override - public boolean isGame() { - return getBoolean(Booleans.GAME); - } - - /** - * @see ParsingPackageRead#getResizeableActivity() - */ - @Nullable - @Override - public Boolean getResizeableActivity() { - return resizeableActivity; - } - - @Override - public boolean isStaticSharedLibrary() { - return getBoolean(Booleans.STATIC_SHARED_LIBRARY); - } - - @Override - public boolean isSdkLibrary() { - return getBoolean(Booleans.SDK_LIBRARY); - } - - @Override - public boolean isOverlay() { - return getBoolean(Booleans.OVERLAY); - } - - @Override - public boolean isIsolatedSplitLoading() { - return getBoolean(Booleans.ISOLATED_SPLIT_LOADING); - } - - @Override - public boolean isHasDomainUrls() { - return getBoolean(Booleans.HAS_DOMAIN_URLS); - } - - @Override - public boolean isProfileableByShell() { - return isProfileable() && getBoolean(Booleans.PROFILEABLE_BY_SHELL); - } - - @Override - public boolean isProfileable() { - return !getBoolean(Booleans.DISALLOW_PROFILING); - } - - @Override - public boolean isBackupInForeground() { - return getBoolean(Booleans.BACKUP_IN_FOREGROUND); - } - - @Override - public boolean isUseEmbeddedDex() { - return getBoolean(Booleans.USE_EMBEDDED_DEX); - } - - @Override - public boolean isDefaultToDeviceProtectedStorage() { - return getBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE); - } - - @Override - public boolean isDirectBootAware() { - return getBoolean(Booleans.DIRECT_BOOT_AWARE); - } - - @ApplicationInfo.GwpAsanMode - @Override - public int getGwpAsanMode() { - return gwpAsanMode; - } - - @ApplicationInfo.MemtagMode - @Override - public int getMemtagMode() { - return memtagMode; - } - - @ApplicationInfo.NativeHeapZeroInitialized - @Override - public int getNativeHeapZeroInitialized() { - return nativeHeapZeroInitialized; - } - - @Override - public int getLocaleConfigRes() { - return mLocaleConfigRes; - } - - @Nullable - @Override - public Boolean hasRequestRawExternalStorageAccess() { - return requestRawExternalStorageAccess; - } - - @Override - public boolean isPartiallyDirectBootAware() { - return getBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE); - } - - @Override - public boolean isResizeableActivityViaSdkVersion() { - return getBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION); - } - - @Override - public boolean isAllowClearUserDataOnFailedRestore() { - return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE); - } - - @Override - public boolean isAllowAudioPlaybackCapture() { - return getBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE); - } - - @Override - public boolean isRequestLegacyExternalStorage() { - return getBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE); - } - - @Override - public boolean isUsesNonSdkApi() { - return getBoolean(Booleans.USES_NON_SDK_API); - } - - @Override - public boolean isHasFragileUserData() { - return getBoolean(Booleans.HAS_FRAGILE_USER_DATA); - } - - @Override - public boolean isCantSaveState() { - return getBoolean(Booleans.CANT_SAVE_STATE); - } - - @Override - public boolean isAllowNativeHeapPointerTagging() { - return getBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING); - } - - @Override - public int getAutoRevokePermissions() { - return autoRevokePermissions; - } - - @Override - public boolean hasPreserveLegacyExternalStorage() { - return getBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE); - } - - @Override - public boolean hasRequestForegroundServiceExemption() { - return getBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION); - } - - @Override - public boolean areAttributionsUserVisible() { - return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE); - } - - @Override - public boolean isResetEnabledSettingsOnAppDataCleared() { - return getBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED); - } - - @NonNull - @Override - public Set getKnownActivityEmbeddingCerts() { - return mKnownActivityEmbeddingCerts == null ? Collections.emptySet() - : mKnownActivityEmbeddingCerts; - } - - @Override - public boolean isOnBackInvokedCallbackEnabled() { - return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK); - } - - @Override - public boolean isLeavingSharedUid() { - return getBoolean(Booleans.LEAVING_SHARED_UID); - } - - @Override - public ParsingPackageImpl setBaseRevisionCode(int value) { - baseRevisionCode = value; - return this; - } - - @Override - public ParsingPackageImpl setCompileSdkVersion(int value) { - compileSdkVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setRequiredForAllUsers(boolean value) { - return setBoolean(Booleans.REQUIRED_FOR_ALL_USERS, value); - } - - @Override - public ParsingPackageImpl setOverlayPriority(int value) { - overlayPriority = value; - return this; - } - - @Override - public ParsingPackageImpl setOverlayIsStatic(boolean value) { - return setBoolean(Booleans.OVERLAY_IS_STATIC, value); - } - - @Override - public ParsingPackageImpl setStaticSharedLibVersion(long value) { - staticSharedLibVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setSharedUserLabel(int value) { - sharedUserLabel = value; - return this; - } - - @Override - public ParsingPackageImpl setRestrictUpdateHash(@Nullable byte... value) { - restrictUpdateHash = value; - return this; - } - - @Override - public ParsingPackageImpl setUpgradeKeySets(@NonNull Set value) { - upgradeKeySets = value; - return this; - } - - @Override - public ParsingPackageImpl setProcesses(@NonNull Map value) { - processes = value; - return this; - } - - @Override - public ParsingPackageImpl setMetaData(@Nullable Bundle value) { - metaData = value; - return this; - } - - @Override - public ParsingPackageImpl setSigningDetails(@NonNull SigningDetails value) { - signingDetails = value; - return this; - } - - @Override - public ParsingPackageImpl setUse32BitAbi(boolean value) { - return setBoolean(Booleans.USE_32_BIT_ABI, value); - } - - @Override - public ParsingPackageImpl setVisibleToInstantApps(boolean value) { - return setBoolean(Booleans.VISIBLE_TO_INSTANT_APPS, value); - } - - @Override - public ParsingPackageImpl setForceQueryable(boolean value) { - return setBoolean(Booleans.FORCE_QUERYABLE, value); - } - - @Override - public ParsingPackageImpl setBanner(int value) { - banner = value; - return this; - } - - @Override - public ParsingPackageImpl setCategory(int value) { - category = value; - return this; - } - - @Override - public ParsingPackageImpl setCompatibleWidthLimitDp(int value) { - compatibleWidthLimitDp = value; - return this; - } - - @Override - public ParsingPackageImpl setDescriptionRes(int value) { - descriptionRes = value; - return this; - } - - @Override - public ParsingPackageImpl setEnabled(boolean value) { - return setBoolean(Booleans.ENABLED, value); - } - - @Override - public ParsingPackageImpl setCrossProfile(boolean value) { - return setBoolean(Booleans.CROSS_PROFILE, value); - } - - @Override - public ParsingPackageImpl setFullBackupContent(int value) { - fullBackupContent = value; - return this; - } - - @Override - public ParsingPackageImpl setDataExtractionRules(int value) { - dataExtractionRules = value; - return this; - } - - @Override - public ParsingPackageImpl setIconRes(int value) { - iconRes = value; - return this; - } - - @Override - public ParsingPackageImpl setInstallLocation(int value) { - installLocation = value; - return this; - } - - @Override - public ParsingPackageImpl setLeavingSharedUid(boolean value) { - return setBoolean(Booleans.LEAVING_SHARED_UID, value); - } - - @Override - public ParsingPackageImpl setLabelRes(int value) { - labelRes = value; - return this; - } - - @Override - public ParsingPackageImpl setLargestWidthLimitDp(int value) { - largestWidthLimitDp = value; - return this; - } - - @Override - public ParsingPackageImpl setLogo(int value) { - logo = value; - return this; - } - - @Override - public ParsingPackageImpl setMaxAspectRatio(float value) { - maxAspectRatio = value; - return this; - } - - @Override - public ParsingPackageImpl setMinAspectRatio(float value) { - minAspectRatio = value; - return this; - } - - @Override - public ParsingPackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) { - minExtensionVersions = value; - return this; - } - - @Override - public ParsingPackageImpl setMinSdkVersion(int value) { - minSdkVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setMaxSdkVersion(int value) { - maxSdkVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setNetworkSecurityConfigRes(int value) { - networkSecurityConfigRes = value; - return this; - } - - @Override - public ParsingPackageImpl setRequiresSmallestWidthDp(int value) { - requiresSmallestWidthDp = value; - return this; - } - - @Override - public ParsingPackageImpl setRoundIconRes(int value) { - roundIconRes = value; - return this; - } - - @Override - public ParsingPackageImpl setTargetSandboxVersion(int value) { - targetSandboxVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setTargetSdkVersion(int value) { - targetSdkVersion = value; - return this; - } - - @Override - public ParsingPackageImpl setTheme(int value) { - theme = value; - return this; - } - - @Override - public ParsingPackageImpl setRequestForegroundServiceExemption(boolean value) { - return setBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION, value); - } - - @Override - public ParsingPackageImpl setUiOptions(int value) { - uiOptions = value; - return this; - } - - @Override - public ParsingPackageImpl setExternalStorage(boolean value) { - return setBoolean(Booleans.EXTERNAL_STORAGE, value); - } - - @Override - public ParsingPackageImpl setBaseHardwareAccelerated(boolean value) { - return setBoolean(Booleans.BASE_HARDWARE_ACCELERATED, value); - } - - @Override - public ParsingPackageImpl setAllowBackup(boolean value) { - return setBoolean(Booleans.ALLOW_BACKUP, value); - } - - @Override - public ParsingPackageImpl setKillAfterRestore(boolean value) { - return setBoolean(Booleans.KILL_AFTER_RESTORE, value); - } - - @Override - public ParsingPackageImpl setRestoreAnyVersion(boolean value) { - return setBoolean(Booleans.RESTORE_ANY_VERSION, value); - } - - @Override - public ParsingPackageImpl setFullBackupOnly(boolean value) { - return setBoolean(Booleans.FULL_BACKUP_ONLY, value); - } - - @Override - public ParsingPackageImpl setPersistent(boolean value) { - return setBoolean(Booleans.PERSISTENT, value); - } - - @Override - public ParsingPackageImpl setDebuggable(boolean value) { - return setBoolean(Booleans.DEBUGGABLE, value); - } - - @Override - public ParsingPackageImpl setVmSafeMode(boolean value) { - return setBoolean(Booleans.VM_SAFE_MODE, value); - } - - @Override - public ParsingPackageImpl setHasCode(boolean value) { - return setBoolean(Booleans.HAS_CODE, value); - } - - @Override - public ParsingPackageImpl setAllowTaskReparenting(boolean value) { - return setBoolean(Booleans.ALLOW_TASK_REPARENTING, value); - } - - @Override - public ParsingPackageImpl setAllowClearUserData(boolean value) { - return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA, value); - } - - @Override - public ParsingPackageImpl setLargeHeap(boolean value) { - return setBoolean(Booleans.LARGE_HEAP, value); - } - - @Override - public ParsingPackageImpl setUsesCleartextTraffic(boolean value) { - return setBoolean(Booleans.USES_CLEARTEXT_TRAFFIC, value); - } - - @Override - public ParsingPackageImpl setSupportsRtl(boolean value) { - return setBoolean(Booleans.SUPPORTS_RTL, value); - } - - @Override - public ParsingPackageImpl setTestOnly(boolean value) { - return setBoolean(Booleans.TEST_ONLY, value); - } - - @Override - public ParsingPackageImpl setMultiArch(boolean value) { - return setBoolean(Booleans.MULTI_ARCH, value); - } - - @Override - public ParsingPackageImpl setExtractNativeLibs(boolean value) { - return setBoolean(Booleans.EXTRACT_NATIVE_LIBS, value); - } - - @Override - public ParsingPackageImpl setGame(boolean value) { - return setBoolean(Booleans.GAME, value); - } - - /** - * @see ParsingPackageRead#getResizeableActivity() - */ - @Override - public ParsingPackageImpl setResizeableActivity(@Nullable Boolean value) { - resizeableActivity = value; - return this; - } - - @Override - public ParsingPackageImpl setSdkLibName(String sdkLibName) { - this.sdkLibName = TextUtils.safeIntern(sdkLibName); - return this; - } - - @Override - public ParsingPackageImpl setSdkLibVersionMajor(int sdkLibVersionMajor) { - this.sdkLibVersionMajor = sdkLibVersionMajor; - return this; - } - - @Override - public ParsingPackageImpl setSdkLibrary(boolean value) { - return setBoolean(Booleans.SDK_LIBRARY, value); - } - - @Override - public ParsingPackageImpl setStaticSharedLibrary(boolean value) { - return setBoolean(Booleans.STATIC_SHARED_LIBRARY, value); - } - - @Override - public ParsingPackageImpl setOverlay(boolean value) { - return setBoolean(Booleans.OVERLAY, value); - } - - @Override - public ParsingPackageImpl setIsolatedSplitLoading(boolean value) { - return setBoolean(Booleans.ISOLATED_SPLIT_LOADING, value); - } - - @Override - public ParsingPackageImpl setHasDomainUrls(boolean value) { - return setBoolean(Booleans.HAS_DOMAIN_URLS, value); - } - - @Override - public ParsingPackageImpl setProfileableByShell(boolean value) { - return setBoolean(Booleans.PROFILEABLE_BY_SHELL, value); - } - - @Override - public ParsingPackageImpl setProfileable(boolean value) { - return setBoolean(Booleans.DISALLOW_PROFILING, !value); - } - - @Override - public ParsingPackageImpl setBackupInForeground(boolean value) { - return setBoolean(Booleans.BACKUP_IN_FOREGROUND, value); - } - - @Override - public ParsingPackageImpl setUseEmbeddedDex(boolean value) { - return setBoolean(Booleans.USE_EMBEDDED_DEX, value); - } - - @Override - public ParsingPackageImpl setDefaultToDeviceProtectedStorage(boolean value) { - return setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE, value); - } - - @Override - public ParsingPackageImpl setDirectBootAware(boolean value) { - return setBoolean(Booleans.DIRECT_BOOT_AWARE, value); - } - - @Override - public ParsingPackageImpl setGwpAsanMode(@ApplicationInfo.GwpAsanMode int value) { - gwpAsanMode = value; - return this; - } - - @Override - public ParsingPackageImpl setMemtagMode(@ApplicationInfo.MemtagMode int value) { - memtagMode = value; - return this; - } - - @Override - public ParsingPackageImpl setNativeHeapZeroInitialized( - @ApplicationInfo.NativeHeapZeroInitialized int value) { - nativeHeapZeroInitialized = value; - return this; - } - - @Override - public ParsingPackageImpl setRequestRawExternalStorageAccess(@Nullable Boolean value) { - requestRawExternalStorageAccess = value; - return this; - } - @Override - public ParsingPackageImpl setPartiallyDirectBootAware(boolean value) { - return setBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE, value); - } - - @Override - public ParsingPackageImpl setResizeableActivityViaSdkVersion(boolean value) { - return setBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION, value); - } - - @Override - public ParsingPackageImpl setAllowClearUserDataOnFailedRestore(boolean value) { - return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, value); - } - - @Override - public ParsingPackageImpl setAllowAudioPlaybackCapture(boolean value) { - return setBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE, value); - } - - @Override - public ParsingPackageImpl setRequestLegacyExternalStorage(boolean value) { - return setBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE, value); - } - - @Override - public ParsingPackageImpl setUsesNonSdkApi(boolean value) { - return setBoolean(Booleans.USES_NON_SDK_API, value); - } - - @Override - public ParsingPackageImpl setHasFragileUserData(boolean value) { - return setBoolean(Booleans.HAS_FRAGILE_USER_DATA, value); - } - - @Override - public ParsingPackageImpl setCantSaveState(boolean value) { - return setBoolean(Booleans.CANT_SAVE_STATE, value); - } - - @Override - public ParsingPackageImpl setAllowNativeHeapPointerTagging(boolean value) { - return setBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING, value); - } - - @Override - public ParsingPackageImpl setAutoRevokePermissions(int value) { - autoRevokePermissions = value; - return this; - } - - @Override - public ParsingPackageImpl setPreserveLegacyExternalStorage(boolean value) { - return setBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE, value); - } - - @Override - public ParsingPackageImpl setVersionName(String versionName) { - this.versionName = versionName; - return this; - } - - @Override - public ParsingPackage setCompileSdkVersionCodeName(String compileSdkVersionCodeName) { - this.compileSdkVersionCodeName = compileSdkVersionCodeName; - return this; - } - - @Override - public ParsingPackageImpl setProcessName(String processName) { - this.processName = processName; - return this; - } - - @Override - public ParsingPackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) { - this.restrictedAccountType = restrictedAccountType; - return this; - } - - @Override - public ParsingPackageImpl setOverlayTargetOverlayableName( - @Nullable String overlayTargetOverlayableName) { - this.overlayTargetOverlayableName = overlayTargetOverlayableName; - return this; - } - - @Override - public ParsingPackageImpl setOverlayCategory(@Nullable String overlayCategory) { - this.overlayCategory = overlayCategory; - return this; - } - - @Override - public ParsingPackageImpl setAppComponentFactory(@Nullable String appComponentFactory) { - this.appComponentFactory = appComponentFactory; - return this; - } - - @Override - public ParsingPackageImpl setBackupAgentName(@Nullable String backupAgentName) { - this.backupAgentName = backupAgentName; - return this; - } - - @Override - public ParsingPackageImpl setClassLoaderName(@Nullable String classLoaderName) { - this.classLoaderName = classLoaderName; - return this; - } - - @Override - public ParsingPackageImpl setClassName(@Nullable String className) { - this.className = className == null ? null : className.trim(); - return this; - } - - @Override - public ParsingPackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) { - this.manageSpaceActivityName = manageSpaceActivityName; - return this; - } - - @Override - public ParsingPackageImpl setPermission(@Nullable String permission) { - this.permission = permission; - return this; - } - - @Override - public ParsingPackageImpl setTaskAffinity(@Nullable String taskAffinity) { - this.taskAffinity = taskAffinity; - return this; - } - - @Override - public ParsingPackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) { - this.zygotePreloadName = zygotePreloadName; - return this; - } - - @Override - public ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible) { - setBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE, attributionsAreUserVisible); - return this; - } - - @Override - public ParsingPackage setResetEnabledSettingsOnAppDataCleared( - boolean resetEnabledSettingsOnAppDataCleared) { - setBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED, - resetEnabledSettingsOnAppDataCleared); - return this; - } - - @Override - public ParsingPackageImpl setLocaleConfigRes(int value) { - mLocaleConfigRes = value; - return this; - } - - @Override - public ParsingPackage setKnownActivityEmbeddingCerts( - @Nullable Set knownEmbeddingCerts) { - mKnownActivityEmbeddingCerts = knownEmbeddingCerts; - return this; - } - - @Override - public ParsingPackage setOnBackInvokedCallbackEnabled(boolean value) { - setBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK, value); - return this; - } -} diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt index aa05319a701a5..391dd36fc9899 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/parsing/parcelling/AndroidPackageTest.kt @@ -62,16 +62,20 @@ class AndroidPackageTest : ParcelableComponentTest(AndroidPackage::class, Packag "toAppInfoToString", "toAppInfoWithoutState", "toAppInfoWithoutStateWithoutFlags", + "addMimeGroupsFromComponent", "assignDerivedFields", "assignDerivedFields2", "buildFakeForDeletion", + "buildAppClassNamesByProcess", "capPermissionPriorities", "forParsing", "forTesting", "getBaseAppDataCredentialProtectedDirForSystemUser", "getBaseAppDataDeviceProtectedDirForSystemUser", "getBoolean", + "getBoolean2", "setBoolean", + "setBoolean2", "hideAsFinal", "hideAsParsed", "markNotActivitiesAsNotExportedIfSingleUser", From ea6e9c6974be6e80264a5d6bf756b6ae63bc7436 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Mon, 1 Aug 2022 20:28:49 +0000 Subject: [PATCH 3/4] Remove ParsingPackageRead This was only really in effect for one signatures utility, but makes the interface hierarchy much more confusing, so this removes it and just readjusts the utility to take in different types. Test: atest AppsFilterImplTest Test: atest PackageManagerTests Test: atest PackageParserTest Test: atest PackageParserLegacyCoreTest Test: atest PackageParsingDeferErrorTest Test: atest AppIntegrityManagerServiceImplTest Test: atest GtsAppIntegrityManagerTests Test: atest CtsAppIntegrityDeviceTestCases Change-Id: I59c0a7ed2237b2c094fe8088f853ca0ddc80ee97 --- .../AppIntegrityManagerServiceImpl.java | 96 +- .../server/pm/parsing/PackageInfoUtils.java | 7 +- .../server/pm/parsing/pkg/AndroidPackage.java | 1145 ++++++++++++++++- .../pm/parsing/pkg/AndroidPackageUtils.java | 27 +- .../server/pm/parsing/pkg/PackageImpl.java | 9 +- .../server/pm/parsing/pkg/PkgAppInfo.java | 111 -- .../server/pm/parsing/pkg/PkgPackageInfo.java | 42 - .../server/pm/pkg/AndroidPackageApi.java | 278 ++-- .../server/pm/pkg/PackageUserStateUtils.java | 4 +- .../server/pm/pkg/parsing/ParsingPackage.java | 142 +- .../pm/pkg/parsing/ParsingPackageHidden.java | 2 +- .../pkg/parsing/ParsingPackageInternal.java | 67 - .../pm/pkg/parsing/ParsingPackageRead.java | 366 ------ .../pm/pkg/parsing/ParsingPackageUtils.java | 74 +- .../pkg/parsing/PkgWithoutStateAppInfo.java | 659 ---------- .../parsing/PkgWithoutStatePackageInfo.java | 272 ---- .../android/server/pm/AppsFilterImplTest.java | 58 +- .../server/pm/PackageManagerTests.java | 25 +- .../android/server/pm/PackageParserTest.java | 6 +- .../parsing/PackageParserLegacyCoreTest.java | 6 +- .../parsing/PackageParsingDeferErrorTest.kt | 3 +- 21 files changed, 1613 insertions(+), 1786 deletions(-) delete mode 100644 services/core/java/com/android/server/pm/parsing/pkg/PkgAppInfo.java delete mode 100644 services/core/java/com/android/server/pm/parsing/pkg/PkgPackageInfo.java delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageInternal.java delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStateAppInfo.java delete mode 100644 services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStatePackageInfo.java diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index 025ccd172ea9a..991930fd049fd 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -44,7 +44,6 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; import android.content.pm.Signature; import android.content.pm.SigningDetails; -import android.content.pm.SigningInfo; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.net.Uri; @@ -52,23 +51,21 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; -import android.os.UserHandle; import android.provider.Settings; +import android.util.Pair; import android.util.Slog; import android.util.apk.SourceStampVerificationResult; import android.util.apk.SourceStampVerifier; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; import com.android.server.integrity.engine.RuleEvaluationEngine; import com.android.server.integrity.model.IntegrityCheckResult; import com.android.server.integrity.model.RuleMetadata; -import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.PackageParser2; -import com.android.server.pm.parsing.pkg.ParsedPackage; -import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import java.io.ByteArrayInputStream; @@ -297,8 +294,9 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME); - PackageInfo packageInfo = getPackageArchiveInfo(intent.getData()); - if (packageInfo == null) { + Pair packageSigningAndMetadata = + getPackageSigningAndMetadata(intent.getData()); + if (packageSigningAndMetadata == null) { Slog.w(TAG, "Cannot parse package " + packageName); // We can't parse the package. mPackageManagerInternal.setIntegrityVerificationResult( @@ -306,8 +304,9 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { return; } - List appCertificates = getCertificateFingerprint(packageInfo); - List appCertificateLineage = getCertificateLineage(packageInfo); + var signingDetails = packageSigningAndMetadata.first; + List appCertificates = getCertificateFingerprint(packageName, signingDetails); + List appCertificateLineage = getCertificateLineage(packageName, signingDetails); List installerCertificates = getInstallerCertificateFingerprint(installerPackageName); @@ -320,7 +319,10 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { builder.setInstallerName(getPackageNameNormalized(installerPackageName)); builder.setInstallerCertificates(installerCertificates); builder.setIsPreInstalled(isSystemApp(packageName)); - builder.setAllowedInstallersAndCert(getAllowedInstallers(packageInfo)); + + Map allowedInstallers = + getAllowedInstallers(packageSigningAndMetadata.second); + builder.setAllowedInstallersAndCert(allowedInstallers); extractSourceStamp(intent.getData(), builder); AppInstallMetadata appInstallMetadata = builder.build(); @@ -331,7 +333,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { "To be verified: " + appInstallMetadata + " installers " - + getAllowedInstallers(packageInfo)); + + allowedInstallers); } IntegrityCheckResult result = mEvaluationEngine.evaluate(appInstallMetadata); if (!result.getMatchedRules().isEmpty() || DEBUG_INTEGRITY_COMPONENT) { @@ -443,38 +445,37 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { if (installer.equals(ADB_INSTALLER) || installer.equals(UNKNOWN_INSTALLER)) { return Collections.emptyList(); } - try { - PackageInfo installerInfo = - mContext.getPackageManager() - .getPackageInfo(installer, PackageManager.GET_SIGNING_CERTIFICATES); - return getCertificateFingerprint(installerInfo); - } catch (PackageManager.NameNotFoundException e) { + var installerPkg = mPackageManagerInternal.getPackage(installer); + if (installerPkg == null) { Slog.w(TAG, "Installer package " + installer + " not found."); return Collections.emptyList(); } + return getCertificateFingerprint(installerPkg.getPackageName(), + installerPkg.getSigningDetails()); } - private List getCertificateFingerprint(@NonNull PackageInfo packageInfo) { + private List getCertificateFingerprint(@NonNull String packageName, + @NonNull SigningDetails signingDetails) { ArrayList certificateFingerprints = new ArrayList(); - for (Signature signature : getSignatures(packageInfo)) { + for (Signature signature : getSignatures(packageName, signingDetails)) { certificateFingerprints.add(getFingerprint(signature)); } return certificateFingerprints; } - private List getCertificateLineage(@NonNull PackageInfo packageInfo) { + private List getCertificateLineage(@NonNull String packageName, + @NonNull SigningDetails signingDetails) { ArrayList certificateLineage = new ArrayList(); - for (Signature signature : getSignatureLineage(packageInfo)) { + for (Signature signature : getSignatureLineage(packageName, signingDetails)) { certificateLineage.add(getFingerprint(signature)); } return certificateLineage; } /** Get the allowed installers and their associated certificate hashes from tag. */ - private Map getAllowedInstallers(@NonNull PackageInfo packageInfo) { + private Map getAllowedInstallers(@Nullable Bundle metaData) { Map packageCertMap = new HashMap<>(); - if (packageInfo.applicationInfo != null && packageInfo.applicationInfo.metaData != null) { - Bundle metaData = packageInfo.applicationInfo.metaData; + if (metaData != null) { String allowedInstallers = metaData.getString(ALLOWED_INSTALLERS_METADATA_NAME); if (allowedInstallers != null) { // parse the metadata for certs. @@ -540,32 +541,25 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { } } - private static Signature[] getSignatures(@NonNull PackageInfo packageInfo) { - SigningInfo signingInfo = packageInfo.signingInfo; - - if (signingInfo == null || signingInfo.getApkContentsSigners().length < 1) { - throw new IllegalArgumentException("Package signature not found in " + packageInfo); + private static Signature[] getSignatures(@NonNull String packageName, + @NonNull SigningDetails signingDetails) { + Signature[] signatures = signingDetails.getSignatures(); + if (signatures == null || signatures.length < 1) { + throw new IllegalArgumentException("Package signature not found in " + packageName); } // We are only interested in evaluating the active signatures. - return signingInfo.getApkContentsSigners(); + return signatures; } - private static Signature[] getSignatureLineage(@NonNull PackageInfo packageInfo) { - // Obtain the signing info of the package. - SigningInfo signingInfo = packageInfo.signingInfo; - if (signingInfo == null) { - throw new IllegalArgumentException( - "Package signature not found in " + packageInfo); - } - + private static Signature[] getSignatureLineage(@NonNull String packageName, + @NonNull SigningDetails signingDetails) { // Obtain the active signatures of the package. - Signature[] signatureLineage = getSignatures(packageInfo); + Signature[] signatureLineage = getSignatures(packageName, signingDetails); + var pastSignatures = signingDetails.getPastSigningCertificates(); // Obtain the past signatures of the package. - if (!signingInfo.hasMultipleSigners() && signingInfo.hasPastSigningCertificates()) { - Signature[] pastSignatures = signingInfo.getSigningCertificateHistory(); - + if (signatureLineage.length == 1 && !ArrayUtils.isEmpty(pastSignatures)) { // Merge the signatures and return. Signature[] allSignatures = new Signature[signatureLineage.length + pastSignatures.length]; @@ -614,15 +608,15 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { } } - private PackageInfo getPackageArchiveInfo(Uri dataUri) { + @Nullable + private Pair getPackageSigningAndMetadata(Uri dataUri) { File installationPath = getInstallationPath(dataUri); if (installationPath == null) { throw new IllegalArgumentException("Installation path is null, package not found"); } try (PackageParser2 parser = mParserSupplier.get()) { - ParsedPackage pkg = parser.parsePackage(installationPath, 0, false); - int flags = PackageManager.GET_SIGNING_CERTIFICATES | PackageManager.GET_META_DATA; + var pkg = parser.parsePackage(installationPath, 0, false); // APK signatures is already verified elsewhere in PackageManager. We do not need to // verify it again since it could cause a timeout for large APKs. final ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); @@ -632,17 +626,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { Slog.w(TAG, result.getErrorMessage(), result.getException()); return null; } - pkg.setSigningDetails(result.getResult()); - return PackageInfoUtils.generate( - pkg, - null, - flags, - 0, - 0, - null, - PackageUserStateInternal.DEFAULT, - UserHandle.getCallingUserId(), - null); + return Pair.create(result.getResult(), pkg.getMetaData()); } catch (Exception e) { Slog.w(TAG, "Exception reading " + dataUri, e); return null; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index 5adad30fbc7ac..5be81d5700e04 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -75,7 +75,6 @@ import com.android.server.pm.pkg.component.ParsedProcess; import com.android.server.pm.pkg.component.ParsedProvider; import com.android.server.pm.pkg.component.ParsedService; import com.android.server.pm.pkg.component.ParsedUsesPermission; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.pkg.parsing.ParsingUtils; @@ -142,7 +141,7 @@ public class PackageInfoUtils { PackageInfo info = new PackageInfo(); info.packageName = pkg.getPackageName(); info.splitNames = pkg.getSplitNames(); - ParsingPackageUtils.fillVersionCodes(pkg, info); + AndroidPackageUtils.fillVersionCodes(pkg, info); info.baseRevisionCode = pkg.getBaseRevisionCode(); info.splitRevisionCodes = pkg.getSplitRevisionCodes(); info.versionName = pkg.getVersionName(); @@ -462,7 +461,7 @@ public class PackageInfoUtils { } // Make shallow copy so we can store the metadata/libraries safely - ApplicationInfo info = ParsingPackageUtils.toAppInfoWithoutState(pkg); + ApplicationInfo info = AndroidPackageUtils.toAppInfoWithoutState(pkg); updateApplicationInfo(info, flags, state); @@ -1100,7 +1099,7 @@ public class PackageInfoUtils { } @NonNull - public static File getDataDir(ParsingPackageRead pkg, int userId) { + public static File getDataDir(AndroidPackage pkg, int userId) { if ("android".equals(pkg.getPackageName())) { return Environment.getDataSystemDirectory(); } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java index b357ba0a6b4b9..ec7dcd8280f43 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java @@ -17,11 +17,48 @@ package com.android.server.pm.parsing.pkg; import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ConfigurationInfo; +import android.content.pm.FeatureGroupInfo; +import android.content.pm.FeatureInfo; +import android.content.pm.InstrumentationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SigningDetails; +import android.os.Bundle; +import android.util.ArraySet; +import android.util.Pair; +import android.util.SparseArray; +import android.util.SparseIntArray; +import com.android.internal.R; import com.android.internal.content.om.OverlayConfig; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; - import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.PackageUserState; +import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedApexSystemService; +import com.android.server.pm.pkg.component.ParsedAttribution; +import com.android.server.pm.pkg.component.ParsedInstrumentation; +import com.android.server.pm.pkg.component.ParsedIntentInfo; +import com.android.server.pm.pkg.component.ParsedPermission; +import com.android.server.pm.pkg.component.ParsedPermissionGroup; +import com.android.server.pm.pkg.component.ParsedProcess; +import com.android.server.pm.pkg.component.ParsedProvider; +import com.android.server.pm.pkg.component.ParsedService; +import com.android.server.pm.pkg.component.ParsedUsesPermission; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; + +import java.security.PublicKey; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * The last state of a package during parsing/install before it is available in {@link @@ -33,8 +70,253 @@ import com.android.server.pm.pkg.AndroidPackageApi; * * @hide */ -public interface AndroidPackage extends ParsingPackageRead, AndroidPackageApi, - OverlayConfig.PackageProvider.Package { +public interface AndroidPackage extends AndroidPackageApi, OverlayConfig.PackageProvider.Package { + + /** + * @see ApplicationInfo#areAttributionsUserVisible() + * @see R.styleable#AndroidManifestApplication_attributionsAreUserVisible + */ + @Nullable + boolean areAttributionsUserVisible(); + + /** + * Set of Activities parsed from the manifest. + * + * This contains minimal system state and does not + * provide the same information as {@link ActivityInfo}. Effective state can be queried through + * {@link android.content.pm.PackageManager#getActivityInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ActivityInfo + * @see PackageInfo#activities + */ + @NonNull + @Override + List getActivities(); + + /** + * The names of packages to adopt ownership of permissions from, parsed under {@link + * ParsingPackageUtils#TAG_ADOPT_PERMISSIONS}. + * + * @see R.styleable#AndroidManifestOriginalPackage_name + */ + @NonNull + List getAdoptPermissions(); + + /** + * @see R.styleable#AndroidManifestApexSystemService + */ + @NonNull + List getApexSystemServices(); + + /** + * @see ApplicationInfo#appComponentFactory + * @see R.styleable#AndroidManifestApplication_appComponentFactory + */ + @Nullable + String getAppComponentFactory(); + + @NonNull + List getAttributions(); + + /** + * @see ApplicationInfo#AUTO_REVOKE_ALLOWED + * @see ApplicationInfo#AUTO_REVOKE_DISCOURAGED + * @see ApplicationInfo#AUTO_REVOKE_DISALLOWED + */ + int getAutoRevokePermissions(); + + /** + * @see ApplicationInfo#backupAgentName + * @see R.styleable#AndroidManifestApplication_backupAgent + */ + @Nullable + String getBackupAgentName(); + + /** + * @see ApplicationInfo#banner + * @see R.styleable#AndroidManifestApplication_banner + */ + int getBanner(); + + /** + * @see ApplicationInfo#sourceDir + * @see ApplicationInfo#getBaseCodePath + */ + @NonNull + String getBaseApkPath(); + + /** + * @see PackageInfo#baseRevisionCode + */ + int getBaseRevisionCode(); + + /** + * @see ApplicationInfo#category + * @see R.styleable#AndroidManifestApplication_appCategory + */ + int getCategory(); + + /** + * @see ApplicationInfo#classLoaderName + * @see R.styleable#AndroidManifestApplication_classLoader + */ + @Nullable + String getClassLoaderName(); + + /** + * @see ApplicationInfo#className + * @see R.styleable#AndroidManifestApplication_name + */ + @Nullable + String getClassName(); + + /** + * @see ApplicationInfo#compatibleWidthLimitDp + * @see R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp + */ + int getCompatibleWidthLimitDp(); + + /** + * @see ApplicationInfo#compileSdkVersion + * @see R.styleable#AndroidManifest_compileSdkVersion + */ + int getCompileSdkVersion(); + + /** + * @see ApplicationInfo#compileSdkVersionCodename + * @see R.styleable#AndroidManifest_compileSdkVersionCodename + */ + @Nullable + String getCompileSdkVersionCodeName(); + + /** + * @see PackageInfo#configPreferences + * @see R.styleable#AndroidManifestUsesConfiguration + */ + @NonNull + List getConfigPreferences(); + + /** + * @see ApplicationInfo#dataExtractionRulesRes + * @see R.styleable#AndroidManifestApplication_dataExtractionRules + */ + int getDataExtractionRules(); + + /** + * @see ApplicationInfo#descriptionRes + * @see R.styleable#AndroidManifestApplication_description + */ + int getDescriptionRes(); + + /** + * @see PackageInfo#featureGroups + * @see R.styleable#AndroidManifestUsesFeature + */ + @NonNull + List getFeatureGroups(); + + /** + * @see ApplicationInfo#fullBackupContent + * @see R.styleable#AndroidManifestApplication_fullBackupContent + */ + int getFullBackupContent(); + + /** + * @see ApplicationInfo#getGwpAsanMode() + * @see R.styleable#AndroidManifestApplication_gwpAsanMode + */ + @ApplicationInfo.GwpAsanMode + int getGwpAsanMode(); + + /** + * @see ApplicationInfo#iconRes + * @see R.styleable#AndroidManifestApplication_icon + */ + int getIconRes(); + + /** + * Permissions requested but not in the manifest. These may have been split or migrated from + * previous versions/definitions. + */ + @NonNull + List getImplicitPermissions(); + + /** + * @see ApplicationInfo#installLocation + * @see R.styleable#AndroidManifest_installLocation + */ + int getInstallLocation(); + + /** + * @see InstrumentationInfo + * @see PackageInfo#instrumentation + */ + @NonNull + List getInstrumentations(); + + /** + * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link + * ParsingPackageUtils#TAG_KEY_SETS}. + * + * @see R.styleable#AndroidManifestKeySet + * @see R.styleable#AndroidManifestPublicKey + */ + @NonNull + Map> getKeySetMapping(); + + /** + * @see ApplicationInfo#mKnownActivityEmbeddingCerts + * @see R.styleable#AndroidManifestApplication_knownActivityEmbeddingCerts + */ + @NonNull + Set getKnownActivityEmbeddingCerts(); + + /** + * @see ApplicationInfo#labelRes + * @see R.styleable#AndroidManifestApplication_label + */ + int getLabelRes(); + + /** + * @see ApplicationInfo#largestWidthLimitDp + * @see R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp + */ + int getLargestWidthLimitDp(); + + /** + * Library names this package is declared as, for use by other packages with "uses-library". + * + * @see R.styleable#AndroidManifestLibrary + */ + @NonNull + List getLibraryNames(); + + /** + * The resource ID used to provide the application's locales configuration. + * + * @see R.styleable#AndroidManifestApplication_localeConfig + */ + int getLocaleConfigRes(); + + /** + * @see ApplicationInfo#logo + * @see R.styleable#AndroidManifestApplication_logo + */ + int getLogo(); + + /** + * @see PackageInfo#getLongVersionCode() + */ + long getLongVersionCode(); + + /** + * @see ApplicationInfo#manageSpaceActivityName + * @see R.styleable#AndroidManifestApplication_manageSpaceActivity + */ + @Nullable + String getManageSpaceActivityName(); /** * The package name as declared in the manifest, since the package can be renamed. For example, @@ -42,4 +324,859 @@ public interface AndroidPackage extends ParsingPackageRead, AndroidPackageApi, */ @NonNull String getManifestPackageName(); + + /** + * @see ApplicationInfo#maxAspectRatio + * @see R.styleable#AndroidManifestApplication_maxAspectRatio + */ + float getMaxAspectRatio(); + + /** + * @see R.styleable#AndroidManifestUsesSdk_maxSdkVersion + */ + int getMaxSdkVersion(); + + /** + * @see ApplicationInfo#getMemtagMode() + * @see R.styleable#AndroidManifestApplication_memtagMode + */ + @ApplicationInfo.MemtagMode + int getMemtagMode(); + + /** + * TODO(b/135203078): Make all the Bundles immutable (and non-null by shared empty reference?) + */ + @Nullable + Bundle getMetaData(); + + @Nullable + Set getMimeGroups(); + + /** + * @see ApplicationInfo#minAspectRatio + * @see R.styleable#AndroidManifestApplication_minAspectRatio + */ + float getMinAspectRatio(); + + /** + * @see R.styleable#AndroidManifestExtensionSdk + */ + @Nullable + SparseIntArray getMinExtensionVersions(); + + /** + * @see ApplicationInfo#minSdkVersion + * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion + */ + int getMinSdkVersion(); + + /** + * @see ApplicationInfo#getNativeHeapZeroInitialized() + * @see R.styleable#AndroidManifestApplication_nativeHeapZeroInitialized + */ + @ApplicationInfo.NativeHeapZeroInitialized + int getNativeHeapZeroInitialized(); + + /** + * @see ApplicationInfo#networkSecurityConfigRes + * @see R.styleable#AndroidManifestApplication_networkSecurityConfig + */ + int getNetworkSecurityConfigRes(); + + /** + * If {@link R.styleable#AndroidManifestApplication_label} is a string literal, this is it. + * Otherwise, it's stored as {@link #getLabelRes()}. + * + * @see ApplicationInfo#nonLocalizedLabel + * @see R.styleable#AndroidManifestApplication_label + */ + @Nullable + CharSequence getNonLocalizedLabel(); + + /** + * For system use to migrate from an old package name to a new one, moving over data if + * available. + * + * @see R.styleable#AndroidManifestOriginalPackage} + */ + @NonNull + List getOriginalPackages(); + + /** + * Map of overlayable name to actor name. + */ + @NonNull + Map getOverlayables(); + + /** + * @see PackageInfo#overlayCategory + * @see R.styleable#AndroidManifestResourceOverlay_category + */ + @Nullable + String getOverlayCategory(); + + /** + * @see PackageInfo#overlayPriority + * @see R.styleable#AndroidManifestResourceOverlay_priority + */ + int getOverlayPriority(); + + /** + * @see PackageInfo#overlayTarget + * @see R.styleable#AndroidManifestResourceOverlay_targetPackage + */ + @Nullable + String getOverlayTarget(); + + /** + * @see PackageInfo#targetOverlayableName + * @see R.styleable#AndroidManifestResourceOverlay_targetName + */ + @Nullable + String getOverlayTargetOverlayableName(); + + /** + * @see PackageInfo#mOverlayIsStatic + */ + boolean isOverlayIsStatic(); + + /** + * @see PackageInfo#packageName + */ + String getPackageName(); + + /** + * @see ApplicationInfo#scanSourceDir + * @see ApplicationInfo#getCodePath + */ + @NonNull + String getPath(); + + /** + * @see ApplicationInfo#permission + * @see R.styleable#AndroidManifestApplication_permission + */ + @Nullable + String getPermission(); + + /** + * @see android.content.pm.PermissionGroupInfo + */ + @NonNull + List getPermissionGroups(); + + /** + * @see PermissionInfo + * @see PackageInfo#permissions + */ + @NonNull + List getPermissions(); + + /** + * Used to determine the default preferred handler of an {@link Intent}. + *

+ * Map of component className to intent info inside that component. TODO(b/135203078): Is this + * actually used/working? + */ + @NonNull + List> getPreferredActivityFilters(); + + /** + * @see ApplicationInfo#processName + * @see R.styleable#AndroidManifestApplication_process + */ + @NonNull + String getProcessName(); + + /** + * @see android.content.pm.ProcessInfo + */ + @NonNull + Map getProcesses(); + + /** + * Returns the properties set on the application + */ + @NonNull + Map getProperties(); + + /** + * System protected broadcasts. + * + * @see R.styleable#AndroidManifestProtectedBroadcast + */ + @NonNull + List getProtectedBroadcasts(); + + /** + * Set of {@link android.content.ContentProvider ContentProviders} parsed from the manifest. + * + * This contains minimal system state and does not + * provide the same information as {@link ProviderInfo}. Effective state can be queried through + * {@link PackageManager#getProviderInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ProviderInfo + * @see PackageInfo#providers + */ + @NonNull + List getProviders(); + + /** + * Intents that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesIntent + */ + @NonNull + List getQueriesIntents(); + + /** + * Other packages that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesPackage + */ + @NonNull + List getQueriesPackages(); + + /** + * Authorities that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesProvider + */ + @NonNull + Set getQueriesProviders(); + + /** + * Set of {@link android.content.BroadcastReceiver BroadcastReceivers} parsed from the manifest. + * + * This contains minimal system state and does not + * provide the same information as {@link ActivityInfo}. Effective state can be queried through + * {@link PackageManager#getReceiverInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * Since they share several attributes, receivers are parsed as {@link ParsedActivity}, even + * though they represent different functionality. + * + * TODO(b/135203078): Reconsider this and maybe make ParsedReceiver so it's not so confusing + * + * @see ActivityInfo + * @see PackageInfo#receivers + */ + @NonNull + List getReceivers(); + + /** + * @see PackageInfo#reqFeatures + * @see R.styleable#AndroidManifestUsesFeature + */ + @NonNull + List getRequestedFeatures(); + + /** + * All the permissions declared. This is an effective set, and may include permissions + * transformed from split/migrated permissions from previous versions, so may not be exactly + * what the package declares in its manifest. + * + * @see PackageInfo#requestedPermissions + * @see R.styleable#AndroidManifestUsesPermission + */ + @NonNull + List getRequestedPermissions(); + + /** + * @see PackageInfo#requiredAccountType + * @see R.styleable#AndroidManifestApplication_requiredAccountType + */ + @Nullable + String getRequiredAccountType(); + + /** + * @see ApplicationInfo#requiresSmallestWidthDp + * @see R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp + */ + int getRequiresSmallestWidthDp(); + + /** + * Whether or not the app requested explicitly resizeable Activities. Null value means nothing + * was explicitly requested. + * + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE + */ + @Nullable + Boolean getResizeableActivity(); + + /** + * SHA-512 hash of the only APK that can be used to update a system package. + * + * @see R.styleable#AndroidManifestRestrictUpdate + */ + @Nullable + byte[] getRestrictUpdateHash(); + + /** + * The restricted account authenticator type that is used by this application. + * + * @see PackageInfo#restrictedAccountType + * @see R.styleable#AndroidManifestApplication_restrictedAccountType + */ + @Nullable + String getRestrictedAccountType(); + + /** + * @see ApplicationInfo#roundIconRes + * @see R.styleable#AndroidManifestApplication_roundIcon + */ + int getRoundIconRes(); + + /** + * @see R.styleable#AndroidManifestSdkLibrary_name + */ + @Nullable + String getSdkLibName(); + + /** + * @see R.styleable#AndroidManifestSdkLibrary_versionMajor + */ + int getSdkLibVersionMajor(); + + /** + * Set of {@link android.app.Service Services} parsed from the manifest. + * + * This contains minimal system state and does not + * provide the same information as {@link ServiceInfo}. Effective state can be queried through + * {@link PackageManager#getServiceInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ServiceInfo + * @see PackageInfo#services + */ + @NonNull + List getServices(); + + /** + * @see PackageInfo#sharedUserId + * @see R.styleable#AndroidManifest_sharedUserId + */ + @Nullable + String getSharedUserId(); + + /** + * @see PackageInfo#sharedUserLabel + * @see R.styleable#AndroidManifest_sharedUserLabel + */ + int getSharedUserLabel(); + + /** + * The signature data of all APKs in this package, which must be exactly the same across the + * base and splits. + */ + @NonNull + SigningDetails getSigningDetails(); + + /** + * @see ApplicationInfo#splitClassLoaderNames + * @see R.styleable#AndroidManifestApplication_classLoader + */ + @Nullable + String[] getSplitClassLoaderNames(); + + /** + * @see ApplicationInfo#splitSourceDirs + * @see ApplicationInfo#getSplitCodePaths + */ + @NonNull + String[] getSplitCodePaths(); + + /** + * @see ApplicationInfo#splitDependencies + */ + @NonNull + SparseArray getSplitDependencies(); + + /** + * Flags of any split APKs; ordered by parsed splitName + */ + @Nullable + int[] getSplitFlags(); + + /** + * TODO(b/135203078): Move split stuff to an inner data class + * + * @see ApplicationInfo#splitNames + * @see PackageInfo#splitNames + */ + @NonNull + String[] getSplitNames(); + + /** + * @see PackageInfo#splitRevisionCodes + */ + @NonNull + int[] getSplitRevisionCodes(); + + /** + * @see R.styleable#AndroidManifestStaticLibrary_name + */ + @Nullable + String getStaticSharedLibName(); + + /** + * @see R.styleable#AndroidManifestStaticLibrary_version + */ + long getStaticSharedLibVersion(); + + /** + * @see ApplicationInfo#targetSandboxVersion + * @see R.styleable#AndroidManifest_targetSandboxVersion + */ + int getTargetSandboxVersion(); + + /** + * @see ApplicationInfo#targetSdkVersion + * @see R.styleable#AndroidManifestUsesSdk_targetSdkVersion + */ + int getTargetSdkVersion(); + + /** + * @see ApplicationInfo#taskAffinity + * @see R.styleable#AndroidManifestApplication_taskAffinity + */ + @Nullable + String getTaskAffinity(); + + /** + * @see ApplicationInfo#theme + * @see R.styleable#AndroidManifestApplication_theme + */ + int getTheme(); + + /** + * @see ApplicationInfo#uiOptions + * @see R.styleable#AndroidManifestApplication_uiOptions + */ + int getUiOptions(); + + /** + * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link + * ParsingPackageUtils#TAG_KEY_SETS}. + * + * @see R.styleable#AndroidManifestUpgradeKeySet + */ + @NonNull + Set getUpgradeKeySets(); + + /** + * @see R.styleable#AndroidManifestUsesLibrary + */ + @NonNull + List getUsesLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesNativeLibrary + */ + @NonNull + List getUsesNativeLibraries(); + + /** + * Like {@link #getUsesLibraries()}, but marked optional by setting {@link + * R.styleable#AndroidManifestUsesLibrary_required} to false . Application is expected to handle + * absence manually. + * + * @see R.styleable#AndroidManifestUsesLibrary + */ + @NonNull + List getUsesOptionalLibraries(); + + /** + * Like {@link #getUsesNativeLibraries()}, but marked optional by setting {@link + * R.styleable#AndroidManifestUsesNativeLibrary_required} to false . Application is expected to + * handle absence manually. + * + * @see R.styleable#AndroidManifestUsesNativeLibrary + */ + @NonNull + List getUsesOptionalNativeLibraries(); + + @NonNull + List getUsesPermissions(); + + /** + * TODO(b/135203078): Move SDK library stuff to an inner data class + * + * @see R.styleable#AndroidManifestUsesSdkLibrary + */ + @NonNull + List getUsesSdkLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesSdkLibrary_certDigest + */ + @Nullable + String[][] getUsesSdkLibrariesCertDigests(); + + /** + * @see R.styleable#AndroidManifestUsesSdkLibrary_versionMajor + */ + @Nullable + long[] getUsesSdkLibrariesVersionsMajor(); + + /** + * TODO(b/135203078): Move static library stuff to an inner data class + * + * @see R.styleable#AndroidManifestUsesStaticLibrary + */ + @NonNull + List getUsesStaticLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesStaticLibrary_certDigest + */ + @Nullable + String[][] getUsesStaticLibrariesCertDigests(); + + /** + * @see R.styleable#AndroidManifestUsesStaticLibrary_version + */ + @Nullable + long[] getUsesStaticLibrariesVersions(); + + /** + * @see PackageInfo#versionName + */ + @Nullable + String getVersionName(); + + /** + * @see ApplicationInfo#volumeUuid + */ + @Nullable + String getVolumeUuid(); + + boolean hasPreserveLegacyExternalStorage(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION + * @see R.styleable#AndroidManifestApplication_requestForegroundServiceExemption + */ + boolean hasRequestForegroundServiceExemption(); + + /** + * @see ApplicationInfo#getRequestRawExternalStorageAccess() + * @see R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess + */ + Boolean hasRequestRawExternalStorageAccess(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE + */ + boolean isAllowAudioPlaybackCapture(); + + /** + * @see ApplicationInfo#FLAG_ALLOW_BACKUP + */ + boolean isAllowBackup(); + + /** + * @see ApplicationInfo#FLAG_ALLOW_CLEAR_USER_DATA + */ + boolean isAllowClearUserData(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE + */ + boolean isAllowClearUserDataOnFailedRestore(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING + */ + boolean isAllowNativeHeapPointerTagging(); + + /** + * @see ApplicationInfo#FLAG_ALLOW_TASK_REPARENTING + */ + boolean isAllowTaskReparenting(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_anyDensity + * @see ApplicationInfo#FLAG_SUPPORTS_SCREEN_DENSITIES + */ + boolean isAnyDensity(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_BACKUP_IN_FOREGROUND + */ + boolean isBackupInForeground(); + + /** + * @see ApplicationInfo#FLAG_HARDWARE_ACCELERATED + */ + boolean isBaseHardwareAccelerated(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_CANT_SAVE_STATE + */ + boolean isCantSaveState(); + + /** + * @see ApplicationInfo#crossProfile + */ + boolean isCrossProfile(); + + /** + * @see ApplicationInfo#FLAG_DEBUGGABLE + */ + boolean isDebuggable(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE + */ + boolean isDefaultToDeviceProtectedStorage(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_DIRECT_BOOT_AWARE + */ + boolean isDirectBootAware(); + + /** + * @see ApplicationInfo#enabled + * @see R.styleable#AndroidManifestApplication_enabled + */ + boolean isEnabled(); + + /** + * @see ApplicationInfo#FLAG_EXTERNAL_STORAGE + */ + boolean isExternalStorage(); + + /** + * @see ApplicationInfo#FLAG_EXTRACT_NATIVE_LIBS + */ + boolean isExtractNativeLibs(); + + /** + * @see R.styleable#AndroidManifestApplication_forceQueryable + */ + boolean isForceQueryable(); + + /** + * @see ApplicationInfo#FLAG_FULL_BACKUP_ONLY + */ + boolean isFullBackupOnly(); + + /** + * @see ApplicationInfo#FLAG_IS_GAME + */ + @Deprecated + boolean isGame(); + + /** + * @see ApplicationInfo#FLAG_HAS_CODE + */ + boolean isHasCode(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_HAS_DOMAIN_URLS + */ + boolean isHasDomainUrls(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_HAS_FRAGILE_USER_DATA + */ + boolean isHasFragileUserData(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ISOLATED_SPLIT_LOADING + */ + boolean isIsolatedSplitLoading(); + + /** + * @see ApplicationInfo#FLAG_KILL_AFTER_RESTORE + */ + boolean isKillAfterRestore(); + + /** + * @see ApplicationInfo#FLAG_LARGE_HEAP + */ + boolean isLargeHeap(); + + /** + * Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value + * smaller than the current SDK version. + * @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion + */ + boolean isLeavingSharedUid(); + + /** + * @see ApplicationInfo#FLAG_MULTIARCH + */ + boolean isMultiArch(); + + /** + * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback + */ + boolean isOnBackInvokedCallbackEnabled(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_IS_RESOURCE_OVERLAY + * @see ApplicationInfo#isResourceOverlay() + */ + boolean isOverlay(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE + */ + boolean isPartiallyDirectBootAware(); + + /** + * @see ApplicationInfo#FLAG_PERSISTENT + */ + boolean isPersistent(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_EXT_PROFILEABLE + */ + boolean isProfileable(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_PROFILEABLE_BY_SHELL + */ + boolean isProfileableByShell(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE + */ + boolean isRequestLegacyExternalStorage(); + + /** + * @see PackageInfo#requiredForAllUsers + * @see R.styleable#AndroidManifestApplication_requiredForAllUsers + */ + boolean isRequiredForAllUsers(); + + /** + * Whether the enabled settings of components in the application should be reset to the default, + * when the application's user data is cleared. + * + * @see R.styleable#AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared + */ + boolean isResetEnabledSettingsOnAppDataCleared(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_resizeable + * @see ApplicationInfo#FLAG_RESIZEABLE_FOR_SCREENS + */ + boolean isResizeable(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION + */ + boolean isResizeableActivityViaSdkVersion(); + + /** + * @see ApplicationInfo#FLAG_RESTORE_ANY_VERSION + */ + boolean isRestoreAnyVersion(); + + /** + * True means that this package/app contains an SDK library. + */ + boolean isSdkLibrary(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_STATIC_SHARED_LIBRARY + */ + boolean isStaticSharedLibrary(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#GINGERBREAD}. + * + * @see R.styleable#AndroidManifestSupportsScreens_xlargeScreens + * @see ApplicationInfo#FLAG_SUPPORTS_XLARGE_SCREENS + */ + boolean isSupportsExtraLargeScreens(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_largeScreens + * @see ApplicationInfo#FLAG_SUPPORTS_LARGE_SCREENS + */ + boolean isSupportsLargeScreens(); + + /** + * If omitted from manifest, returns true. + * + * @see R.styleable#AndroidManifestSupportsScreens_normalScreens + * @see ApplicationInfo#FLAG_SUPPORTS_NORMAL_SCREENS + */ + boolean isSupportsNormalScreens(); + + /** + * @see ApplicationInfo#FLAG_SUPPORTS_RTL + */ + boolean isSupportsRtl(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_smallScreens + * @see ApplicationInfo#FLAG_SUPPORTS_SMALL_SCREENS + */ + boolean isSupportsSmallScreens(); + + /** + * @see ApplicationInfo#FLAG_TEST_ONLY + */ + boolean isTestOnly(); + + /** + * The install time abi override to choose 32bit abi's when multiple abi's are present. This is + * only meaningful for multiarch applications. The use32bitAbi attribute is ignored if + * cpuAbiOverride is also set. + * + * @see R.attr#use32bitAbi + */ + boolean isUse32BitAbi(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_USE_EMBEDDED_DEX + */ + boolean isUseEmbeddedDex(); + + /** + * @see ApplicationInfo#FLAG_USES_CLEARTEXT_TRAFFIC + */ + boolean isUsesCleartextTraffic(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_USES_NON_SDK_API + */ + boolean isUsesNonSdkApi(); + + /** + * Set if the any of components are visible to instant applications. + * + * @see R.styleable#AndroidManifestActivity_visibleToInstantApps + * @see R.styleable#AndroidManifestProvider_visibleToInstantApps + * @see R.styleable#AndroidManifestService_visibleToInstantApps + */ + boolean isVisibleToInstantApps(); + + /** + * @see ApplicationInfo#FLAG_VM_SAFE_MODE + */ + boolean isVmSafeMode(); } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java index f2b1a7119b845..76bae37b1e404 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackageUtils.java @@ -19,16 +19,11 @@ package com.android.server.pm.parsing.pkg; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.SharedLibraryInfo; import android.content.pm.VersionedPackage; import android.content.pm.dex.DexMetadataHelper; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; -import com.android.server.pm.pkg.parsing.ParsingPackageUtils; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedInstrumentation; -import com.android.server.pm.pkg.component.ParsedProvider; -import com.android.server.pm.pkg.component.ParsedService; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; import android.os.incremental.IncrementalManager; @@ -38,7 +33,13 @@ import com.android.internal.content.NativeLibraryHelper; import com.android.internal.util.ArrayUtils; import com.android.server.SystemConfig; import com.android.server.pm.PackageManagerException; +import com.android.server.pm.pkg.AndroidPackageApi; import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedInstrumentation; +import com.android.server.pm.pkg.component.ParsedProvider; +import com.android.server.pm.pkg.component.ParsedService; +import com.android.server.pm.pkg.parsing.ParsingPackageHidden; import java.io.IOException; import java.util.ArrayList; @@ -259,11 +260,6 @@ public class AndroidPackageUtils { return ApplicationInfo.HIDDEN_API_ENFORCEMENT_ENABLED; } - public static int getIcon(ParsingPackageRead pkg) { - return (ParsingPackageUtils.sUseRoundIcon && pkg.getRoundIconRes() != 0) - ? pkg.getRoundIconRes() : pkg.getIconRes(); - } - /** * Returns false iff the provided flags include the {@link PackageManager#MATCH_SYSTEM_ONLY} * flag and the provided package is not a system package. Otherwise returns {@code true}. @@ -338,4 +334,13 @@ public class AndroidPackageUtils { return pkg.getManifestPackageName(); } + + public static void fillVersionCodes(@NonNull AndroidPackage pkg, @NonNull PackageInfo info) { + info.versionCode = ((ParsingPackageHidden) pkg).getVersionCode(); + info.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor(); + } + + public static ApplicationInfo toAppInfoWithoutState(AndroidPackageApi pkg) { + return ((ParsingPackageHidden) pkg).toAppInfoWithoutState(); + } } diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java index 56f5da162cd06..33b32f808c6bd 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/PackageImpl.java @@ -82,7 +82,6 @@ import com.android.server.pm.pkg.component.ParsedUsesPermission; import com.android.server.pm.pkg.component.ParsedUsesPermissionImpl; import com.android.server.pm.pkg.parsing.ParsingPackage; import com.android.server.pm.pkg.parsing.ParsingPackageHidden; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.pkg.parsing.ParsingUtils; @@ -370,7 +369,7 @@ public class PackageImpl implements ParsedPackage, AndroidPackage, @DataClass.ParcelWith(ForInternedString.class) private String zygotePreloadName; /** - * @see ParsingPackageRead#getResizeableActivity() + * @see AndroidPackage#getResizeableActivity() */ @Nullable @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class) @@ -1182,9 +1181,6 @@ public class PackageImpl implements ParsedPackage, AndroidPackage, return requiresSmallestWidthDp; } - /** - * @see ParsingPackageRead#getResizeableActivity() - */ @Nullable @Override public Boolean getResizeableActivity() { @@ -2191,9 +2187,6 @@ public class PackageImpl implements ParsedPackage, AndroidPackage, return this; } - /** - * @see ParsingPackageRead#getResizeableActivity() - */ @Override public PackageImpl setResizeableActivity(@Nullable Boolean value) { resizeableActivity = value; diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PkgAppInfo.java b/services/core/java/com/android/server/pm/parsing/pkg/PkgAppInfo.java deleted file mode 100644 index 6ddae9bf4f8f1..0000000000000 --- a/services/core/java/com/android/server/pm/parsing/pkg/PkgAppInfo.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.parsing.pkg; - -import android.annotation.Nullable; -import android.content.pm.ApplicationInfo; -import com.android.server.pm.pkg.parsing.PkgWithoutStateAppInfo; - -import com.android.server.pm.PackageManagerService; -import com.android.server.pm.pkg.PackageState; - -/** - * Equivalent of {@link PkgWithoutStateAppInfo} but contains fields that are set inside {@link - * PackageManagerService} and thus are not available to the core SDK. - *

- * Everything in this interface is @SystemApi(client = SYSTEM_SERVER), but the interface itself is - * not. - */ -public interface PkgAppInfo extends PkgWithoutStateAppInfo { - - /** - * @see ApplicationInfo#nativeLibraryDir - */ - @Nullable - String getNativeLibraryDir(); - - /** - * @see ApplicationInfo#nativeLibraryRootDir - */ - @Nullable - String getNativeLibraryRootDir(); - - /** - * @see ApplicationInfo#secondaryNativeLibraryDir - */ - @Nullable - String getSecondaryNativeLibraryDir(); - - /** - * This is an appId, the {@link ApplicationInfo#uid} if the user ID is - * {@link android.os.UserHandle#SYSTEM}. - * - * @deprecated Use {@link PackageState#getAppId()} instead. - */ - @Deprecated - int getUid(); - - /** - * @see ApplicationInfo#FLAG_FACTORY_TEST - */ - boolean isFactoryTest(); - - /** - * @see ApplicationInfo#nativeLibraryRootRequiresIsa - */ - boolean isNativeLibraryRootRequiresIsa(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ODM - */ - boolean isOdm(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_OEM - */ - boolean isOem(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PRIVILEGED - */ - boolean isPrivileged(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PRODUCT - */ - boolean isProduct(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY - */ - boolean isSignedWithPlatformKey(); - - /** - * @see ApplicationInfo#FLAG_SYSTEM - */ - boolean isSystem(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_SYSTEM_EXT - */ - boolean isSystemExt(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_VENDOR - */ - boolean isVendor(); -} diff --git a/services/core/java/com/android/server/pm/parsing/pkg/PkgPackageInfo.java b/services/core/java/com/android/server/pm/parsing/pkg/PkgPackageInfo.java deleted file mode 100644 index da7f1dc0f47ea..0000000000000 --- a/services/core/java/com/android/server/pm/parsing/pkg/PkgPackageInfo.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.parsing.pkg; - -import android.content.pm.PackageInfo; -import com.android.server.pm.pkg.parsing.PkgWithoutStatePackageInfo; - -import com.android.server.pm.PackageManagerService; - -/** - * Equivalent of {@link PkgWithoutStatePackageInfo} but contains fields that are set inside {@link - * PackageManagerService} and thus are not available to the core SDK. - *

- * Everything in this interface is @SystemApi(client = SYSTEM_SERVER), but the interface itself is - * not. - */ -public interface PkgPackageInfo extends PkgWithoutStatePackageInfo { - - /** - * @see PackageInfo#coreApp - */ - boolean isCoreApp(); - - /** - * @see PackageInfo#isStub - */ - boolean isStub(); -} diff --git a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java b/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java index a529abbfadf50..55262982f9639 100644 --- a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java +++ b/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java @@ -20,9 +20,11 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.SystemApi; +import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.FeatureGroupInfo; import android.content.pm.FeatureInfo; +import android.content.pm.PackageInfo; import android.util.SparseArray; import com.android.server.pm.parsing.pkg.AndroidPackage; @@ -37,7 +39,7 @@ import java.util.List; /** * Explicit interface used for consumers like mainline who need a {@link SystemApi @SystemApi} form - * of {@link AndroidPackage}. * + * of {@link AndroidPackage}. * @hide */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) @@ -45,9 +47,18 @@ public interface AndroidPackageApi { boolean areAttributionsUserVisible(); + @NonNull + List getActivities(); + + @NonNull + List getAdoptPermissions(); + @Nullable String getAppComponentFactory(); + @NonNull + List getAttributions(); + int getAutoRevokePermissions(); @Nullable @@ -58,6 +69,8 @@ public interface AndroidPackageApi { @NonNull String getBaseApkPath(); + int getBaseRevisionCode(); + int getCategory(); @Nullable @@ -68,24 +81,43 @@ public interface AndroidPackageApi { int getCompatibleWidthLimitDp(); + int getCompileSdkVersion(); + + @Nullable + String getCompileSdkVersionCodeName(); + + @NonNull + List getConfigPreferences(); + int getDataExtractionRules(); int getDescriptionRes(); + @NonNull + List getFeatureGroups(); + int getFullBackupContent(); int getGwpAsanMode(); int getIconRes(); + @NonNull + List getImplicitPermissions(); + int getInstallLocation(); + @NonNull + List getInstrumentations(); + int getLabelRes(); int getLargestWidthLimitDp(); int getLogo(); + long getLongVersionCode(); + @Nullable String getManageSpaceActivityName(); @@ -99,28 +131,78 @@ public interface AndroidPackageApi { int getNativeHeapZeroInitialized(); + /** + * @see ApplicationInfo#nativeLibraryDir + */ + @Nullable + String getNativeLibraryDir(); + + /** + * @see ApplicationInfo#nativeLibraryRootDir + */ + @Nullable + String getNativeLibraryRootDir(); + int getNetworkSecurityConfigRes(); @Nullable CharSequence getNonLocalizedLabel(); + @NonNull + String getPackageName(); + @NonNull String getPath(); @Nullable String getPermission(); + @NonNull + List getPermissions(); + @NonNull String getProcessName(); + @NonNull + List getProviders(); + + @NonNull + List getReceivers(); + + @NonNull + List getRequestedFeatures(); + + @NonNull + List getRequestedPermissions(); + + @Nullable + String getRequiredAccountType(); + int getRequiresSmallestWidthDp(); @SuppressLint("AutoBoxing") @Nullable Boolean getResizeableActivity(); + @Nullable + String getRestrictedAccountType(); + int getRoundIconRes(); + /** + * @see ApplicationInfo#secondaryNativeLibraryDir + */ + @Nullable + String getSecondaryNativeLibraryDir(); + + @NonNull + List getServices(); + + @Nullable + String getSharedUserId(); + + int getSharedUserLabel(); + @NonNull String[] getSplitClassLoaderNames(); @@ -130,10 +212,16 @@ public interface AndroidPackageApi { @Nullable SparseArray getSplitDependencies(); - int getTargetSdkVersion(); + @NonNull + String[] getSplitNames(); + + @NonNull + int[] getSplitRevisionCodes(); int getTargetSandboxVersion(); + int getTargetSdkVersion(); + @Nullable String getTaskAffinity(); @@ -141,6 +229,18 @@ public interface AndroidPackageApi { int getUiOptions(); + /** + * This is an appId, the {@link ApplicationInfo#uid} if the user ID is + * {@link android.os.UserHandle#SYSTEM}. + * + * @deprecated Use {@link PackageState#getAppId()} instead. + */ + @Deprecated + int getUid(); + + @Nullable + String getVersionName(); + @Nullable String getVolumeUuid(); @@ -167,12 +267,19 @@ public interface AndroidPackageApi { boolean isAnyDensity(); + boolean isApex(); + boolean isBackupInForeground(); boolean isBaseHardwareAccelerated(); boolean isCantSaveState(); + /** + * @see PackageInfo#coreApp + */ + boolean isCoreApp(); + boolean isCrossProfile(); boolean isDebuggable(); @@ -187,6 +294,11 @@ public interface AndroidPackageApi { boolean isExtractNativeLibs(); + /** + * @see ApplicationInfo#FLAG_FACTORY_TEST + */ + boolean isFactoryTest(); + boolean isFullBackupOnly(); boolean isHasCode(); @@ -203,27 +315,64 @@ public interface AndroidPackageApi { boolean isMultiArch(); + /** + * @see ApplicationInfo#nativeLibraryRootRequiresIsa + */ + boolean isNativeLibraryRootRequiresIsa(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ODM + */ + boolean isOdm(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_OEM + */ + boolean isOem(); + boolean isOverlay(); boolean isPartiallyDirectBootAware(); boolean isPersistent(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_PRIVILEGED + */ + boolean isPrivileged(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_PRODUCT + */ + boolean isProduct(); + boolean isProfileable(); boolean isProfileableByShell(); boolean isRequestLegacyExternalStorage(); + boolean isRequiredForAllUsers(); + boolean isResizeable(); boolean isResizeableActivityViaSdkVersion(); boolean isRestoreAnyVersion(); + boolean isSdkLibrary(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY + */ + boolean isSignedWithPlatformKey(); + boolean isStaticSharedLibrary(); - boolean isSdkLibrary(); + /** + * @see PackageInfo#isStub + */ + boolean isStub(); boolean isSupportsExtraLargeScreens(); @@ -235,6 +384,16 @@ public interface AndroidPackageApi { boolean isSupportsSmallScreens(); + /** + * @see ApplicationInfo#FLAG_SYSTEM + */ + boolean isSystem(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_SYSTEM_EXT + */ + boolean isSystemExt(); + boolean isTestOnly(); boolean isUseEmbeddedDex(); @@ -243,115 +402,10 @@ public interface AndroidPackageApi { boolean isUsesNonSdkApi(); - boolean isVmSafeMode(); - - @NonNull - List getActivities(); - - @NonNull - List getAttributions(); - - @NonNull - List getAdoptPermissions(); - - int getBaseRevisionCode(); - - int getCompileSdkVersion(); - - @Nullable - String getCompileSdkVersionCodeName(); - - @NonNull - List getConfigPreferences(); - - @NonNull - List getFeatureGroups(); - - @NonNull - List getImplicitPermissions(); - - @NonNull - List getInstrumentations(); - - long getLongVersionCode(); - - @NonNull - String getPackageName(); - - @NonNull - List getPermissions(); - - @NonNull - List getProviders(); - - @NonNull - List getReceivers(); - - @NonNull - List getRequestedFeatures(); - - @NonNull - List getRequestedPermissions(); - - @Nullable - String getRequiredAccountType(); - - @Nullable - String getRestrictedAccountType(); - - @NonNull - List getServices(); - - @Nullable - String getSharedUserId(); - - int getSharedUserLabel(); - - @NonNull - String[] getSplitNames(); - - @NonNull - int[] getSplitRevisionCodes(); - - @Nullable - String getVersionName(); - - boolean isRequiredForAllUsers(); - - @Nullable - String getNativeLibraryDir(); - - @Nullable - String getNativeLibraryRootDir(); - - @Nullable - String getSecondaryNativeLibraryDir(); - - int getUid(); - - boolean isFactoryTest(); - - boolean isApex(); - - boolean isNativeLibraryRootRequiresIsa(); - - boolean isOdm(); - - boolean isOem(); - - boolean isPrivileged(); - - boolean isProduct(); - - boolean isSignedWithPlatformKey(); - - boolean isSystem(); - - boolean isSystemExt(); - + /** + * @see ApplicationInfo#PRIVATE_FLAG_VENDOR + */ boolean isVendor(); - boolean isCoreApp(); - - boolean isStub(); + boolean isVmSafeMode(); } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java index 917c4af017d26..3bdebd1e9e52c 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateUtils.java @@ -26,8 +26,8 @@ import android.os.Debug; import android.util.DebugUtils; import android.util.Slog; +import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedMainComponent; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; /** @hide */ public class PackageUserStateUtils { @@ -155,7 +155,7 @@ public class PackageUserStateUtils { } public static boolean isPackageEnabled(@NonNull PackageUserState state, - @NonNull ParsingPackageRead pkg) { + @NonNull AndroidPackage pkg) { switch (state.getEnabledState()) { case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: return true; diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java index 17d718ab66b98..1a46e2012448c 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackage.java @@ -24,12 +24,14 @@ import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.FeatureGroupInfo; import android.content.pm.FeatureInfo; -import android.content.pm.PackageManager.Property; +import android.content.pm.PackageManager; import android.content.pm.SigningDetails; import android.os.Bundle; +import android.util.ArraySet; import android.util.SparseArray; import android.util.SparseIntArray; +import com.android.internal.R; import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.pkg.component.ParsedActivity; import com.android.server.pm.pkg.component.ParsedApexSystemService; @@ -44,6 +46,7 @@ import com.android.server.pm.pkg.component.ParsedService; import com.android.server.pm.pkg.component.ParsedUsesPermission; import java.security.PublicKey; +import java.util.List; import java.util.Map; import java.util.Set; @@ -53,7 +56,7 @@ import java.util.Set; * @hide */ @SuppressWarnings("UnusedReturnValue") -public interface ParsingPackage extends ParsingPackageRead { +public interface ParsingPackage { ParsingPackage addActivity(ParsedActivity parsedActivity); @@ -84,7 +87,7 @@ public interface ParsingPackage extends ParsingPackageRead { ParsingPackage addPreferredActivityFilter(String className, ParsedIntentInfo intentInfo); /** Add a property to the application scope */ - ParsingPackage addProperty(Property property); + ParsingPackage addProperty(PackageManager.Property property); ParsingPackage addProtectedBroadcast(String protectedBroadcast); @@ -394,4 +397,137 @@ public interface ParsingPackage extends ParsingPackageRead { @CallSuper ParsedPackage hideAsParsed(); + + // The remaining methods are copied out of [AndroidPackage] so that the parsing variant does + // not implement the final API interface and can't accidentally be used without finalizing + // the parsing process. + + @NonNull + List getActivities(); + + @NonNull + List getAttributions(); + + @NonNull + String getBaseApkPath(); + + @Nullable + String getClassLoaderName(); + + @NonNull + List getConfigPreferences(); + + @NonNull + List getInstrumentations(); + + @NonNull + Map> getKeySetMapping(); + + @NonNull + List getLibraryNames(); + + float getMaxAspectRatio(); + + int getMaxSdkVersion(); + + @Nullable + Bundle getMetaData(); + + float getMinAspectRatio(); + + int getMinSdkVersion(); + + String getPackageName(); + + @Nullable + String getPermission(); + + @NonNull + List getPermissions(); + + @NonNull + String getProcessName(); + + @NonNull + List getProviders(); + + @NonNull + List getRequestedPermissions(); + + @Nullable + Boolean getResizeableActivity(); + + @Nullable + String getSdkLibName(); + + @NonNull + List getServices(); + + @Nullable + String getSharedUserId(); + + @NonNull + String[] getSplitCodePaths(); + + @NonNull + String[] getSplitNames(); + + @Nullable + String getStaticSharedLibName(); + + int getTargetSdkVersion(); + + @Nullable + String getTaskAffinity(); + + int getUiOptions(); + + @NonNull + List getUsesLibraries(); + + @NonNull + List getUsesNativeLibraries(); + + @NonNull + List getUsesPermissions(); + + @NonNull + List getUsesSdkLibraries(); + + @Nullable + long[] getUsesSdkLibrariesVersionsMajor(); + + @NonNull + List getUsesStaticLibraries(); + + @Nullable + String getZygotePreloadName(); + + boolean isAllowBackup(); + + boolean isAllowTaskReparenting(); + + boolean isAnyDensity(); + + boolean isBaseHardwareAccelerated(); + + boolean isCantSaveState(); + + boolean isProfileable(); + + boolean isProfileableByShell(); + + boolean isResizeable(); + + boolean isResizeableActivityViaSdkVersion(); + + boolean isStaticSharedLibrary(); + + boolean isSupportsExtraLargeScreens(); + + boolean isSupportsLargeScreens(); + + boolean isSupportsNormalScreens(); + + boolean isSupportsSmallScreens(); } diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java index a7f0c97964e63..9c1c9ac9efcd7 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageHidden.java @@ -23,7 +23,7 @@ import android.content.pm.PackageInfo; * Methods that normal consumers should not have access to. This usually means the field is stateful * or deprecated and should be access through a utility class or a system manager class. *

- * This is a separate interface, not implemented by the base {@link ParsingPackageRead} because Java + * This is a separate interface, not implemented by the base {@link ParsingPackage} because Java * doesn't support non-public interface methods. The class must be cast to this interface. * * @hide diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageInternal.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageInternal.java deleted file mode 100644 index 5457785a8519f..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageInternal.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import android.annotation.Nullable; -import android.content.pm.PackageInfo; - -import com.android.internal.R; - -/** - * Methods which would've been a part of {@link PkgWithoutStatePackageInfo} or {@link - * PkgWithoutStateAppInfo}, but are removed/deprecated. - *

- * This is different from {@link ParsingPackageHidden}. The methods in that interface cannot be - * accessed by anyone except the parsing utilities, whereas the methods in this interface are valid - * and can be accessed by any internal caller that needs it. - * - * @hide - */ -interface ParsingPackageInternal { - - /** - * @see PackageInfo#overlayCategory - * @see R.styleable#AndroidManifestResourceOverlay_category - */ - @Nullable - String getOverlayCategory(); - - /** - * @see PackageInfo#overlayPriority - * @see R.styleable#AndroidManifestResourceOverlay_priority - */ - int getOverlayPriority(); - - /** - * @see PackageInfo#overlayTarget - * @see R.styleable#AndroidManifestResourceOverlay_targetPackage - */ - @Nullable - String getOverlayTarget(); - - /** - * @see PackageInfo#targetOverlayableName - * @see R.styleable#AndroidManifestResourceOverlay_targetName - */ - @Nullable - String getOverlayTargetOverlayableName(); - - /** - * @see PackageInfo#mOverlayIsStatic - */ - boolean isOverlayIsStatic(); -} diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java deleted file mode 100644 index 22729993af64e..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageRead.java +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager.Property; -import android.content.pm.SigningDetails; -import android.os.Bundle; -import android.util.ArraySet; -import android.util.Pair; -import android.util.SparseIntArray; - -import com.android.server.pm.pkg.component.ParsedApexSystemService; -import com.android.server.pm.pkg.component.ParsedAttribution; -import com.android.server.pm.pkg.component.ParsedIntentInfo; -import com.android.server.pm.pkg.component.ParsedPermissionGroup; -import com.android.server.pm.pkg.component.ParsedProcess; -import com.android.server.pm.pkg.component.ParsedUsesPermission; - -import java.security.PublicKey; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Everything written by {@link ParsingPackage} and readable back. - * - * @hide - */ -public interface ParsingPackageRead extends PkgWithoutStateAppInfo, PkgWithoutStatePackageInfo, - ParsingPackageInternal { - - /** - * The names of packages to adopt ownership of permissions from, parsed under {@link - * ParsingPackageUtils#TAG_ADOPT_PERMISSIONS}. - * - * @see R.styleable#AndroidManifestOriginalPackage_name - */ - @NonNull - List getAdoptPermissions(); - - /** - * @see R.styleable#AndroidManifestApexSystemService - */ - @NonNull - List getApexSystemServices(); - - @NonNull - List getAttributions(); - - /** - * Permissions requested but not in the manifest. These may have been split or migrated from - * previous versions/definitions. - */ - @NonNull - List getImplicitPermissions(); - - @NonNull - List getUsesPermissions(); - - /** - * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link - * ParsingPackageUtils#TAG_KEY_SETS}. - * - * @see R.styleable#AndroidManifestKeySet - * @see R.styleable#AndroidManifestPublicKey - */ - @NonNull - Map> getKeySetMapping(); - - /** - * Library names this package is declared as, for use by other packages with "uses-library". - * - * @see R.styleable#AndroidManifestLibrary - */ - @NonNull - List getLibraryNames(); - - /** - * TODO(b/135203078): Make all the Bundles immutable (and non-null by shared empty reference?) - */ - @Nullable - Bundle getMetaData(); - - @Nullable - Set getMimeGroups(); - - /** - * @see R.styleable#AndroidManifestExtensionSdk - */ - @Nullable - SparseIntArray getMinExtensionVersions(); - - /** - * For system use to migrate from an old package name to a new one, moving over data if - * available. - * - * @see R.styleable#AndroidManifestOriginalPackage} - */ - @NonNull - List getOriginalPackages(); - - /** - * Map of overlayable name to actor name. - */ - @NonNull - Map getOverlayables(); - - /** - * @see android.content.pm.PermissionGroupInfo - */ - @NonNull - List getPermissionGroups(); - - /** - * Used to determine the default preferred handler of an {@link Intent}. - *

- * Map of component className to intent info inside that component. TODO(b/135203078): Is this - * actually used/working? - */ - @NonNull - List> getPreferredActivityFilters(); - - /** - * @see android.content.pm.ProcessInfo - */ - @NonNull - Map getProcesses(); - - /** - * System protected broadcasts. - * - * @see R.styleable#AndroidManifestProtectedBroadcast - */ - @NonNull - List getProtectedBroadcasts(); - - /** - * Intents that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesIntent - */ - @NonNull - List getQueriesIntents(); - - /** - * Other packages that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesPackage - */ - @NonNull - List getQueriesPackages(); - - /** - * Authorities that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesProvider - */ - @NonNull - Set getQueriesProviders(); - - /** - * SHA-512 hash of the only APK that can be used to update a system package. - * - * @see R.styleable#AndroidManifestRestrictUpdate - */ - @Nullable - byte[] getRestrictUpdateHash(); - - /** - * The signature data of all APKs in this package, which must be exactly the same across the - * base and splits. - */ - @NonNull - SigningDetails getSigningDetails(); - - /** - * Returns the properties set on the application - */ - @NonNull - Map getProperties(); - - /** - * Flags of any split APKs; ordered by parsed splitName - */ - @Nullable - int[] getSplitFlags(); - - /** - * @see R.styleable#AndroidManifestSdkLibrary_name - */ - @Nullable - String getSdkLibName(); - - /** - * @see R.styleable#AndroidManifestSdkLibrary_versionMajor - */ - int getSdkLibVersionMajor(); - - /** - * @see R.styleable#AndroidManifestStaticLibrary_name - */ - @Nullable - String getStaticSharedLibName(); - - /** - * @see R.styleable#AndroidManifestStaticLibrary_version - */ - long getStaticSharedLibVersion(); - - /** - * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link - * ParsingPackageUtils#TAG_KEY_SETS}. - * - * @see R.styleable#AndroidManifestUpgradeKeySet - */ - @NonNull - Set getUpgradeKeySets(); - - /** - * @see R.styleable#AndroidManifestUsesLibrary - */ - @NonNull - List getUsesLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesNativeLibrary - */ - @NonNull - List getUsesNativeLibraries(); - - /** - * Like {@link #getUsesLibraries()}, but marked optional by setting {@link - * R.styleable#AndroidManifestUsesLibrary_required} to false . Application is expected to handle - * absence manually. - * - * @see R.styleable#AndroidManifestUsesLibrary - */ - @NonNull - List getUsesOptionalLibraries(); - - /** - * Like {@link #getUsesNativeLibraries()}, but marked optional by setting {@link - * R.styleable#AndroidManifestUsesNativeLibrary_required} to false . Application is expected to - * handle absence manually. - * - * @see R.styleable#AndroidManifestUsesNativeLibrary - */ - @NonNull - List getUsesOptionalNativeLibraries(); - - /** - * TODO(b/135203078): Move static library stuff to an inner data class - * - * @see R.styleable#AndroidManifestUsesStaticLibrary - */ - @NonNull - List getUsesStaticLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesStaticLibrary_certDigest - */ - @Nullable - String[][] getUsesStaticLibrariesCertDigests(); - - /** - * @see R.styleable#AndroidManifestUsesStaticLibrary_version - */ - @Nullable - long[] getUsesStaticLibrariesVersions(); - - /** - * TODO(b/135203078): Move SDK library stuff to an inner data class - * - * @see R.styleable#AndroidManifestUsesSdkLibrary - */ - @NonNull - List getUsesSdkLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesSdkLibrary_certDigest - */ - @Nullable - String[][] getUsesSdkLibrariesCertDigests(); - - /** - * @see R.styleable#AndroidManifestUsesSdkLibrary_versionMajor - */ - @Nullable - long[] getUsesSdkLibrariesVersionsMajor(); - - boolean hasPreserveLegacyExternalStorage(); - - /** - * @see R.styleable#AndroidManifestApplication_forceQueryable - */ - boolean isForceQueryable(); - - /** - * @see ApplicationInfo#FLAG_IS_GAME - */ - @Deprecated - boolean isGame(); - - /** - * The install time abi override to choose 32bit abi's when multiple abi's are present. This is - * only meaningful for multiarch applications. The use32bitAbi attribute is ignored if - * cpuAbiOverride is also set. - * - * @see R.attr#use32bitAbi - */ - boolean isUse32BitAbi(); - - /** - * Set if the any of components are visible to instant applications. - * - * @see R.styleable#AndroidManifestActivity_visibleToInstantApps - * @see R.styleable#AndroidManifestProvider_visibleToInstantApps - * @see R.styleable#AndroidManifestService_visibleToInstantApps - */ - boolean isVisibleToInstantApps(); - - /** - * Whether the enabled settings of components in the application should be reset to the default, - * when the application's user data is cleared. - * - * @see R.styleable#AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared - */ - boolean isResetEnabledSettingsOnAppDataCleared(); - - /** - * The resource ID used to provide the application's locales configuration. - * - * @see R.styleable#AndroidManifestApplication_localeConfig - */ - int getLocaleConfigRes(); - - /** - * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback - */ - boolean isOnBackInvokedCallbackEnabled(); - - /** - * Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value - * smaller than the current SDK version. - * @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion - */ - boolean isLeavingSharedUid(); -} diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java index 27da4cac575fd..14f787e4fbea0 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java @@ -92,8 +92,8 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; import com.android.server.pm.SharedUidMigration; import com.android.server.pm.parsing.pkg.PackageImpl; +import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.CompatibilityPermissionInfo; -import com.android.server.pm.pkg.AndroidPackageApi; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ComponentParseUtils; import com.android.server.pm.pkg.component.InstallConstraintsTagParser; @@ -266,7 +266,7 @@ public class ParsingPackageUtils { * @see #parseDefault(ParseInput, File, int, List, boolean) */ @NonNull - public static ParseResult parseDefaultOneTime(File file, + public static ParseResult parseDefaultOneTime(File file, @ParseFlags int parseFlags, @NonNull List splitPermissions, boolean collectCertificates) { @@ -280,11 +280,11 @@ public class ParsingPackageUtils { * feature support. */ @NonNull - public static ParseResult parseDefault(ParseInput input, File file, + public static ParseResult parseDefault(ParseInput input, File file, @ParseFlags int parseFlags, @NonNull List splitPermissions, boolean collectCertificates) { - ParseResult result; + ParseResult result; ParsingPackageUtils parser = new ParsingPackageUtils(null /*separateProcesses*/, null /*displayMetrics*/, splitPermissions, new Callback() { @@ -307,12 +307,13 @@ public class ParsingPackageUtils { isCoreApp); } }); - result = parser.parsePackage(input, file, parseFlags, /* frameworkSplits= */ null); - if (result.isError()) { - return input.error(result); + var parseResult = parser.parsePackage(input, file, parseFlags, /* frameworkSplits= */ null); + if (parseResult.isError()) { + return input.error(parseResult); } - final ParsingPackage pkg = result.getResult(); + var pkg = parseResult.getResult().hideAsParsed(); + if (collectCertificates) { final ParseResult ret = ParsingPackageUtils.getSigningDetails(input, pkg, false /*skipVerify*/); @@ -322,9 +323,6 @@ public class ParsingPackageUtils { pkg.setSigningDetails(ret.getResult()); } - // Need to call this to finish the parsing stage - pkg.hideAsParsed(); - return input.success(pkg); } @@ -351,7 +349,7 @@ public class ParsingPackageUtils { * package name and version codes, a single base APK, and unique split names. *

* Note that this does not perform signature verification; that must be done separately - * in {@link #getSigningDetails(ParseInput, ParsingPackageRead, boolean)}. + * in {@link #getSigningDetails(ParseInput, ParsedPackage, boolean)}. *

* If {@code useCaches} is true, the package parser might return a cached result from a previous * parse of the same {@code packageFile} with the same {@code flags}. Note that this method does @@ -383,7 +381,7 @@ public class ParsingPackageUtils { * differences. *

* Note that this does not perform signature verification; that must be done separately - * in {@link #getSigningDetails(ParseInput, ParsingPackageRead, boolean)}. + * in {@link #getSigningDetails(ParseInput, ParsedPackage, boolean)}. */ private ParseResult parseClusterPackage(ParseInput input, File packageDir, List frameworkSplits, int flags) { @@ -460,7 +458,7 @@ public class ParsingPackageUtils { * Parse the given APK file, treating it as as a single monolithic package. *

* Note that this does not perform signature verification; that must be done separately - * in {@link #getSigningDetails(ParseInput, ParsingPackageRead, boolean)}. + * in {@link #getSigningDetails(ParseInput, ParsedPackage, boolean)}. */ private ParseResult parseMonolithicPackage(ParseInput input, File apkFile, int flags) { @@ -3070,18 +3068,41 @@ public class ParsingPackageUtils { */ @CheckResult public static ParseResult getSigningDetails(ParseInput input, - ParsingPackageRead pkg, boolean skipVerify) { + ParsedPackage pkg, boolean skipVerify) { + return getSigningDetails(input, pkg.getBaseApkPath(), pkg.isStaticSharedLibrary(), + pkg.getTargetSdkVersion(), pkg.getSplitCodePaths(), skipVerify); + } + + @CheckResult + private static ParseResult getSigningDetails(ParseInput input, + ParsingPackage pkg, boolean skipVerify) { + return getSigningDetails(input, pkg.getBaseApkPath(), pkg.isStaticSharedLibrary(), + pkg.getTargetSdkVersion(), pkg.getSplitCodePaths(), skipVerify); + } + + /** + * Collect certificates from all the APKs described in the given package. Also asserts that + * all APK contents are signed correctly and consistently. + * + * TODO(b/155513789): Remove this in favor of collecting certificates during the original parse + * call if requested. Leaving this as an optional method for the caller means we have to + * construct a dummy ParseInput. + */ + @CheckResult + public static ParseResult getSigningDetails(ParseInput input, + String baseApkPath, boolean isStaticSharedLibrary, int targetSdkVersion, + String[] splitCodePaths, boolean skipVerify) { SigningDetails signingDetails = SigningDetails.UNKNOWN; Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "collectCertificates"); try { ParseResult result = getSigningDetails( input, - pkg.getBaseApkPath(), + baseApkPath, skipVerify, - pkg.isStaticSharedLibrary(), + isStaticSharedLibrary, signingDetails, - pkg.getTargetSdkVersion() + targetSdkVersion ); if (result.isError()) { return input.error(result); @@ -3091,17 +3112,16 @@ public class ParsingPackageUtils { final File frameworkRes = new File(Environment.getRootDirectory(), "framework/framework-res.apk"); boolean isFrameworkResSplit = frameworkRes.getAbsolutePath() - .equals(pkg.getBaseApkPath()); - String[] splitCodePaths = pkg.getSplitCodePaths(); + .equals(baseApkPath); if (!ArrayUtils.isEmpty(splitCodePaths) && !isFrameworkResSplit) { for (int i = 0; i < splitCodePaths.length; i++) { result = getSigningDetails( input, splitCodePaths[i], skipVerify, - pkg.isStaticSharedLibrary(), + isStaticSharedLibrary, signingDetails, - pkg.getTargetSdkVersion() + targetSdkVersion ); if (result.isError()) { return input.error(result); @@ -3315,16 +3335,6 @@ public class ParsingPackageUtils { return keySetMapping; } - public static void fillVersionCodes(@NonNull ParsingPackageRead pkg, - @NonNull PackageInfo info) { - info.versionCode = ((ParsingPackageHidden) pkg).getVersionCode(); - info.versionCodeMajor = ((ParsingPackageHidden) pkg).getVersionCodeMajor(); - } - - public static ApplicationInfo toAppInfoWithoutState(AndroidPackageApi pkg) { - return ((ParsingPackageHidden) pkg).toAppInfoWithoutState(); - } - /** * Callback interface for retrieving information that may be needed while parsing * a package. diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStateAppInfo.java b/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStateAppInfo.java deleted file mode 100644 index 99bcdb964c2f4..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStateAppInfo.java +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.pm.ApplicationInfo; -import android.util.SparseArray; - -import java.util.Set; - -/** - * Container for fields that are eventually exposed through {@link ApplicationInfo}. - *

- * The following are dependent on system state and explicitly removed from this interface. They must - * be accessed by other means: - *

    - *
  • {@link ApplicationInfo#credentialProtectedDataDir}
  • - *
  • {@link ApplicationInfo#dataDir}
  • - *
  • {@link ApplicationInfo#deviceProtectedDataDir}
  • - *
  • {@link ApplicationInfo#enabledSetting}
  • - *
  • {@link ApplicationInfo#enabled}
  • - *
  • {@link ApplicationInfo#FLAG_INSTALLED}
  • - *
  • {@link ApplicationInfo#FLAG_STOPPED}
  • - *
  • {@link ApplicationInfo#FLAG_SUSPENDED}
  • - *
  • {@link ApplicationInfo#FLAG_UPDATED_SYSTEM_APP}
  • - *
  • {@link ApplicationInfo#hiddenUntilInstalled}
  • - *
  • {@link ApplicationInfo#primaryCpuAbi}
  • - *
  • {@link ApplicationInfo#PRIVATE_FLAG_HIDDEN}
  • - *
  • {@link ApplicationInfo#PRIVATE_FLAG_INSTANT}
  • - *
  • {@link ApplicationInfo#PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER}
  • - *
  • {@link ApplicationInfo#PRIVATE_FLAG_VIRTUAL_PRELOAD}
  • - *
  • {@link ApplicationInfo#resourceDirs}
  • - *
  • {@link ApplicationInfo#secondaryCpuAbi}
  • - *
  • {@link ApplicationInfo#seInfoUser}
  • - *
  • {@link ApplicationInfo#seInfo}
  • - *
  • {@link ApplicationInfo#sharedLibraryFiles}
  • - *
  • {@link ApplicationInfo#sharedLibraryInfos}
  • - *
  • {@link ApplicationInfo#uid}
  • - *
- * The following are derived from other fields and thus not provided specifically: - *
    - *
  • {@link ApplicationInfo#getBaseResourcePath}
  • - *
  • {@link ApplicationInfo#getResourcePath}
  • - *
  • {@link ApplicationInfo#getSplitResourcePaths}
  • - *
  • {@link ApplicationInfo#publicSourceDir}
  • - *
  • {@link ApplicationInfo#scanPublicSourceDir}
  • - *
  • {@link ApplicationInfo#splitPublicSourceDirs}
  • - *
  • {@link ApplicationInfo#storageUuid}
  • - *
- * The following were deprecated at migration time and thus removed from this interface: - *
    - *
  • {@link ApplicationInfo#FLAG_IS_GAME}
  • - *
  • {@link ApplicationInfo#targetSandboxVersion}
  • - *
  • {@link ApplicationInfo#versionCode}
  • - *
- * TODO: The following fields are just not available at all. Never filled, even by legacy parsing? - *
    - *
  • {@link ApplicationInfo#FLAG_IS_DATA_ONLY}
  • - *
- * - * @hide - */ -public interface PkgWithoutStateAppInfo { - - /** - * @see ApplicationInfo#areAttributionsUserVisible() - * @see R.styleable#AndroidManifestApplication_attributionsAreUserVisible - */ - @Nullable - boolean areAttributionsUserVisible(); - - /** - * @see ApplicationInfo#appComponentFactory - * @see R.styleable#AndroidManifestApplication_appComponentFactory - */ - @Nullable - String getAppComponentFactory(); - - /** - * @see ApplicationInfo#AUTO_REVOKE_ALLOWED - * @see ApplicationInfo#AUTO_REVOKE_DISCOURAGED - * @see ApplicationInfo#AUTO_REVOKE_DISALLOWED - */ - int getAutoRevokePermissions(); - - /** - * @see ApplicationInfo#backupAgentName - * @see R.styleable#AndroidManifestApplication_backupAgent - */ - @Nullable - String getBackupAgentName(); - - /** - * @see ApplicationInfo#banner - * @see R.styleable#AndroidManifestApplication_banner - */ - int getBanner(); - - /** - * @see ApplicationInfo#sourceDir - * @see ApplicationInfo#getBaseCodePath - */ - @NonNull - String getBaseApkPath(); - - /** - * @see ApplicationInfo#category - * @see R.styleable#AndroidManifestApplication_appCategory - */ - int getCategory(); - - /** - * @see ApplicationInfo#classLoaderName - * @see R.styleable#AndroidManifestApplication_classLoader - */ - @Nullable - String getClassLoaderName(); - - /** - * @see ApplicationInfo#className - * @see R.styleable#AndroidManifestApplication_name - */ - @Nullable - String getClassName(); - - /** - * @see ApplicationInfo#compatibleWidthLimitDp - * @see R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp - */ - int getCompatibleWidthLimitDp(); - - /** - * @see ApplicationInfo#compileSdkVersion - * @see R.styleable#AndroidManifest_compileSdkVersion - */ - int getCompileSdkVersion(); - - /** - * @see ApplicationInfo#compileSdkVersionCodename - * @see R.styleable#AndroidManifest_compileSdkVersionCodename - */ - @Nullable - String getCompileSdkVersionCodeName(); - - /** - * @see ApplicationInfo#dataExtractionRulesRes - * @see R.styleable#AndroidManifestApplication_dataExtractionRules - */ - int getDataExtractionRules(); - - /** - * @see ApplicationInfo#descriptionRes - * @see R.styleable#AndroidManifestApplication_description - */ - int getDescriptionRes(); - - /** - * @see ApplicationInfo#fullBackupContent - * @see R.styleable#AndroidManifestApplication_fullBackupContent - */ - int getFullBackupContent(); - - /** - * @see ApplicationInfo#getGwpAsanMode() - * @see R.styleable#AndroidManifestApplication_gwpAsanMode - */ - @ApplicationInfo.GwpAsanMode - int getGwpAsanMode(); - - /** - * @see ApplicationInfo#iconRes - * @see R.styleable#AndroidManifestApplication_icon - */ - int getIconRes(); - - /** - * @see ApplicationInfo#installLocation - * @see R.styleable#AndroidManifest_installLocation - */ - int getInstallLocation(); - - /** - * @see ApplicationInfo#labelRes - * @see R.styleable#AndroidManifestApplication_label - */ - int getLabelRes(); - - /** - * @see ApplicationInfo#largestWidthLimitDp - * @see R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp - */ - int getLargestWidthLimitDp(); - - /** - * @see ApplicationInfo#logo - * @see R.styleable#AndroidManifestApplication_logo - */ - int getLogo(); - - /** - * @see ApplicationInfo#longVersionCode - */ - long getLongVersionCode(); - - /** - * @see ApplicationInfo#manageSpaceActivityName - * @see R.styleable#AndroidManifestApplication_manageSpaceActivity - */ - @Nullable - String getManageSpaceActivityName(); - - /** - * @see ApplicationInfo#maxAspectRatio - * @see R.styleable#AndroidManifestApplication_maxAspectRatio - */ - float getMaxAspectRatio(); - - /** - * @see ApplicationInfo#getMemtagMode() - * @see R.styleable#AndroidManifestApplication_memtagMode - */ - @ApplicationInfo.MemtagMode - int getMemtagMode(); - - /** - * @see ApplicationInfo#minAspectRatio - * @see R.styleable#AndroidManifestApplication_minAspectRatio - */ - float getMinAspectRatio(); - - /** - * @see ApplicationInfo#minSdkVersion - * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion - */ - int getMinSdkVersion(); - - /** - * @see R.styleable#AndroidManifestUsesSdk_maxSdkVersion - */ - int getMaxSdkVersion(); - - /** - * @see ApplicationInfo#getNativeHeapZeroInitialized() - * @see R.styleable#AndroidManifestApplication_nativeHeapZeroInitialized - */ - @ApplicationInfo.NativeHeapZeroInitialized - int getNativeHeapZeroInitialized(); - - /** - * @see ApplicationInfo#networkSecurityConfigRes - * @see R.styleable#AndroidManifestApplication_networkSecurityConfig - */ - int getNetworkSecurityConfigRes(); - - /** - * If {@link R.styleable#AndroidManifestApplication_label} is a string literal, this is it. - * Otherwise, it's stored as {@link #getLabelRes()}. - * - * @see ApplicationInfo#nonLocalizedLabel - * @see R.styleable#AndroidManifestApplication_label - */ - @Nullable - CharSequence getNonLocalizedLabel(); - - /** - * @see ApplicationInfo#scanSourceDir - * @see ApplicationInfo#getCodePath - */ - @NonNull - String getPath(); - - /** - * @see ApplicationInfo#permission - * @see R.styleable#AndroidManifestApplication_permission - */ - @Nullable - String getPermission(); - - /** - * @see ApplicationInfo#knownActivityEmbeddingCerts - * @see R.styleable#AndroidManifestApplication_knownActivityEmbeddingCerts - */ - @NonNull - Set getKnownActivityEmbeddingCerts(); - - /** - * @see ApplicationInfo#processName - * @see R.styleable#AndroidManifestApplication_process - */ - @NonNull - String getProcessName(); - - /** - * @see ApplicationInfo#requiresSmallestWidthDp - * @see R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp - */ - int getRequiresSmallestWidthDp(); - - /** - * Whether or not the app requested explicitly resizeable Activities. Null value means nothing - * was explicitly requested. - * - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE - */ - @Nullable - Boolean getResizeableActivity(); - - /** - * @see ApplicationInfo#roundIconRes - * @see R.styleable#AndroidManifestApplication_roundIcon - */ - int getRoundIconRes(); - - /** - * @see ApplicationInfo#splitClassLoaderNames - * @see R.styleable#AndroidManifestApplication_classLoader - */ - @Nullable - String[] getSplitClassLoaderNames(); - - /** - * @see ApplicationInfo#splitSourceDirs - * @see ApplicationInfo#getSplitCodePaths - */ - @NonNull - String[] getSplitCodePaths(); - - /** - * @see ApplicationInfo#splitDependencies - */ - @NonNull - SparseArray getSplitDependencies(); - - /** - * @see ApplicationInfo#targetSdkVersion - * @see R.styleable#AndroidManifestUsesSdk_targetSdkVersion - */ - int getTargetSdkVersion(); - - /** - * @see ApplicationInfo#targetSandboxVersion - * @see R.styleable#AndroidManifest_targetSandboxVersion - */ - int getTargetSandboxVersion(); - - /** - * @see ApplicationInfo#taskAffinity - * @see R.styleable#AndroidManifestApplication_taskAffinity - */ - @Nullable - String getTaskAffinity(); - - /** - * @see ApplicationInfo#theme - * @see R.styleable#AndroidManifestApplication_theme - */ - int getTheme(); - - /** - * @see ApplicationInfo#uiOptions - * @see R.styleable#AndroidManifestApplication_uiOptions - */ - int getUiOptions(); - - /** - * @see ApplicationInfo#volumeUuid - */ - @Nullable - String getVolumeUuid(); - - /** - * @see ApplicationInfo#zygotePreloadName - */ - @Nullable - String getZygotePreloadName(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION - * @see R.styleable#AndroidManifestApplication_requestForegroundServiceExemption - */ - boolean hasRequestForegroundServiceExemption(); - - /** - * @see ApplicationInfo#getRequestRawExternalStorageAccess() - * @see R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess - */ - Boolean hasRequestRawExternalStorageAccess(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE - */ - boolean isAllowAudioPlaybackCapture(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_BACKUP - */ - boolean isAllowBackup(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_CLEAR_USER_DATA - */ - boolean isAllowClearUserData(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE - */ - boolean isAllowClearUserDataOnFailedRestore(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING - */ - boolean isAllowNativeHeapPointerTagging(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_TASK_REPARENTING - */ - boolean isAllowTaskReparenting(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_anyDensity - * @see ApplicationInfo#FLAG_SUPPORTS_SCREEN_DENSITIES - */ - boolean isAnyDensity(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_BACKUP_IN_FOREGROUND - */ - boolean isBackupInForeground(); - - /** - * @see ApplicationInfo#FLAG_HARDWARE_ACCELERATED - */ - boolean isBaseHardwareAccelerated(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_CANT_SAVE_STATE - */ - boolean isCantSaveState(); - - /** - * @see ApplicationInfo#crossProfile - */ - boolean isCrossProfile(); - - /** - * @see ApplicationInfo#FLAG_DEBUGGABLE - */ - boolean isDebuggable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE - */ - boolean isDefaultToDeviceProtectedStorage(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_DIRECT_BOOT_AWARE - */ - boolean isDirectBootAware(); - - /** - * @see ApplicationInfo#enabled - * @see R.styleable#AndroidManifestApplication_enabled - */ - boolean isEnabled(); - - /** - * @see ApplicationInfo#FLAG_EXTERNAL_STORAGE - */ - boolean isExternalStorage(); - - /** - * @see ApplicationInfo#FLAG_EXTRACT_NATIVE_LIBS - */ - boolean isExtractNativeLibs(); - - /** - * @see ApplicationInfo#FLAG_FULL_BACKUP_ONLY - */ - boolean isFullBackupOnly(); - - /** - * @see ApplicationInfo#FLAG_HAS_CODE - */ - boolean isHasCode(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_HAS_DOMAIN_URLS - */ - boolean isHasDomainUrls(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_HAS_FRAGILE_USER_DATA - */ - boolean isHasFragileUserData(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ISOLATED_SPLIT_LOADING - */ - boolean isIsolatedSplitLoading(); - - /** - * @see ApplicationInfo#FLAG_KILL_AFTER_RESTORE - */ - boolean isKillAfterRestore(); - - /** - * @see ApplicationInfo#FLAG_LARGE_HEAP - */ - boolean isLargeHeap(); - - /** - * @see ApplicationInfo#FLAG_MULTIARCH - */ - boolean isMultiArch(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_IS_RESOURCE_OVERLAY - * @see ApplicationInfo#isResourceOverlay() - */ - boolean isOverlay(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE - */ - boolean isPartiallyDirectBootAware(); - - /** - * @see ApplicationInfo#FLAG_PERSISTENT - */ - boolean isPersistent(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_EXT_PROFILEABLE - */ - boolean isProfileable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PROFILEABLE_BY_SHELL - */ - boolean isProfileableByShell(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE - */ - boolean isRequestLegacyExternalStorage(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_resizeable - * @see ApplicationInfo#FLAG_RESIZEABLE_FOR_SCREENS - */ - boolean isResizeable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION - */ - boolean isResizeableActivityViaSdkVersion(); - - /** - * @see ApplicationInfo#FLAG_RESTORE_ANY_VERSION - */ - boolean isRestoreAnyVersion(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_STATIC_SHARED_LIBRARY - */ - boolean isStaticSharedLibrary(); - - /** - * True means that this package/app contains an SDK library. - */ - boolean isSdkLibrary(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#GINGERBREAD}. - * - * @see R.styleable#AndroidManifestSupportsScreens_xlargeScreens - * @see ApplicationInfo#FLAG_SUPPORTS_XLARGE_SCREENS - */ - boolean isSupportsExtraLargeScreens(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_largeScreens - * @see ApplicationInfo#FLAG_SUPPORTS_LARGE_SCREENS - */ - boolean isSupportsLargeScreens(); - - /** - * If omitted from manifest, returns true. - * - * @see R.styleable#AndroidManifestSupportsScreens_normalScreens - * @see ApplicationInfo#FLAG_SUPPORTS_NORMAL_SCREENS - */ - boolean isSupportsNormalScreens(); - - /** - * @see ApplicationInfo#FLAG_SUPPORTS_RTL - */ - boolean isSupportsRtl(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_smallScreens - * @see ApplicationInfo#FLAG_SUPPORTS_SMALL_SCREENS - */ - boolean isSupportsSmallScreens(); - - /** - * @see ApplicationInfo#FLAG_TEST_ONLY - */ - boolean isTestOnly(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_USE_EMBEDDED_DEX - */ - boolean isUseEmbeddedDex(); - - /** - * @see ApplicationInfo#FLAG_USES_CLEARTEXT_TRAFFIC - */ - boolean isUsesCleartextTraffic(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_USES_NON_SDK_API - */ - boolean isUsesNonSdkApi(); - - /** - * @see ApplicationInfo#FLAG_VM_SAFE_MODE - */ - boolean isVmSafeMode(); -} diff --git a/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStatePackageInfo.java b/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStatePackageInfo.java deleted file mode 100644 index 78ce6f1305cf5..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/PkgWithoutStatePackageInfo.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.pm.pkg.parsing; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.ComponentName; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.ConfigurationInfo; -import android.content.pm.FeatureGroupInfo; -import android.content.pm.FeatureInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PermissionInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ServiceInfo; - -import com.android.internal.R; -import com.android.server.pm.pkg.PackageUserState; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedInstrumentation; -import com.android.server.pm.pkg.component.ParsedPermission; -import com.android.server.pm.pkg.component.ParsedProvider; -import com.android.server.pm.pkg.component.ParsedService; - -import java.util.List; - -/** - * Container for fields that are eventually exposed through {@link PackageInfo}. - *

- * The following are dependent on system state and explicitly removed from this interface. They must - * be accessed by other means: - *

    - *
  • {@link PackageInfo#firstInstallTime}
  • - *
  • {@link PackageInfo#lastUpdateTime}
  • - *
  • {@link PackageInfo#gids}
  • - *
- * The following are derived from other fields and thus not provided specifically: - *
    - *
  • {@link PackageInfo#requestedPermissionsFlags}
  • - *
- * The following were deprecated at migration time and thus removed from this interface: - *
    - *
  • {@link PackageInfo#mOverlayIsStatic}
  • - *
  • {@link PackageInfo#overlayCategory}
  • - *
  • {@link PackageInfo#overlayPriority}
  • - *
  • {@link PackageInfo#overlayTarget}
  • - *
  • {@link PackageInfo#signatures}
  • - *
  • {@link PackageInfo#targetOverlayableName}
  • - *
  • {@link PackageInfo#versionCodeMajor}
  • - *
  • {@link PackageInfo#versionCode}
  • - *
- * The following are retrieved through other APIs: - *
    - *
  • {@link PackageInfo#signingInfo}
  • - *
  • {@link PackageInfo#isApex}
  • - *
- * - * @hide - */ -public interface PkgWithoutStatePackageInfo { - - /** - * Set of Activities parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ActivityInfo}. Effective state can be queried through - * {@link android.content.pm.PackageManager#getActivityInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ActivityInfo - * @see PackageInfo#activities - */ - @NonNull - List getActivities(); - - /** - * @see PackageInfo#baseRevisionCode - */ - int getBaseRevisionCode(); - - /** - * @see PackageInfo#compileSdkVersion - * @see R.styleable#AndroidManifest_compileSdkVersion - */ - int getCompileSdkVersion(); - - /** - * @see ApplicationInfo#compileSdkVersionCodename - * @see R.styleable#AndroidManifest_compileSdkVersionCodename - */ - @Nullable - String getCompileSdkVersionCodeName(); - - /** - * @see PackageInfo#configPreferences - * @see R.styleable#AndroidManifestUsesConfiguration - */ - @NonNull - List getConfigPreferences(); - - /** - * @see PackageInfo#featureGroups - * @see R.styleable#AndroidManifestUsesFeature - */ - @NonNull - List getFeatureGroups(); - - /** - * @see InstrumentationInfo - * @see PackageInfo#instrumentation - */ - @NonNull - List getInstrumentations(); - - /** - * @see PackageInfo#getLongVersionCode() - */ - long getLongVersionCode(); - - /** - * @see PackageInfo#packageName - */ - String getPackageName(); - - /** - * @see PermissionInfo - * @see PackageInfo#permissions - */ - @NonNull - List getPermissions(); - - /** - * Set of {@link android.content.ContentProvider ContentProviders} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ProviderInfo}. Effective state can be queried through - * {@link android.content.pm.PackageManager#getProviderInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ProviderInfo - * @see PackageInfo#providers - */ - @NonNull - List getProviders(); - - /** - * Set of {@link android.content.BroadcastReceiver BroadcastReceivers} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ActivityInfo}. Effective state can be queried through - * {@link android.content.pm.PackageManager#getReceiverInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * Since they share several attributes, receivers are parsed as {@link ParsedActivity}, even - * though they represent different functionality. - * - * TODO(b/135203078): Reconsider this and maybe make ParsedReceiver so it's not so confusing - * - * @see ActivityInfo - * @see PackageInfo#receivers - */ - @NonNull - List getReceivers(); - - /** - * @see PackageInfo#reqFeatures - * @see R.styleable#AndroidManifestUsesFeature - */ - @NonNull - List getRequestedFeatures(); - - /** - * All the permissions declared. This is an effective set, and may include permissions - * transformed from split/migrated permissions from previous versions, so may not be exactly - * what the package declares in its manifest. - * - * @see PackageInfo#requestedPermissions - * @see R.styleable#AndroidManifestUsesPermission - */ - @NonNull - List getRequestedPermissions(); - - /** - * @see PackageInfo#requiredAccountType - * @see R.styleable#AndroidManifestApplication_requiredAccountType - */ - @Nullable - String getRequiredAccountType(); - - /** - * The restricted account authenticator type that is used by this application. - * - * @see PackageInfo#restrictedAccountType - * @see R.styleable#AndroidManifestApplication_restrictedAccountType - */ - @Nullable - String getRestrictedAccountType(); - - /** - * Set of {@link android.app.Service Services} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ServiceInfo}. Effective state can be queried through - * {@link android.content.pm.PackageManager#getServiceInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ServiceInfo - * @see PackageInfo#services - */ - @NonNull - List getServices(); - - /** - * @see PackageInfo#sharedUserId - * @see R.styleable#AndroidManifest_sharedUserId - */ - @Nullable - String getSharedUserId(); - - /** - * @see PackageInfo#sharedUserLabel - * @see R.styleable#AndroidManifest_sharedUserLabel - */ - int getSharedUserLabel(); - - /** - * TODO(b/135203078): Move split stuff to an inner data class - * - * @see ApplicationInfo#splitNames - * @see PackageInfo#splitNames - */ - @NonNull - String[] getSplitNames(); - - /** - * @see PackageInfo#splitRevisionCodes - */ - @NonNull - int[] getSplitRevisionCodes(); - - /** - * @see PackageInfo#versionName - */ - @Nullable - String getVersionName(); - - /** - * @see PackageInfo#requiredForAllUsers - * @see R.styleable#AndroidManifestApplication_requiredForAllUsers - */ - boolean isRequiredForAllUsers(); -} diff --git a/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java b/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java index 48c58bbeb4052..af3b52fafc5a0 100644 --- a/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/AppsFilterImplTest.java @@ -851,13 +851,16 @@ public class AppsFilterImplTest { public void testActsOnTargetOfOverlay() throws Exception { final String actorName = "overlay://test/actorName"; - ParsingPackage target = pkg("com.some.package.target") - .addOverlayable("overlayableName", actorName); - ParsingPackage overlay = pkg("com.some.package.overlay") + var target = pkg("com.some.package.target") + .addOverlayable("overlayableName", actorName) + .hideAsParsed(); + var overlay = pkg("com.some.package.overlay") .setOverlay(true) .setOverlayTarget(target.getPackageName()) - .setOverlayTargetOverlayableName("overlayableName"); - ParsingPackage actor = pkg("com.some.package.actor"); + .setOverlayTargetOverlayableName("overlayableName") + .hideAsParsed(); + var actor = pkg("com.some.package.actor") + .hideAsParsed(); final AppsFilterImpl appsFilter = new AppsFilterImpl( mFeatureConfigMock, @@ -935,14 +938,16 @@ public class AppsFilterImplTest { final String actorName = "overlay://test/actorName"; - ParsingPackage target = pkg("com.some.package.target") - .addOverlayable("overlayableName", actorName); - ParsingPackage overlay = pkg("com.some.package.overlay") + var target = pkg("com.some.package.target") + .addOverlayable("overlayableName", actorName) + .hideAsParsed(); + var overlay = pkg("com.some.package.overlay") .setOverlay(true) .setOverlayTarget(target.getPackageName()) - .setOverlayTargetOverlayableName("overlayableName"); - ParsingPackage actorOne = pkg("com.some.package.actor.one"); - ParsingPackage actorTwo = pkg("com.some.package.actor.two"); + .setOverlayTargetOverlayableName("overlayableName") + .hideAsParsed(); + var actorOne = pkg("com.some.package.actor.one").hideAsParsed(); + var actorTwo = pkg("com.some.package.actor.two").hideAsParsed(); PackageSetting ps1 = getPackageSettingFromParsingPackage(actorOne, DUMMY_ACTOR_APPID, null /*settingBuilder*/); PackageSetting ps2 = getPackageSettingFromParsingPackage(actorTwo, DUMMY_ACTOR_APPID, @@ -1594,23 +1599,23 @@ public class AppsFilterImplTest { final Signature frameworkSignature = Mockito.mock(Signature.class); final SigningDetails frameworkSigningDetails = new SigningDetails(new Signature[]{frameworkSignature}, 1); - final ParsingPackage android = pkg("android"); + final ParsedPackage android = pkg("android").hideAsParsed(); simulateAddPackage(appsFilter, android, 1000, b -> b.setSigningDetails(frameworkSigningDetails)); } private PackageSetting simulateAddPackage(AppsFilterImpl filter, - ParsingPackage newPkgBuilder, int appId) { + ParsedPackage newPkgBuilder, int appId) { return simulateAddPackage(filter, newPkgBuilder, appId, null /*settingBuilder*/); } private PackageSetting simulateAddPackage(AppsFilterImpl filter, - ParsingPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action) { + ParsedPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action) { return simulateAddPackage(filter, newPkgBuilder, appId, action, null /*sharedUserSetting*/); } private PackageSetting simulateAddPackage(AppsFilterImpl filter, - ParsingPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action, + ParsedPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action, @Nullable SharedUserSetting sharedUserSetting) { final PackageSetting setting = getPackageSettingFromParsingPackage(newPkgBuilder, appId, action); @@ -1618,9 +1623,28 @@ public class AppsFilterImplTest { return setting; } - private PackageSetting getPackageSettingFromParsingPackage(ParsingPackage newPkgBuilder, + private PackageSetting simulateAddPackage(AppsFilterImpl filter, + ParsingPackage newPkgBuilder, int appId) { + return simulateAddPackage(filter, newPkgBuilder.hideAsParsed(), appId, + null /*settingBuilder*/); + } + + private PackageSetting simulateAddPackage(AppsFilterImpl filter, + ParsingPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action) { + return simulateAddPackage(filter, newPkgBuilder.hideAsParsed(), appId, action, + null /*sharedUserSetting*/); + } + + private PackageSetting simulateAddPackage(AppsFilterImpl filter, + ParsingPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action, + @Nullable SharedUserSetting sharedUserSetting) { + return simulateAddPackage(filter, newPkgBuilder.hideAsParsed(), appId, action, + sharedUserSetting); + } + + private PackageSetting getPackageSettingFromParsingPackage(ParsedPackage newPkgBuilder, int appId, @Nullable WithSettingBuilder action) { - AndroidPackage newPkg = ((ParsedPackage) newPkgBuilder.hideAsParsed()).hideAsFinal(); + AndroidPackage newPkg = newPkgBuilder.hideAsFinal(); final PackageSettingBuilder settingBuilder = new PackageSettingBuilder() .setPackage(newPkg) .setAppId(appId) diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerTests.java index 869ac8877d6de..a3f7ce504b922 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerTests.java @@ -71,6 +71,7 @@ import androidx.test.filters.Suppress; import com.android.frameworks.servicestests.R; import com.android.internal.content.InstallLocationUtils; +import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.pm.pkg.parsing.ParsingPackage; import com.android.server.pm.pkg.parsing.ParsingPackageUtils; @@ -341,9 +342,9 @@ public class PackageManagerTests extends AndroidTestCase { return Uri.fromFile(outFile); } - private ParsingPackage parsePackage(Uri packageURI) { + private ParsedPackage parsePackage(Uri packageURI) { final String archiveFilePath = packageURI.getPath(); - ParseResult result = ParsingPackageUtils.parseDefaultOneTime( + ParseResult result = ParsingPackageUtils.parseDefaultOneTime( new File(archiveFilePath), 0 /*flags*/, Collections.emptyList(), false /*collectCertificates*/); if (result.isError()) { @@ -433,7 +434,7 @@ public class PackageManagerTests extends AndroidTestCase { return INSTALL_LOC_ERR; } - private void assertInstall(ParsingPackage pkg, int flags, int expInstallLocation) { + private void assertInstall(ParsedPackage pkg, int flags, int expInstallLocation) { try { String pkgName = pkg.getPackageName(); ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); @@ -581,14 +582,14 @@ public class PackageManagerTests extends AndroidTestCase { class InstallParams { Uri packageURI; - ParsingPackage pkg; + ParsedPackage pkg; InstallParams(String outFileName, int rawResId) { this.pkg = getParsedPackage(outFileName, rawResId); this.packageURI = Uri.fromFile(new File(pkg.getPath())); } - InstallParams(ParsingPackage pkg) { + InstallParams(ParsedPackage pkg) { this.packageURI = Uri.fromFile(new File(pkg.getPath())); this.pkg = pkg; } @@ -696,7 +697,7 @@ public class PackageManagerTests extends AndroidTestCase { } } - private ParsingPackage getParsedPackage(String outFileName, int rawResId) { + private ParsedPackage getParsedPackage(String outFileName, int rawResId) { PackageManager pm = mContext.getPackageManager(); File filesDir = mContext.getFilesDir(); File outFile = new File(filesDir, outFileName); @@ -712,7 +713,7 @@ public class PackageManagerTests extends AndroidTestCase { private void installFromRawResource(InstallParams ip, int flags, boolean cleanUp, boolean fail, int result, int expInstallLocation) throws Exception { PackageManager pm = mContext.getPackageManager(); - ParsingPackage pkg = ip.pkg; + ParsedPackage pkg = ip.pkg; Uri packageURI = ip.packageURI; if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) { // Make sure the package doesn't exist @@ -1876,7 +1877,7 @@ public class PackageManagerTests extends AndroidTestCase { int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; String apk1Name = "install1.apk"; String apk2Name = "install2.apk"; - ParsingPackage pkg1 = getParsedPackage(apk1Name, apk1); + var pkg1 = getParsedPackage(apk1Name, apk1); try { InstallParams ip = installFromRawResource(apk1Name, apk1, 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -2474,7 +2475,7 @@ public class PackageManagerTests extends AndroidTestCase { File outFile = new File(filesDir, apk2Name); int rawResId = apk2; Uri packageURI = getInstallablePackage(rawResId, outFile); - ParsingPackage pkg = parsePackage(packageURI); + var pkg = parsePackage(packageURI); try { getPi().uninstall(pkg.getPackageName(), PackageManager.DELETE_ALL_USERS, @@ -2544,8 +2545,8 @@ public class PackageManagerTests extends AndroidTestCase { int retCode, int expMatchResult) throws Exception { String apk1Name = "install1.apk"; String apk2Name = "install2.apk"; - ParsingPackage pkg1 = getParsedPackage(apk1Name, apk1); - ParsingPackage pkg2 = getParsedPackage(apk2Name, apk2); + var pkg1 = getParsedPackage(apk1Name, apk1); + var pkg2 = getParsedPackage(apk2Name, apk2); try { // Clean up before testing first. @@ -2641,7 +2642,7 @@ public class PackageManagerTests extends AndroidTestCase { false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); PackageManager pm = mContext.getPackageManager(); // Delete app2 - ParsingPackage pkg = getParsedPackage(apk2Name, apk2); + var pkg = getParsedPackage(apk2Name, apk2); try { getPi().uninstall(pkg.getPackageName(), PackageManager.DELETE_ALL_USERS, null /*statusReceiver*/); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 32e278b0540d4..9bc584a454629 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -218,13 +218,13 @@ public class PackageParserTest { setKnownFields(pkg); Parcel p = Parcel.obtain(); - ((Parcelable) pkg).writeToParcel(p, 0 /* flags */); + ((Parcelable) pkg.hideAsParsed().hideAsFinal()).writeToParcel(p, 0 /* flags */); p.setDataPosition(0); - ParsingPackage deserialized = new PackageImpl(p); + AndroidPackage deserialized = new PackageImpl(p); p.setDataPosition(0); - ParsingPackage deserialized2 = new PackageImpl(p); + AndroidPackage deserialized2 = new PackageImpl(p); assertSame(deserialized.getPackageName(), deserialized2.getPackageName()); assertSame(deserialized.getPermission(), diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java index be37cf6bd7b04..f013ecc973542 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java @@ -580,21 +580,21 @@ public class PackageParserLegacyCoreTest { apexInfo.versionCode = 191000070; int flags = PackageManager.GET_META_DATA | PackageManager.GET_SIGNING_CERTIFICATES; - ParseResult result = ParsingPackageUtils.parseDefaultOneTime(apexFile, + ParseResult result = ParsingPackageUtils.parseDefaultOneTime(apexFile, flags, Collections.emptyList(), false /*collectCertificates*/); if (result.isError()) { throw new IllegalStateException(result.getErrorMessage(), result.getException()); } ParseTypeImpl input = ParseTypeImpl.forDefaultParsing(); - ParsingPackage pkg = result.getResult(); + ParsedPackage pkg = result.getResult(); ParseResult ret = ParsingPackageUtils.getSigningDetails( input, pkg, false /*skipVerify*/); if (ret.isError()) { throw new IllegalStateException(ret.getErrorMessage(), ret.getException()); } pkg.setSigningDetails(ret.getResult()); - PackageInfo pi = PackageInfoUtils.generate(pkg.hideAsParsed().setApex(true), apexInfo, + PackageInfo pi = PackageInfoUtils.generate(pkg.setApex(true).hideAsFinal(), apexInfo, flags, null, UserHandle.USER_SYSTEM); assertEquals("com.google.android.tzdata", pi.applicationInfo.packageName); diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParsingDeferErrorTest.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParsingDeferErrorTest.kt index bb094ba897e6b..9626fc3be3b3f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParsingDeferErrorTest.kt +++ b/services/tests/servicestests/src/com/android/server/pm/parsing/PackageParsingDeferErrorTest.kt @@ -24,6 +24,7 @@ import android.content.pm.parsing.result.ParseResult import android.platform.test.annotations.Presubmit import androidx.test.InstrumentationRegistry import com.android.frameworks.servicestests.R +import com.android.server.pm.parsing.pkg.ParsedPackage import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertWithMessage import org.junit.Rule @@ -114,7 +115,7 @@ class PackageParsingDeferErrorTest { assertThat(result.isError).isTrue() } - private fun parseFile(@RawRes id: Int): ParseResult { + private fun parseFile(@RawRes id: Int): ParseResult { val file = tempFolder.newFile() context.resources.openRawResource(id).use { input -> file.outputStream().use { output -> From 0d367578ee74d7f67a0d75f4038daad72ff47b79 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Wed, 3 Aug 2022 16:25:12 +0000 Subject: [PATCH 4/4] Pull members from internal AndroidPackage to system API Consolidates methods to prepare for swapping the interface naming to make AndroidPackage (currently AndroidPackageApi) the source of truth for the package APIs. Test: none, just moving methods around Change-Id: If24a29e611874fad61877d9d13c05ab57e2fb2d8 --- .../server/pm/parsing/pkg/AndroidPackage.java | 1148 ----------------- .../server/pm/pkg/AndroidPackageApi.java | 924 ++++++++++++- 2 files changed, 892 insertions(+), 1180 deletions(-) diff --git a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java index ec7dcd8280f43..b314fe28431c1 100644 --- a/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java +++ b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java @@ -16,49 +16,8 @@ package com.android.server.pm.parsing.pkg; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.ComponentName; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.ConfigurationInfo; -import android.content.pm.FeatureGroupInfo; -import android.content.pm.FeatureInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PermissionInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ServiceInfo; -import android.content.pm.SigningDetails; -import android.os.Bundle; -import android.util.ArraySet; -import android.util.Pair; -import android.util.SparseArray; -import android.util.SparseIntArray; - -import com.android.internal.R; import com.android.internal.content.om.OverlayConfig; import com.android.server.pm.pkg.AndroidPackageApi; -import com.android.server.pm.pkg.PackageUserState; -import com.android.server.pm.pkg.component.ParsedActivity; -import com.android.server.pm.pkg.component.ParsedApexSystemService; -import com.android.server.pm.pkg.component.ParsedAttribution; -import com.android.server.pm.pkg.component.ParsedInstrumentation; -import com.android.server.pm.pkg.component.ParsedIntentInfo; -import com.android.server.pm.pkg.component.ParsedPermission; -import com.android.server.pm.pkg.component.ParsedPermissionGroup; -import com.android.server.pm.pkg.component.ParsedProcess; -import com.android.server.pm.pkg.component.ParsedProvider; -import com.android.server.pm.pkg.component.ParsedService; -import com.android.server.pm.pkg.component.ParsedUsesPermission; -import com.android.server.pm.pkg.parsing.ParsingPackageUtils; - -import java.security.PublicKey; -import java.util.List; -import java.util.Map; -import java.util.Set; /** * The last state of a package during parsing/install before it is available in {@link @@ -72,1111 +31,4 @@ import java.util.Set; */ public interface AndroidPackage extends AndroidPackageApi, OverlayConfig.PackageProvider.Package { - /** - * @see ApplicationInfo#areAttributionsUserVisible() - * @see R.styleable#AndroidManifestApplication_attributionsAreUserVisible - */ - @Nullable - boolean areAttributionsUserVisible(); - - /** - * Set of Activities parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ActivityInfo}. Effective state can be queried through - * {@link android.content.pm.PackageManager#getActivityInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ActivityInfo - * @see PackageInfo#activities - */ - @NonNull - @Override - List getActivities(); - - /** - * The names of packages to adopt ownership of permissions from, parsed under {@link - * ParsingPackageUtils#TAG_ADOPT_PERMISSIONS}. - * - * @see R.styleable#AndroidManifestOriginalPackage_name - */ - @NonNull - List getAdoptPermissions(); - - /** - * @see R.styleable#AndroidManifestApexSystemService - */ - @NonNull - List getApexSystemServices(); - - /** - * @see ApplicationInfo#appComponentFactory - * @see R.styleable#AndroidManifestApplication_appComponentFactory - */ - @Nullable - String getAppComponentFactory(); - - @NonNull - List getAttributions(); - - /** - * @see ApplicationInfo#AUTO_REVOKE_ALLOWED - * @see ApplicationInfo#AUTO_REVOKE_DISCOURAGED - * @see ApplicationInfo#AUTO_REVOKE_DISALLOWED - */ - int getAutoRevokePermissions(); - - /** - * @see ApplicationInfo#backupAgentName - * @see R.styleable#AndroidManifestApplication_backupAgent - */ - @Nullable - String getBackupAgentName(); - - /** - * @see ApplicationInfo#banner - * @see R.styleable#AndroidManifestApplication_banner - */ - int getBanner(); - - /** - * @see ApplicationInfo#sourceDir - * @see ApplicationInfo#getBaseCodePath - */ - @NonNull - String getBaseApkPath(); - - /** - * @see PackageInfo#baseRevisionCode - */ - int getBaseRevisionCode(); - - /** - * @see ApplicationInfo#category - * @see R.styleable#AndroidManifestApplication_appCategory - */ - int getCategory(); - - /** - * @see ApplicationInfo#classLoaderName - * @see R.styleable#AndroidManifestApplication_classLoader - */ - @Nullable - String getClassLoaderName(); - - /** - * @see ApplicationInfo#className - * @see R.styleable#AndroidManifestApplication_name - */ - @Nullable - String getClassName(); - - /** - * @see ApplicationInfo#compatibleWidthLimitDp - * @see R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp - */ - int getCompatibleWidthLimitDp(); - - /** - * @see ApplicationInfo#compileSdkVersion - * @see R.styleable#AndroidManifest_compileSdkVersion - */ - int getCompileSdkVersion(); - - /** - * @see ApplicationInfo#compileSdkVersionCodename - * @see R.styleable#AndroidManifest_compileSdkVersionCodename - */ - @Nullable - String getCompileSdkVersionCodeName(); - - /** - * @see PackageInfo#configPreferences - * @see R.styleable#AndroidManifestUsesConfiguration - */ - @NonNull - List getConfigPreferences(); - - /** - * @see ApplicationInfo#dataExtractionRulesRes - * @see R.styleable#AndroidManifestApplication_dataExtractionRules - */ - int getDataExtractionRules(); - - /** - * @see ApplicationInfo#descriptionRes - * @see R.styleable#AndroidManifestApplication_description - */ - int getDescriptionRes(); - - /** - * @see PackageInfo#featureGroups - * @see R.styleable#AndroidManifestUsesFeature - */ - @NonNull - List getFeatureGroups(); - - /** - * @see ApplicationInfo#fullBackupContent - * @see R.styleable#AndroidManifestApplication_fullBackupContent - */ - int getFullBackupContent(); - - /** - * @see ApplicationInfo#getGwpAsanMode() - * @see R.styleable#AndroidManifestApplication_gwpAsanMode - */ - @ApplicationInfo.GwpAsanMode - int getGwpAsanMode(); - - /** - * @see ApplicationInfo#iconRes - * @see R.styleable#AndroidManifestApplication_icon - */ - int getIconRes(); - - /** - * Permissions requested but not in the manifest. These may have been split or migrated from - * previous versions/definitions. - */ - @NonNull - List getImplicitPermissions(); - - /** - * @see ApplicationInfo#installLocation - * @see R.styleable#AndroidManifest_installLocation - */ - int getInstallLocation(); - - /** - * @see InstrumentationInfo - * @see PackageInfo#instrumentation - */ - @NonNull - List getInstrumentations(); - - /** - * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link - * ParsingPackageUtils#TAG_KEY_SETS}. - * - * @see R.styleable#AndroidManifestKeySet - * @see R.styleable#AndroidManifestPublicKey - */ - @NonNull - Map> getKeySetMapping(); - - /** - * @see ApplicationInfo#mKnownActivityEmbeddingCerts - * @see R.styleable#AndroidManifestApplication_knownActivityEmbeddingCerts - */ - @NonNull - Set getKnownActivityEmbeddingCerts(); - - /** - * @see ApplicationInfo#labelRes - * @see R.styleable#AndroidManifestApplication_label - */ - int getLabelRes(); - - /** - * @see ApplicationInfo#largestWidthLimitDp - * @see R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp - */ - int getLargestWidthLimitDp(); - - /** - * Library names this package is declared as, for use by other packages with "uses-library". - * - * @see R.styleable#AndroidManifestLibrary - */ - @NonNull - List getLibraryNames(); - - /** - * The resource ID used to provide the application's locales configuration. - * - * @see R.styleable#AndroidManifestApplication_localeConfig - */ - int getLocaleConfigRes(); - - /** - * @see ApplicationInfo#logo - * @see R.styleable#AndroidManifestApplication_logo - */ - int getLogo(); - - /** - * @see PackageInfo#getLongVersionCode() - */ - long getLongVersionCode(); - - /** - * @see ApplicationInfo#manageSpaceActivityName - * @see R.styleable#AndroidManifestApplication_manageSpaceActivity - */ - @Nullable - String getManageSpaceActivityName(); - - /** - * The package name as declared in the manifest, since the package can be renamed. For example, - * static shared libs use synthetic package names. - */ - @NonNull - String getManifestPackageName(); - - /** - * @see ApplicationInfo#maxAspectRatio - * @see R.styleable#AndroidManifestApplication_maxAspectRatio - */ - float getMaxAspectRatio(); - - /** - * @see R.styleable#AndroidManifestUsesSdk_maxSdkVersion - */ - int getMaxSdkVersion(); - - /** - * @see ApplicationInfo#getMemtagMode() - * @see R.styleable#AndroidManifestApplication_memtagMode - */ - @ApplicationInfo.MemtagMode - int getMemtagMode(); - - /** - * TODO(b/135203078): Make all the Bundles immutable (and non-null by shared empty reference?) - */ - @Nullable - Bundle getMetaData(); - - @Nullable - Set getMimeGroups(); - - /** - * @see ApplicationInfo#minAspectRatio - * @see R.styleable#AndroidManifestApplication_minAspectRatio - */ - float getMinAspectRatio(); - - /** - * @see R.styleable#AndroidManifestExtensionSdk - */ - @Nullable - SparseIntArray getMinExtensionVersions(); - - /** - * @see ApplicationInfo#minSdkVersion - * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion - */ - int getMinSdkVersion(); - - /** - * @see ApplicationInfo#getNativeHeapZeroInitialized() - * @see R.styleable#AndroidManifestApplication_nativeHeapZeroInitialized - */ - @ApplicationInfo.NativeHeapZeroInitialized - int getNativeHeapZeroInitialized(); - - /** - * @see ApplicationInfo#networkSecurityConfigRes - * @see R.styleable#AndroidManifestApplication_networkSecurityConfig - */ - int getNetworkSecurityConfigRes(); - - /** - * If {@link R.styleable#AndroidManifestApplication_label} is a string literal, this is it. - * Otherwise, it's stored as {@link #getLabelRes()}. - * - * @see ApplicationInfo#nonLocalizedLabel - * @see R.styleable#AndroidManifestApplication_label - */ - @Nullable - CharSequence getNonLocalizedLabel(); - - /** - * For system use to migrate from an old package name to a new one, moving over data if - * available. - * - * @see R.styleable#AndroidManifestOriginalPackage} - */ - @NonNull - List getOriginalPackages(); - - /** - * Map of overlayable name to actor name. - */ - @NonNull - Map getOverlayables(); - - /** - * @see PackageInfo#overlayCategory - * @see R.styleable#AndroidManifestResourceOverlay_category - */ - @Nullable - String getOverlayCategory(); - - /** - * @see PackageInfo#overlayPriority - * @see R.styleable#AndroidManifestResourceOverlay_priority - */ - int getOverlayPriority(); - - /** - * @see PackageInfo#overlayTarget - * @see R.styleable#AndroidManifestResourceOverlay_targetPackage - */ - @Nullable - String getOverlayTarget(); - - /** - * @see PackageInfo#targetOverlayableName - * @see R.styleable#AndroidManifestResourceOverlay_targetName - */ - @Nullable - String getOverlayTargetOverlayableName(); - - /** - * @see PackageInfo#mOverlayIsStatic - */ - boolean isOverlayIsStatic(); - - /** - * @see PackageInfo#packageName - */ - String getPackageName(); - - /** - * @see ApplicationInfo#scanSourceDir - * @see ApplicationInfo#getCodePath - */ - @NonNull - String getPath(); - - /** - * @see ApplicationInfo#permission - * @see R.styleable#AndroidManifestApplication_permission - */ - @Nullable - String getPermission(); - - /** - * @see android.content.pm.PermissionGroupInfo - */ - @NonNull - List getPermissionGroups(); - - /** - * @see PermissionInfo - * @see PackageInfo#permissions - */ - @NonNull - List getPermissions(); - - /** - * Used to determine the default preferred handler of an {@link Intent}. - *

- * Map of component className to intent info inside that component. TODO(b/135203078): Is this - * actually used/working? - */ - @NonNull - List> getPreferredActivityFilters(); - - /** - * @see ApplicationInfo#processName - * @see R.styleable#AndroidManifestApplication_process - */ - @NonNull - String getProcessName(); - - /** - * @see android.content.pm.ProcessInfo - */ - @NonNull - Map getProcesses(); - - /** - * Returns the properties set on the application - */ - @NonNull - Map getProperties(); - - /** - * System protected broadcasts. - * - * @see R.styleable#AndroidManifestProtectedBroadcast - */ - @NonNull - List getProtectedBroadcasts(); - - /** - * Set of {@link android.content.ContentProvider ContentProviders} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ProviderInfo}. Effective state can be queried through - * {@link PackageManager#getProviderInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ProviderInfo - * @see PackageInfo#providers - */ - @NonNull - List getProviders(); - - /** - * Intents that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesIntent - */ - @NonNull - List getQueriesIntents(); - - /** - * Other packages that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesPackage - */ - @NonNull - List getQueriesPackages(); - - /** - * Authorities that this package may query or require and thus requires visibility into. - * - * @see R.styleable#AndroidManifestQueriesProvider - */ - @NonNull - Set getQueriesProviders(); - - /** - * Set of {@link android.content.BroadcastReceiver BroadcastReceivers} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ActivityInfo}. Effective state can be queried through - * {@link PackageManager#getReceiverInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * Since they share several attributes, receivers are parsed as {@link ParsedActivity}, even - * though they represent different functionality. - * - * TODO(b/135203078): Reconsider this and maybe make ParsedReceiver so it's not so confusing - * - * @see ActivityInfo - * @see PackageInfo#receivers - */ - @NonNull - List getReceivers(); - - /** - * @see PackageInfo#reqFeatures - * @see R.styleable#AndroidManifestUsesFeature - */ - @NonNull - List getRequestedFeatures(); - - /** - * All the permissions declared. This is an effective set, and may include permissions - * transformed from split/migrated permissions from previous versions, so may not be exactly - * what the package declares in its manifest. - * - * @see PackageInfo#requestedPermissions - * @see R.styleable#AndroidManifestUsesPermission - */ - @NonNull - List getRequestedPermissions(); - - /** - * @see PackageInfo#requiredAccountType - * @see R.styleable#AndroidManifestApplication_requiredAccountType - */ - @Nullable - String getRequiredAccountType(); - - /** - * @see ApplicationInfo#requiresSmallestWidthDp - * @see R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp - */ - int getRequiresSmallestWidthDp(); - - /** - * Whether or not the app requested explicitly resizeable Activities. Null value means nothing - * was explicitly requested. - * - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE - */ - @Nullable - Boolean getResizeableActivity(); - - /** - * SHA-512 hash of the only APK that can be used to update a system package. - * - * @see R.styleable#AndroidManifestRestrictUpdate - */ - @Nullable - byte[] getRestrictUpdateHash(); - - /** - * The restricted account authenticator type that is used by this application. - * - * @see PackageInfo#restrictedAccountType - * @see R.styleable#AndroidManifestApplication_restrictedAccountType - */ - @Nullable - String getRestrictedAccountType(); - - /** - * @see ApplicationInfo#roundIconRes - * @see R.styleable#AndroidManifestApplication_roundIcon - */ - int getRoundIconRes(); - - /** - * @see R.styleable#AndroidManifestSdkLibrary_name - */ - @Nullable - String getSdkLibName(); - - /** - * @see R.styleable#AndroidManifestSdkLibrary_versionMajor - */ - int getSdkLibVersionMajor(); - - /** - * Set of {@link android.app.Service Services} parsed from the manifest. - * - * This contains minimal system state and does not - * provide the same information as {@link ServiceInfo}. Effective state can be queried through - * {@link PackageManager#getServiceInfo(ComponentName, int)} or by - * combining state from from com.android.server.pm.pkg.PackageState and - * {@link PackageUserState}. - * - * @see ServiceInfo - * @see PackageInfo#services - */ - @NonNull - List getServices(); - - /** - * @see PackageInfo#sharedUserId - * @see R.styleable#AndroidManifest_sharedUserId - */ - @Nullable - String getSharedUserId(); - - /** - * @see PackageInfo#sharedUserLabel - * @see R.styleable#AndroidManifest_sharedUserLabel - */ - int getSharedUserLabel(); - - /** - * The signature data of all APKs in this package, which must be exactly the same across the - * base and splits. - */ - @NonNull - SigningDetails getSigningDetails(); - - /** - * @see ApplicationInfo#splitClassLoaderNames - * @see R.styleable#AndroidManifestApplication_classLoader - */ - @Nullable - String[] getSplitClassLoaderNames(); - - /** - * @see ApplicationInfo#splitSourceDirs - * @see ApplicationInfo#getSplitCodePaths - */ - @NonNull - String[] getSplitCodePaths(); - - /** - * @see ApplicationInfo#splitDependencies - */ - @NonNull - SparseArray getSplitDependencies(); - - /** - * Flags of any split APKs; ordered by parsed splitName - */ - @Nullable - int[] getSplitFlags(); - - /** - * TODO(b/135203078): Move split stuff to an inner data class - * - * @see ApplicationInfo#splitNames - * @see PackageInfo#splitNames - */ - @NonNull - String[] getSplitNames(); - - /** - * @see PackageInfo#splitRevisionCodes - */ - @NonNull - int[] getSplitRevisionCodes(); - - /** - * @see R.styleable#AndroidManifestStaticLibrary_name - */ - @Nullable - String getStaticSharedLibName(); - - /** - * @see R.styleable#AndroidManifestStaticLibrary_version - */ - long getStaticSharedLibVersion(); - - /** - * @see ApplicationInfo#targetSandboxVersion - * @see R.styleable#AndroidManifest_targetSandboxVersion - */ - int getTargetSandboxVersion(); - - /** - * @see ApplicationInfo#targetSdkVersion - * @see R.styleable#AndroidManifestUsesSdk_targetSdkVersion - */ - int getTargetSdkVersion(); - - /** - * @see ApplicationInfo#taskAffinity - * @see R.styleable#AndroidManifestApplication_taskAffinity - */ - @Nullable - String getTaskAffinity(); - - /** - * @see ApplicationInfo#theme - * @see R.styleable#AndroidManifestApplication_theme - */ - int getTheme(); - - /** - * @see ApplicationInfo#uiOptions - * @see R.styleable#AndroidManifestApplication_uiOptions - */ - int getUiOptions(); - - /** - * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link - * ParsingPackageUtils#TAG_KEY_SETS}. - * - * @see R.styleable#AndroidManifestUpgradeKeySet - */ - @NonNull - Set getUpgradeKeySets(); - - /** - * @see R.styleable#AndroidManifestUsesLibrary - */ - @NonNull - List getUsesLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesNativeLibrary - */ - @NonNull - List getUsesNativeLibraries(); - - /** - * Like {@link #getUsesLibraries()}, but marked optional by setting {@link - * R.styleable#AndroidManifestUsesLibrary_required} to false . Application is expected to handle - * absence manually. - * - * @see R.styleable#AndroidManifestUsesLibrary - */ - @NonNull - List getUsesOptionalLibraries(); - - /** - * Like {@link #getUsesNativeLibraries()}, but marked optional by setting {@link - * R.styleable#AndroidManifestUsesNativeLibrary_required} to false . Application is expected to - * handle absence manually. - * - * @see R.styleable#AndroidManifestUsesNativeLibrary - */ - @NonNull - List getUsesOptionalNativeLibraries(); - - @NonNull - List getUsesPermissions(); - - /** - * TODO(b/135203078): Move SDK library stuff to an inner data class - * - * @see R.styleable#AndroidManifestUsesSdkLibrary - */ - @NonNull - List getUsesSdkLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesSdkLibrary_certDigest - */ - @Nullable - String[][] getUsesSdkLibrariesCertDigests(); - - /** - * @see R.styleable#AndroidManifestUsesSdkLibrary_versionMajor - */ - @Nullable - long[] getUsesSdkLibrariesVersionsMajor(); - - /** - * TODO(b/135203078): Move static library stuff to an inner data class - * - * @see R.styleable#AndroidManifestUsesStaticLibrary - */ - @NonNull - List getUsesStaticLibraries(); - - /** - * @see R.styleable#AndroidManifestUsesStaticLibrary_certDigest - */ - @Nullable - String[][] getUsesStaticLibrariesCertDigests(); - - /** - * @see R.styleable#AndroidManifestUsesStaticLibrary_version - */ - @Nullable - long[] getUsesStaticLibrariesVersions(); - - /** - * @see PackageInfo#versionName - */ - @Nullable - String getVersionName(); - - /** - * @see ApplicationInfo#volumeUuid - */ - @Nullable - String getVolumeUuid(); - - boolean hasPreserveLegacyExternalStorage(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION - * @see R.styleable#AndroidManifestApplication_requestForegroundServiceExemption - */ - boolean hasRequestForegroundServiceExemption(); - - /** - * @see ApplicationInfo#getRequestRawExternalStorageAccess() - * @see R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess - */ - Boolean hasRequestRawExternalStorageAccess(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE - */ - boolean isAllowAudioPlaybackCapture(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_BACKUP - */ - boolean isAllowBackup(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_CLEAR_USER_DATA - */ - boolean isAllowClearUserData(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE - */ - boolean isAllowClearUserDataOnFailedRestore(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING - */ - boolean isAllowNativeHeapPointerTagging(); - - /** - * @see ApplicationInfo#FLAG_ALLOW_TASK_REPARENTING - */ - boolean isAllowTaskReparenting(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_anyDensity - * @see ApplicationInfo#FLAG_SUPPORTS_SCREEN_DENSITIES - */ - boolean isAnyDensity(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_BACKUP_IN_FOREGROUND - */ - boolean isBackupInForeground(); - - /** - * @see ApplicationInfo#FLAG_HARDWARE_ACCELERATED - */ - boolean isBaseHardwareAccelerated(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_CANT_SAVE_STATE - */ - boolean isCantSaveState(); - - /** - * @see ApplicationInfo#crossProfile - */ - boolean isCrossProfile(); - - /** - * @see ApplicationInfo#FLAG_DEBUGGABLE - */ - boolean isDebuggable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE - */ - boolean isDefaultToDeviceProtectedStorage(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_DIRECT_BOOT_AWARE - */ - boolean isDirectBootAware(); - - /** - * @see ApplicationInfo#enabled - * @see R.styleable#AndroidManifestApplication_enabled - */ - boolean isEnabled(); - - /** - * @see ApplicationInfo#FLAG_EXTERNAL_STORAGE - */ - boolean isExternalStorage(); - - /** - * @see ApplicationInfo#FLAG_EXTRACT_NATIVE_LIBS - */ - boolean isExtractNativeLibs(); - - /** - * @see R.styleable#AndroidManifestApplication_forceQueryable - */ - boolean isForceQueryable(); - - /** - * @see ApplicationInfo#FLAG_FULL_BACKUP_ONLY - */ - boolean isFullBackupOnly(); - - /** - * @see ApplicationInfo#FLAG_IS_GAME - */ - @Deprecated - boolean isGame(); - - /** - * @see ApplicationInfo#FLAG_HAS_CODE - */ - boolean isHasCode(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_HAS_DOMAIN_URLS - */ - boolean isHasDomainUrls(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_HAS_FRAGILE_USER_DATA - */ - boolean isHasFragileUserData(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ISOLATED_SPLIT_LOADING - */ - boolean isIsolatedSplitLoading(); - - /** - * @see ApplicationInfo#FLAG_KILL_AFTER_RESTORE - */ - boolean isKillAfterRestore(); - - /** - * @see ApplicationInfo#FLAG_LARGE_HEAP - */ - boolean isLargeHeap(); - - /** - * Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value - * smaller than the current SDK version. - * @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion - */ - boolean isLeavingSharedUid(); - - /** - * @see ApplicationInfo#FLAG_MULTIARCH - */ - boolean isMultiArch(); - - /** - * @see R.styleable.AndroidManifestApplication_enableOnBackInvokedCallback - */ - boolean isOnBackInvokedCallbackEnabled(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_IS_RESOURCE_OVERLAY - * @see ApplicationInfo#isResourceOverlay() - */ - boolean isOverlay(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE - */ - boolean isPartiallyDirectBootAware(); - - /** - * @see ApplicationInfo#FLAG_PERSISTENT - */ - boolean isPersistent(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_EXT_PROFILEABLE - */ - boolean isProfileable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_PROFILEABLE_BY_SHELL - */ - boolean isProfileableByShell(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE - */ - boolean isRequestLegacyExternalStorage(); - - /** - * @see PackageInfo#requiredForAllUsers - * @see R.styleable#AndroidManifestApplication_requiredForAllUsers - */ - boolean isRequiredForAllUsers(); - - /** - * Whether the enabled settings of components in the application should be reset to the default, - * when the application's user data is cleared. - * - * @see R.styleable#AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared - */ - boolean isResetEnabledSettingsOnAppDataCleared(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_resizeable - * @see ApplicationInfo#FLAG_RESIZEABLE_FOR_SCREENS - */ - boolean isResizeable(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION - */ - boolean isResizeableActivityViaSdkVersion(); - - /** - * @see ApplicationInfo#FLAG_RESTORE_ANY_VERSION - */ - boolean isRestoreAnyVersion(); - - /** - * True means that this package/app contains an SDK library. - */ - boolean isSdkLibrary(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_STATIC_SHARED_LIBRARY - */ - boolean isStaticSharedLibrary(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#GINGERBREAD}. - * - * @see R.styleable#AndroidManifestSupportsScreens_xlargeScreens - * @see ApplicationInfo#FLAG_SUPPORTS_XLARGE_SCREENS - */ - boolean isSupportsExtraLargeScreens(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_largeScreens - * @see ApplicationInfo#FLAG_SUPPORTS_LARGE_SCREENS - */ - boolean isSupportsLargeScreens(); - - /** - * If omitted from manifest, returns true. - * - * @see R.styleable#AndroidManifestSupportsScreens_normalScreens - * @see ApplicationInfo#FLAG_SUPPORTS_NORMAL_SCREENS - */ - boolean isSupportsNormalScreens(); - - /** - * @see ApplicationInfo#FLAG_SUPPORTS_RTL - */ - boolean isSupportsRtl(); - - /** - * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link - * android.os.Build.VERSION_CODES#DONUT}. - * - * @see R.styleable#AndroidManifestSupportsScreens_smallScreens - * @see ApplicationInfo#FLAG_SUPPORTS_SMALL_SCREENS - */ - boolean isSupportsSmallScreens(); - - /** - * @see ApplicationInfo#FLAG_TEST_ONLY - */ - boolean isTestOnly(); - - /** - * The install time abi override to choose 32bit abi's when multiple abi's are present. This is - * only meaningful for multiarch applications. The use32bitAbi attribute is ignored if - * cpuAbiOverride is also set. - * - * @see R.attr#use32bitAbi - */ - boolean isUse32BitAbi(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_USE_EMBEDDED_DEX - */ - boolean isUseEmbeddedDex(); - - /** - * @see ApplicationInfo#FLAG_USES_CLEARTEXT_TRAFFIC - */ - boolean isUsesCleartextTraffic(); - - /** - * @see ApplicationInfo#PRIVATE_FLAG_USES_NON_SDK_API - */ - boolean isUsesNonSdkApi(); - - /** - * Set if the any of components are visible to instant applications. - * - * @see R.styleable#AndroidManifestActivity_visibleToInstantApps - * @see R.styleable#AndroidManifestProvider_visibleToInstantApps - * @see R.styleable#AndroidManifestService_visibleToInstantApps - */ - boolean isVisibleToInstantApps(); - - /** - * @see ApplicationInfo#FLAG_VM_SAFE_MODE - */ - boolean isVmSafeMode(); } diff --git a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java b/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java index 55262982f9639..a454bcd5620ca 100644 --- a/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java +++ b/services/core/java/com/android/server/pm/pkg/AndroidPackageApi.java @@ -18,261 +18,933 @@ package com.android.server.pm.pkg; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; import android.annotation.SystemApi; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.FeatureGroupInfo; import android.content.pm.FeatureInfo; +import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SigningDetails; +import android.os.Bundle; +import android.util.ArraySet; +import android.util.Pair; import android.util.SparseArray; +import android.util.SparseIntArray; +import com.android.internal.R; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedActivity; +import com.android.server.pm.pkg.component.ParsedApexSystemService; import com.android.server.pm.pkg.component.ParsedAttribution; import com.android.server.pm.pkg.component.ParsedInstrumentation; +import com.android.server.pm.pkg.component.ParsedIntentInfo; import com.android.server.pm.pkg.component.ParsedPermission; +import com.android.server.pm.pkg.component.ParsedPermissionGroup; +import com.android.server.pm.pkg.component.ParsedProcess; import com.android.server.pm.pkg.component.ParsedProvider; import com.android.server.pm.pkg.component.ParsedService; +import com.android.server.pm.pkg.component.ParsedUsesPermission; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; +import java.security.PublicKey; import java.util.List; +import java.util.Map; +import java.util.Set; /** * Explicit interface used for consumers like mainline who need a {@link SystemApi @SystemApi} form * of {@link AndroidPackage}. + * * @hide */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) public interface AndroidPackageApi { + /** + * @see ApplicationInfo#areAttributionsUserVisible() + * @see R.styleable#AndroidManifestApplication_attributionsAreUserVisible + */ + @Nullable boolean areAttributionsUserVisible(); + /** + * Set of Activities parsed from the manifest. + *

+ * This contains minimal system state and does not + * provide the same information as {@link ActivityInfo}. Effective state can be queried through + * {@link android.content.pm.PackageManager#getActivityInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ActivityInfo + * @see PackageInfo#activities + */ @NonNull List getActivities(); + /** + * The names of packages to adopt ownership of permissions from, parsed under {@link + * ParsingPackageUtils#TAG_ADOPT_PERMISSIONS}. + * + * @see R.styleable#AndroidManifestOriginalPackage_name + */ @NonNull List getAdoptPermissions(); + /** + * @see R.styleable#AndroidManifestApexSystemService + */ + @NonNull + List getApexSystemServices(); + + /** + * @see ApplicationInfo#appComponentFactory + * @see R.styleable#AndroidManifestApplication_appComponentFactory + */ @Nullable String getAppComponentFactory(); @NonNull List getAttributions(); + /** + * @see ApplicationInfo#AUTO_REVOKE_ALLOWED + * @see ApplicationInfo#AUTO_REVOKE_DISCOURAGED + * @see ApplicationInfo#AUTO_REVOKE_DISALLOWED + */ int getAutoRevokePermissions(); + /** + * @see ApplicationInfo#backupAgentName + * @see R.styleable#AndroidManifestApplication_backupAgent + */ @Nullable String getBackupAgentName(); + /** + * @see ApplicationInfo#banner + * @see R.styleable#AndroidManifestApplication_banner + */ int getBanner(); + /** + * @see ApplicationInfo#sourceDir + * @see ApplicationInfo#getBaseCodePath + */ @NonNull String getBaseApkPath(); + /** + * @see PackageInfo#baseRevisionCode + */ int getBaseRevisionCode(); + /** + * @see ApplicationInfo#category + * @see R.styleable#AndroidManifestApplication_appCategory + */ int getCategory(); + /** + * @see ApplicationInfo#classLoaderName + * @see R.styleable#AndroidManifestApplication_classLoader + */ @Nullable String getClassLoaderName(); + /** + * @see ApplicationInfo#className + * @see R.styleable#AndroidManifestApplication_name + */ @Nullable String getClassName(); + /** + * @see ApplicationInfo#compatibleWidthLimitDp + * @see R.styleable#AndroidManifestSupportsScreens_compatibleWidthLimitDp + */ int getCompatibleWidthLimitDp(); + /** + * @see ApplicationInfo#compileSdkVersion + * @see R.styleable#AndroidManifest_compileSdkVersion + */ int getCompileSdkVersion(); + /** + * @see ApplicationInfo#compileSdkVersionCodename + * @see R.styleable#AndroidManifest_compileSdkVersionCodename + */ @Nullable String getCompileSdkVersionCodeName(); + /** + * @see PackageInfo#configPreferences + * @see R.styleable#AndroidManifestUsesConfiguration + */ @NonNull List getConfigPreferences(); + /** + * @see ApplicationInfo#dataExtractionRulesRes + * @see R.styleable#AndroidManifestApplication_dataExtractionRules + */ int getDataExtractionRules(); + /** + * @see ApplicationInfo#descriptionRes + * @see R.styleable#AndroidManifestApplication_description + */ int getDescriptionRes(); + /** + * @see PackageInfo#featureGroups + * @see R.styleable#AndroidManifestUsesFeature + */ @NonNull List getFeatureGroups(); + /** + * @see ApplicationInfo#fullBackupContent + * @see R.styleable#AndroidManifestApplication_fullBackupContent + */ int getFullBackupContent(); + /** + * @see ApplicationInfo#getGwpAsanMode() + * @see R.styleable#AndroidManifestApplication_gwpAsanMode + */ + @ApplicationInfo.GwpAsanMode int getGwpAsanMode(); + /** + * @see ApplicationInfo#iconRes + * @see R.styleable#AndroidManifestApplication_icon + */ int getIconRes(); + /** + * Permissions requested but not in the manifest. These may have been split or migrated from + * previous versions/definitions. + */ @NonNull List getImplicitPermissions(); + /** + * @see ApplicationInfo#installLocation + * @see R.styleable#AndroidManifest_installLocation + */ int getInstallLocation(); + /** + * @see InstrumentationInfo + * @see PackageInfo#instrumentation + */ @NonNull List getInstrumentations(); + /** + * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link + * ParsingPackageUtils#TAG_KEY_SETS}. + * + * @see R.styleable#AndroidManifestKeySet + * @see R.styleable#AndroidManifestPublicKey + */ + @NonNull + Map> getKeySetMapping(); + + /** + * @see ApplicationInfo#mKnownActivityEmbeddingCerts + * @see R.styleable#AndroidManifestApplication_knownActivityEmbeddingCerts + */ + @SuppressWarnings("JavadocReference") + @NonNull + Set getKnownActivityEmbeddingCerts(); + + /** + * @see ApplicationInfo#labelRes + * @see R.styleable#AndroidManifestApplication_label + */ int getLabelRes(); + /** + * @see ApplicationInfo#largestWidthLimitDp + * @see R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp + */ int getLargestWidthLimitDp(); + /** + * Library names this package is declared as, for use by other packages with "uses-library". + * + * @see R.styleable#AndroidManifestLibrary + */ + @NonNull + List getLibraryNames(); + + /** + * The resource ID used to provide the application's locales configuration. + * + * @see R.styleable#AndroidManifestApplication_localeConfig + */ + int getLocaleConfigRes(); + + /** + * @see ApplicationInfo#logo + * @see R.styleable#AndroidManifestApplication_logo + */ int getLogo(); + /** + * @see PackageInfo#getLongVersionCode() + */ long getLongVersionCode(); + /** + * @see ApplicationInfo#manageSpaceActivityName + * @see R.styleable#AndroidManifestApplication_manageSpaceActivity + */ @Nullable String getManageSpaceActivityName(); + /** + * The package name as declared in the manifest, since the package can be renamed. For example, + * static shared libs use synthetic package names. + */ + @NonNull + String getManifestPackageName(); + + /** + * @see ApplicationInfo#maxAspectRatio + * @see R.styleable#AndroidManifestApplication_maxAspectRatio + */ float getMaxAspectRatio(); + /** + * @see R.styleable#AndroidManifestUsesSdk_maxSdkVersion + */ + int getMaxSdkVersion(); + + /** + * @see ApplicationInfo#getMemtagMode() + * @see R.styleable#AndroidManifestApplication_memtagMode + */ + @ApplicationInfo.MemtagMode int getMemtagMode(); + /** + * TODO(b/135203078): Make all the Bundles immutable (and non-null by shared empty reference?) + */ + @Nullable + Bundle getMetaData(); + + @Nullable + Set getMimeGroups(); + + /** + * @see ApplicationInfo#minAspectRatio + * @see R.styleable#AndroidManifestApplication_minAspectRatio + */ float getMinAspectRatio(); + /** + * @see R.styleable#AndroidManifestExtensionSdk + */ + @Nullable + SparseIntArray getMinExtensionVersions(); + + /** + * @see ApplicationInfo#minSdkVersion + * @see R.styleable#AndroidManifestUsesSdk_minSdkVersion + */ int getMinSdkVersion(); + /** + * @see ApplicationInfo#getNativeHeapZeroInitialized() + * @see R.styleable#AndroidManifestApplication_nativeHeapZeroInitialized + */ + @ApplicationInfo.NativeHeapZeroInitialized int getNativeHeapZeroInitialized(); /** - * @see ApplicationInfo#nativeLibraryDir - */ + * @see ApplicationInfo#nativeLibraryDir + */ @Nullable String getNativeLibraryDir(); /** - * @see ApplicationInfo#nativeLibraryRootDir - */ + * @see ApplicationInfo#nativeLibraryRootDir + */ @Nullable String getNativeLibraryRootDir(); + /** + * @see ApplicationInfo#networkSecurityConfigRes + * @see R.styleable#AndroidManifestApplication_networkSecurityConfig + */ int getNetworkSecurityConfigRes(); + /** + * If {@link R.styleable#AndroidManifestApplication_label} is a string literal, this is it. + * Otherwise, it's stored as {@link #getLabelRes()}. + * + * @see ApplicationInfo#nonLocalizedLabel + * @see R.styleable#AndroidManifestApplication_label + */ @Nullable CharSequence getNonLocalizedLabel(); + /** + * For system use to migrate from an old package name to a new one, moving over data if + * available. + * + * @see R.styleable#AndroidManifestOriginalPackage} + */ @NonNull + List getOriginalPackages(); + + /** + * @see PackageInfo#overlayCategory + * @see R.styleable#AndroidManifestResourceOverlay_category + */ + @Nullable + String getOverlayCategory(); + + /** + * @see PackageInfo#overlayPriority + * @see R.styleable#AndroidManifestResourceOverlay_priority + */ + int getOverlayPriority(); + + /** + * @see PackageInfo#overlayTarget + * @see R.styleable#AndroidManifestResourceOverlay_targetPackage + */ + @Nullable + String getOverlayTarget(); + + /** + * @see PackageInfo#targetOverlayableName + * @see R.styleable#AndroidManifestResourceOverlay_targetName + */ + @Nullable + String getOverlayTargetOverlayableName(); + + /** + * Map of overlayable name to actor name. + */ + @NonNull + Map getOverlayables(); + + /** + * @see PackageInfo#packageName + */ String getPackageName(); + /** + * @see ApplicationInfo#scanSourceDir + * @see ApplicationInfo#getCodePath + */ @NonNull String getPath(); + /** + * @see ApplicationInfo#permission + * @see R.styleable#AndroidManifestApplication_permission + */ @Nullable String getPermission(); + /** + * @see android.content.pm.PermissionGroupInfo + */ + @NonNull + List getPermissionGroups(); + + /** + * @see PermissionInfo + * @see PackageInfo#permissions + */ @NonNull List getPermissions(); + /** + * Used to determine the default preferred handler of an {@link Intent}. + *

+ * Map of component className to intent info inside that component. TODO(b/135203078): Is this + * actually used/working? + */ + @NonNull + List> getPreferredActivityFilters(); + + /** + * @see ApplicationInfo#processName + * @see R.styleable#AndroidManifestApplication_process + */ @NonNull String getProcessName(); + /** + * @see android.content.pm.ProcessInfo + */ + @NonNull + Map getProcesses(); + + /** + * Returns the properties set on the application + */ + @NonNull + Map getProperties(); + + /** + * System protected broadcasts. + * + * @see R.styleable#AndroidManifestProtectedBroadcast + */ + @NonNull + List getProtectedBroadcasts(); + + /** + * Set of {@link android.content.ContentProvider ContentProviders} parsed from the manifest. + *

+ * This contains minimal system state and does not + * provide the same information as {@link ProviderInfo}. Effective state can be queried through + * {@link PackageManager#getProviderInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ProviderInfo + * @see PackageInfo#providers + */ @NonNull List getProviders(); + /** + * Intents that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesIntent + */ + @NonNull + List getQueriesIntents(); + + /** + * Other packages that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesPackage + */ + @NonNull + List getQueriesPackages(); + + /** + * Authorities that this package may query or require and thus requires visibility into. + * + * @see R.styleable#AndroidManifestQueriesProvider + */ + @NonNull + Set getQueriesProviders(); + + /** + * Set of {@link android.content.BroadcastReceiver BroadcastReceivers} parsed from the manifest. + *

+ * This contains minimal system state and does not + * provide the same information as {@link ActivityInfo}. Effective state can be queried through + * {@link PackageManager#getReceiverInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + *

+ * Since they share several attributes, receivers are parsed as {@link ParsedActivity}, even + * though they represent different functionality. + *

+ * TODO(b/135203078): Reconsider this and maybe make ParsedReceiver so it's not so confusing + * + * @see ActivityInfo + * @see PackageInfo#receivers + */ @NonNull List getReceivers(); + /** + * @see PackageInfo#reqFeatures + * @see R.styleable#AndroidManifestUsesFeature + */ @NonNull List getRequestedFeatures(); + /** + * All the permissions declared. This is an effective set, and may include permissions + * transformed from split/migrated permissions from previous versions, so may not be exactly + * what the package declares in its manifest. + * + * @see PackageInfo#requestedPermissions + * @see R.styleable#AndroidManifestUsesPermission + */ @NonNull List getRequestedPermissions(); + /** + * @see PackageInfo#requiredAccountType + * @see R.styleable#AndroidManifestApplication_requiredAccountType + */ @Nullable String getRequiredAccountType(); + /** + * @see ApplicationInfo#requiresSmallestWidthDp + * @see R.styleable#AndroidManifestSupportsScreens_requiresSmallestWidthDp + */ int getRequiresSmallestWidthDp(); - @SuppressLint("AutoBoxing") + /** + * Whether or not the app requested explicitly resizeable Activities. Null value means nothing + * was explicitly requested. + * + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_UNRESIZEABLE + */ @Nullable Boolean getResizeableActivity(); + /** + * SHA-512 hash of the only APK that can be used to update a system package. + * + * @see R.styleable#AndroidManifestRestrictUpdate + */ + @Nullable + byte[] getRestrictUpdateHash(); + + /** + * The restricted account authenticator type that is used by this application. + * + * @see PackageInfo#restrictedAccountType + * @see R.styleable#AndroidManifestApplication_restrictedAccountType + */ @Nullable String getRestrictedAccountType(); + /** + * @see ApplicationInfo#roundIconRes + * @see R.styleable#AndroidManifestApplication_roundIcon + */ int getRoundIconRes(); /** - * @see ApplicationInfo#secondaryNativeLibraryDir - */ + * @see R.styleable#AndroidManifestSdkLibrary_name + */ + @Nullable + String getSdkLibName(); + + /** + * @see R.styleable#AndroidManifestSdkLibrary_versionMajor + */ + int getSdkLibVersionMajor(); + + /** + * @see ApplicationInfo#secondaryNativeLibraryDir + */ @Nullable String getSecondaryNativeLibraryDir(); + /** + * Set of {@link android.app.Service Services} parsed from the manifest. + *

+ * This contains minimal system state and does not + * provide the same information as {@link ServiceInfo}. Effective state can be queried through + * {@link PackageManager#getServiceInfo(ComponentName, int)} or by + * combining state from from com.android.server.pm.pkg.PackageState and + * {@link PackageUserState}. + * + * @see ServiceInfo + * @see PackageInfo#services + */ @NonNull List getServices(); + /** + * @see PackageInfo#sharedUserId + * @see R.styleable#AndroidManifest_sharedUserId + */ @Nullable String getSharedUserId(); + /** + * @see PackageInfo#sharedUserLabel + * @see R.styleable#AndroidManifest_sharedUserLabel + */ int getSharedUserLabel(); + /** + * The signature data of all APKs in this package, which must be exactly the same across the + * base and splits. + */ @NonNull + SigningDetails getSigningDetails(); + + /** + * @see ApplicationInfo#splitClassLoaderNames + * @see R.styleable#AndroidManifestApplication_classLoader + */ + @Nullable String[] getSplitClassLoaderNames(); + /** + * @see ApplicationInfo#splitSourceDirs + * @see ApplicationInfo#getSplitCodePaths + */ @NonNull String[] getSplitCodePaths(); - @Nullable + /** + * @see ApplicationInfo#splitDependencies + */ + @NonNull SparseArray getSplitDependencies(); + /** + * Flags of any split APKs; ordered by parsed splitName + */ + @Nullable + int[] getSplitFlags(); + + /** + * TODO(b/135203078): Move split stuff to an inner data class + * + * @see ApplicationInfo#splitNames + * @see PackageInfo#splitNames + */ @NonNull String[] getSplitNames(); + /** + * @see PackageInfo#splitRevisionCodes + */ @NonNull int[] getSplitRevisionCodes(); + /** + * @see R.styleable#AndroidManifestStaticLibrary_name + */ + @Nullable + String getStaticSharedLibName(); + + /** + * @see R.styleable#AndroidManifestStaticLibrary_version + */ + long getStaticSharedLibVersion(); + + /** + * @see ApplicationInfo#targetSandboxVersion + * @see R.styleable#AndroidManifest_targetSandboxVersion + */ int getTargetSandboxVersion(); + /** + * @see ApplicationInfo#targetSdkVersion + * @see R.styleable#AndroidManifestUsesSdk_targetSdkVersion + */ int getTargetSdkVersion(); + /** + * @see ApplicationInfo#taskAffinity + * @see R.styleable#AndroidManifestApplication_taskAffinity + */ @Nullable String getTaskAffinity(); + /** + * @see ApplicationInfo#theme + * @see R.styleable#AndroidManifestApplication_theme + */ int getTheme(); + /** + * @see ApplicationInfo#uiOptions + * @see R.styleable#AndroidManifestApplication_uiOptions + */ int getUiOptions(); /** - * This is an appId, the {@link ApplicationInfo#uid} if the user ID is - * {@link android.os.UserHandle#SYSTEM}. - * - * @deprecated Use {@link PackageState#getAppId()} instead. - */ + * This is an appId, the {@link ApplicationInfo#uid} if the user ID is + * {@link android.os.UserHandle#SYSTEM}. + * + * @deprecated Use {@link PackageState#getAppId()} instead. + */ @Deprecated int getUid(); + /** + * For use with {@link com.android.server.pm.KeySetManagerService}. Parsed in {@link + * ParsingPackageUtils#TAG_KEY_SETS}. + * + * @see R.styleable#AndroidManifestUpgradeKeySet + */ + @NonNull + Set getUpgradeKeySets(); + + /** + * @see R.styleable#AndroidManifestUsesLibrary + */ + @NonNull + List getUsesLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesNativeLibrary + */ + @NonNull + List getUsesNativeLibraries(); + + /** + * Like {@link #getUsesLibraries()}, but marked optional by setting {@link + * R.styleable#AndroidManifestUsesLibrary_required} to false . Application is expected to handle + * absence manually. + * + * @see R.styleable#AndroidManifestUsesLibrary + */ + @NonNull + List getUsesOptionalLibraries(); + + /** + * Like {@link #getUsesNativeLibraries()}, but marked optional by setting {@link + * R.styleable#AndroidManifestUsesNativeLibrary_required} to false . Application is expected to + * handle absence manually. + * + * @see R.styleable#AndroidManifestUsesNativeLibrary + */ + @NonNull + List getUsesOptionalNativeLibraries(); + + @NonNull + List getUsesPermissions(); + + /** + * TODO(b/135203078): Move SDK library stuff to an inner data class + * + * @see R.styleable#AndroidManifestUsesSdkLibrary + */ + @NonNull + List getUsesSdkLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesSdkLibrary_certDigest + */ + @Nullable + String[][] getUsesSdkLibrariesCertDigests(); + + /** + * @see R.styleable#AndroidManifestUsesSdkLibrary_versionMajor + */ + @Nullable + long[] getUsesSdkLibrariesVersionsMajor(); + + /** + * TODO(b/135203078): Move static library stuff to an inner data class + * + * @see R.styleable#AndroidManifestUsesStaticLibrary + */ + @NonNull + List getUsesStaticLibraries(); + + /** + * @see R.styleable#AndroidManifestUsesStaticLibrary_certDigest + */ + @Nullable + String[][] getUsesStaticLibrariesCertDigests(); + + /** + * @see R.styleable#AndroidManifestUsesStaticLibrary_version + */ + @Nullable + long[] getUsesStaticLibrariesVersions(); + + /** + * @see PackageInfo#versionName + */ @Nullable String getVersionName(); + /** + * @see ApplicationInfo#volumeUuid + */ @Nullable String getVolumeUuid(); @Nullable String getZygotePreloadName(); + boolean hasPreserveLegacyExternalStorage(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION + * @see R.styleable#AndroidManifestApplication_requestForegroundServiceExemption + */ boolean hasRequestForegroundServiceExemption(); - @SuppressLint("AutoBoxing") - @Nullable + /** + * @see ApplicationInfo#getRequestRawExternalStorageAccess() + * @see R.styleable#AndroidManifestApplication_requestRawExternalStorageAccess + */ Boolean hasRequestRawExternalStorageAccess(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_AUDIO_PLAYBACK_CAPTURE + */ boolean isAllowAudioPlaybackCapture(); + /** + * @see ApplicationInfo#FLAG_ALLOW_BACKUP + */ boolean isAllowBackup(); + /** + * @see ApplicationInfo#FLAG_ALLOW_CLEAR_USER_DATA + */ boolean isAllowClearUserData(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE + */ boolean isAllowClearUserDataOnFailedRestore(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_ALLOW_NATIVE_HEAP_POINTER_TAGGING + */ boolean isAllowNativeHeapPointerTagging(); + /** + * @see ApplicationInfo#FLAG_ALLOW_TASK_REPARENTING + */ boolean isAllowTaskReparenting(); + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_anyDensity + * @see ApplicationInfo#FLAG_SUPPORTS_SCREEN_DENSITIES + */ boolean isAnyDensity(); boolean isApex(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_BACKUP_IN_FOREGROUND + */ boolean isBackupInForeground(); + /** + * @see ApplicationInfo#FLAG_HARDWARE_ACCELERATED + */ boolean isBaseHardwareAccelerated(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_CANT_SAVE_STATE + */ boolean isCantSaveState(); /** @@ -280,93 +952,218 @@ public interface AndroidPackageApi { */ boolean isCoreApp(); + /** + * @see ApplicationInfo#crossProfile + */ boolean isCrossProfile(); + /** + * @see ApplicationInfo#FLAG_DEBUGGABLE + */ boolean isDebuggable(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE + */ boolean isDefaultToDeviceProtectedStorage(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_DIRECT_BOOT_AWARE + */ boolean isDirectBootAware(); + /** + * @see ApplicationInfo#enabled + * @see R.styleable#AndroidManifestApplication_enabled + */ boolean isEnabled(); + /** + * @see ApplicationInfo#FLAG_EXTERNAL_STORAGE + */ boolean isExternalStorage(); + /** + * @see ApplicationInfo#FLAG_EXTRACT_NATIVE_LIBS + */ boolean isExtractNativeLibs(); /** - * @see ApplicationInfo#FLAG_FACTORY_TEST - */ + * @see ApplicationInfo#FLAG_FACTORY_TEST + */ boolean isFactoryTest(); + /** + * @see R.styleable#AndroidManifestApplication_forceQueryable + */ + boolean isForceQueryable(); + + /** + * @see ApplicationInfo#FLAG_FULL_BACKUP_ONLY + */ boolean isFullBackupOnly(); + /** + * @see ApplicationInfo#FLAG_IS_GAME + */ + @Deprecated + boolean isGame(); + + /** + * @see ApplicationInfo#FLAG_HAS_CODE + */ boolean isHasCode(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_HAS_DOMAIN_URLS + */ boolean isHasDomainUrls(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_HAS_FRAGILE_USER_DATA + */ boolean isHasFragileUserData(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_ISOLATED_SPLIT_LOADING + */ boolean isIsolatedSplitLoading(); + /** + * @see ApplicationInfo#FLAG_KILL_AFTER_RESTORE + */ boolean isKillAfterRestore(); + /** + * @see ApplicationInfo#FLAG_LARGE_HEAP + */ boolean isLargeHeap(); + /** + * Returns true if R.styleable#AndroidManifest_sharedUserMaxSdkVersion is set to a value + * smaller than the current SDK version. + * + * @see R.styleable#AndroidManifest_sharedUserMaxSdkVersion + */ + boolean isLeavingSharedUid(); + + /** + * @see ApplicationInfo#FLAG_MULTIARCH + */ boolean isMultiArch(); /** - * @see ApplicationInfo#nativeLibraryRootRequiresIsa - */ + * @see ApplicationInfo#nativeLibraryRootRequiresIsa + */ boolean isNativeLibraryRootRequiresIsa(); /** - * @see ApplicationInfo#PRIVATE_FLAG_ODM - */ + * @see ApplicationInfo#PRIVATE_FLAG_ODM + */ boolean isOdm(); /** - * @see ApplicationInfo#PRIVATE_FLAG_OEM - */ + * @see ApplicationInfo#PRIVATE_FLAG_OEM + */ boolean isOem(); + /** + * @see R.styleable#AndroidManifestApplication_enableOnBackInvokedCallback + */ + boolean isOnBackInvokedCallbackEnabled(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_IS_RESOURCE_OVERLAY + * @see ApplicationInfo#isResourceOverlay() + */ boolean isOverlay(); + /** + * @see PackageInfo#mOverlayIsStatic + */ + boolean isOverlayIsStatic(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE + */ boolean isPartiallyDirectBootAware(); + /** + * @see ApplicationInfo#FLAG_PERSISTENT + */ boolean isPersistent(); /** - * @see ApplicationInfo#PRIVATE_FLAG_PRIVILEGED - */ + * @see ApplicationInfo#PRIVATE_FLAG_PRIVILEGED + */ boolean isPrivileged(); /** - * @see ApplicationInfo#PRIVATE_FLAG_PRODUCT - */ + * @see ApplicationInfo#PRIVATE_FLAG_PRODUCT + */ boolean isProduct(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_EXT_PROFILEABLE + */ boolean isProfileable(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_PROFILEABLE_BY_SHELL + */ boolean isProfileableByShell(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_REQUEST_LEGACY_EXTERNAL_STORAGE + */ boolean isRequestLegacyExternalStorage(); + /** + * @see PackageInfo#requiredForAllUsers + * @see R.styleable#AndroidManifestApplication_requiredForAllUsers + */ boolean isRequiredForAllUsers(); + /** + * Whether the enabled settings of components in the application should be reset to the default, + * when the application's user data is cleared. + * + * @see R.styleable#AndroidManifestApplication_resetEnabledSettingsOnAppDataCleared + */ + boolean isResetEnabledSettingsOnAppDataCleared(); + + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_resizeable + * @see ApplicationInfo#FLAG_RESIZEABLE_FOR_SCREENS + */ boolean isResizeable(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION + */ boolean isResizeableActivityViaSdkVersion(); + /** + * @see ApplicationInfo#FLAG_RESTORE_ANY_VERSION + */ boolean isRestoreAnyVersion(); + /** + * True means that this package/app contains an SDK library. + */ boolean isSdkLibrary(); /** - * @see ApplicationInfo#PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY - */ + * @see ApplicationInfo#PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY + */ boolean isSignedWithPlatformKey(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_STATIC_SHARED_LIBRARY + */ boolean isStaticSharedLibrary(); /** @@ -374,14 +1171,44 @@ public interface AndroidPackageApi { */ boolean isStub(); + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#GINGERBREAD}. + * + * @see R.styleable#AndroidManifestSupportsScreens_xlargeScreens + * @see ApplicationInfo#FLAG_SUPPORTS_XLARGE_SCREENS + */ boolean isSupportsExtraLargeScreens(); + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_largeScreens + * @see ApplicationInfo#FLAG_SUPPORTS_LARGE_SCREENS + */ boolean isSupportsLargeScreens(); + /** + * If omitted from manifest, returns true. + * + * @see R.styleable#AndroidManifestSupportsScreens_normalScreens + * @see ApplicationInfo#FLAG_SUPPORTS_NORMAL_SCREENS + */ boolean isSupportsNormalScreens(); + /** + * @see ApplicationInfo#FLAG_SUPPORTS_RTL + */ boolean isSupportsRtl(); + /** + * If omitted from manifest, returns true if {@link #getTargetSdkVersion()} >= {@link + * android.os.Build.VERSION_CODES#DONUT}. + * + * @see R.styleable#AndroidManifestSupportsScreens_smallScreens + * @see ApplicationInfo#FLAG_SUPPORTS_SMALL_SCREENS + */ boolean isSupportsSmallScreens(); /** @@ -394,18 +1221,51 @@ public interface AndroidPackageApi { */ boolean isSystemExt(); + /** + * @see ApplicationInfo#FLAG_TEST_ONLY + */ boolean isTestOnly(); + /** + * The install time abi override to choose 32bit abi's when multiple abi's are present. This is + * only meaningful for multiarch applications. The use32bitAbi attribute is ignored if + * cpuAbiOverride is also set. + * + * @see R.attr#use32bitAbi + */ + boolean isUse32BitAbi(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_USE_EMBEDDED_DEX + */ boolean isUseEmbeddedDex(); + /** + * @see ApplicationInfo#FLAG_USES_CLEARTEXT_TRAFFIC + */ boolean isUsesCleartextTraffic(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_USES_NON_SDK_API + */ boolean isUsesNonSdkApi(); /** - * @see ApplicationInfo#PRIVATE_FLAG_VENDOR - */ + * @see ApplicationInfo#PRIVATE_FLAG_VENDOR + */ boolean isVendor(); + /** + * Set if the any of components are visible to instant applications. + * + * @see R.styleable#AndroidManifestActivity_visibleToInstantApps + * @see R.styleable#AndroidManifestProvider_visibleToInstantApps + * @see R.styleable#AndroidManifestService_visibleToInstantApps + */ + boolean isVisibleToInstantApps(); + + /** + * @see ApplicationInfo#FLAG_VM_SAFE_MODE + */ boolean isVmSafeMode(); }