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/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/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..5be81d5700e04 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,13 @@ 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.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 +97,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 +138,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(); + AndroidPackageUtils.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 +382,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 +460,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 = AndroidPackageUtils.toAppInfoWithoutState(pkg); + + updateApplicationInfo(info, flags, state); initForUser(info, pkg, userId); @@ -265,6 +495,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 +507,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 +525,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 +595,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 +612,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 +652,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 +693,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 +736,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 +762,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 +827,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 +897,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 +945,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 +970,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 +997,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 +1021,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 +1063,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 +1098,22 @@ public class PackageInfoUtils { } } + @NonNull + public static File getDataDir(AndroidPackage 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/AndroidPackage.java b/services/core/java/com/android/server/pm/parsing/pkg/AndroidPackage.java index b357ba0a6b4b9..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,11 +16,7 @@ package com.android.server.pm.parsing.pkg; -import android.annotation.NonNull; - import com.android.internal.content.om.OverlayConfig; -import com.android.server.pm.pkg.parsing.ParsingPackageRead; - import com.android.server.pm.pkg.AndroidPackageApi; /** @@ -33,13 +29,6 @@ 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 { - /** - * 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(); } 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 748d32894d8a4..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 @@ -16,45 +16,387 @@ 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.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 AndroidPackage#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 +416,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 +469,2057 @@ 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; + } + + @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; + } + + @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 +2528,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,25 +2555,49 @@ 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.hideAsParsed(); + public PackageImpl hideAsParsed() { + 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); @@ -250,37 +2642,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; } @@ -478,25 +2871,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; @@ -519,7 +2912,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); @@ -529,11 +3055,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(); @@ -543,9 +3215,11 @@ 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(); assignDerivedFields(); + assignDerivedFields2(); } @NonNull @@ -568,7 +3242,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An } public boolean isStub() { - return getBoolean(Booleans.STUB); + return getBoolean2(Booleans2.STUB); } @Nullable @@ -629,7 +3303,7 @@ public class PackageImpl extends ParsingPackageImpl implements ParsedPackage, An @Override public boolean isApex() { - return getBoolean(Booleans.APEX); + return getBoolean2(Booleans2.APEX); } @Override @@ -677,7 +3351,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; } @@ -701,7 +3375,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; } @@ -763,4 +3437,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/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..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,340 +18,1254 @@ 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}. * + * 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 + */ + @Nullable + String getNativeLibraryDir(); + + /** + * @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 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(); - int getTargetSdkVersion(); + /** + * 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. + */ + @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 isBackupInForeground(); - - boolean isBaseHardwareAccelerated(); - - boolean isCantSaveState(); - - boolean isCrossProfile(); - - boolean isDebuggable(); - - boolean isDefaultToDeviceProtectedStorage(); - - boolean isDirectBootAware(); - - boolean isEnabled(); - - boolean isExternalStorage(); - - boolean isExtractNativeLibs(); - - boolean isFullBackupOnly(); - - boolean isHasCode(); - - boolean isHasDomainUrls(); - - boolean isHasFragileUserData(); - - boolean isIsolatedSplitLoading(); - - boolean isKillAfterRestore(); - - boolean isLargeHeap(); - - boolean isMultiArch(); - - boolean isOverlay(); - - boolean isPartiallyDirectBootAware(); - - boolean isPersistent(); - - boolean isProfileable(); - - boolean isProfileableByShell(); - - boolean isRequestLegacyExternalStorage(); - - boolean isResizeable(); - - boolean isResizeableActivityViaSdkVersion(); - - boolean isRestoreAnyVersion(); - - boolean isStaticSharedLibrary(); - - boolean isSdkLibrary(); - - boolean isSupportsExtraLargeScreens(); - - boolean isSupportsLargeScreens(); - - boolean isSupportsNormalScreens(); - - boolean isSupportsRtl(); - - boolean isSupportsSmallScreens(); - - boolean isTestOnly(); - - boolean isUseEmbeddedDex(); - - boolean isUsesCleartextTraffic(); - - 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(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_BACKUP_IN_FOREGROUND + */ + boolean isBackupInForeground(); - boolean isOdm(); + /** + * @see ApplicationInfo#FLAG_HARDWARE_ACCELERATED + */ + boolean isBaseHardwareAccelerated(); - boolean isOem(); - - boolean isPrivileged(); - - boolean isProduct(); - - boolean isSignedWithPlatformKey(); - - boolean isSystem(); - - boolean isSystemExt(); - - boolean isVendor(); + /** + * @see ApplicationInfo#PRIVATE_FLAG_CANT_SAVE_STATE + */ + boolean isCantSaveState(); + /** + * @see PackageInfo#coreApp + */ 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 + */ + 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 + */ + boolean isNativeLibraryRootRequiresIsa(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_ODM + */ + boolean isOdm(); + + /** + * @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 + */ + boolean isPrivileged(); + + /** + * @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 + */ + boolean isSignedWithPlatformKey(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_STATIC_SHARED_LIBRARY + */ + boolean isStaticSharedLibrary(); + + /** + * @see PackageInfo#isStub + */ 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(); + + /** + * @see ApplicationInfo#FLAG_SYSTEM + */ + boolean isSystem(); + + /** + * @see ApplicationInfo#PRIVATE_FLAG_SYSTEM_EXT + */ + 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 + */ + 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(); } 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/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/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..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,15 @@ 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; import com.android.server.pm.pkg.component.ParsedAttribution; @@ -43,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; @@ -52,7 +56,7 @@ import java.util.Set; * @hide */ @SuppressWarnings("UnusedReturnValue") -public interface ParsingPackage extends ParsingPackageRead { +public interface ParsingPackage { ParsingPackage addActivity(ParsedActivity parsedActivity); @@ -83,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); @@ -391,8 +395,139 @@ 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(); + + // 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 66e01a6bfb09e..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,12 +23,12 @@ 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 */ -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 803780fe2a9b8..0000000000000 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageImpl.java +++ /dev/null @@ -1,3023 +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.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; -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 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 - @NonNull - private UUID mStorageUuid; - private long mLongVersionCode; - - 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; - } - - @SuppressLint("MissingSuperCall") - @CallSuper - @Override - public Object hideAsParsed() { - assignDerivedFields(); - return this; - } - - private 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 + "}"; - } - - @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(); - - // 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(); - } - - 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; - } - - @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/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 c129f37b6d162..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 @@ -91,6 +91,8 @@ 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.parsing.pkg.ParsedPackage; import com.android.server.pm.permission.CompatibilityPermissionInfo; import com.android.server.pm.pkg.component.ComponentMutateUtils; import com.android.server.pm.pkg.component.ComponentParseUtils; @@ -264,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) { @@ -278,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() { @@ -301,15 +303,17 @@ 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); - 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*/); @@ -319,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); } @@ -348,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 @@ -380,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) { @@ -457,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) { @@ -3067,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); @@ -3088,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); @@ -3312,7 +3335,6 @@ public class ParsingPackageUtils { return keySetMapping; } - /** * 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/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..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,15 +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", 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/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/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/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 7ce7ac9a84cf2..b32ace5e865b0 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -67,7 +67,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; @@ -88,7 +87,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; @@ -220,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(), @@ -636,27 +634,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..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 @@ -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; @@ -580,21 +580,22 @@ 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 = PackageInfoWithoutStateUtils.generate(pkg, apexInfo, flags); + PackageInfo pi = PackageInfoUtils.generate(pkg.setApex(true).hideAsFinal(), apexInfo, + flags, null, UserHandle.USER_SYSTEM); assertEquals("com.google.android.tzdata", pi.applicationInfo.packageName); assertTrue(pi.applicationInfo.enabled); 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 ->