| /* |
| * 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 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.AndroidPackage; |
| import com.android.server.pm.pkg.AndroidPackageSplit; |
| import com.android.server.pm.pkg.AndroidPackageSplitImpl; |
| 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.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.ArrayList; |
| import java.util.Arrays; |
| 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 PackageImpl} including fields/state contained in the system server |
| * and not exposed to the core SDK. |
| * |
| * @hide |
| */ |
| public class PackageImpl implements ParsedPackage, AndroidPackageInternal, |
| AndroidPackageHidden, ParsingPackage, ParsingPackageHidden, Parcelable { |
| |
| private static final SparseArray<int[]> EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>(); |
| private static final Comparator<ParsedMainComponent> 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<String> usesLibraries = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> usesOptionalLibraries = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> usesNativeLibraries = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> usesOptionalNativeLibraries = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> originalPackages = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> 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<String> requestedPermissions = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| protected List<String> protectedBroadcasts = emptyList(); |
| @NonNull |
| protected List<ParsedActivity> activities = emptyList(); |
| @NonNull |
| protected List<ParsedApexSystemService> apexSystemServices = emptyList(); |
| @NonNull |
| protected List<ParsedActivity> receivers = emptyList(); |
| @NonNull |
| protected List<ParsedService> services = emptyList(); |
| @NonNull |
| protected List<ParsedProvider> providers = emptyList(); |
| @NonNull |
| protected List<ParsedPermission> permissions = emptyList(); |
| @NonNull |
| protected List<ParsedPermissionGroup> permissionGroups = emptyList(); |
| @NonNull |
| protected List<ParsedInstrumentation> 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<String, String> overlayables = emptyMap(); |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| private String sdkLibraryName; |
| private int sdkLibVersionMajor; |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| private String staticSharedLibraryName; |
| private long staticSharedLibVersion; |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<String> libraryNames = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<String> usesStaticLibraries = emptyList(); |
| @Nullable |
| private long[] usesStaticLibrariesVersions; |
| @Nullable |
| private String[][] usesStaticLibrariesCertDigests; |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<String> usesSdkLibraries = emptyList(); |
| @Nullable |
| private long[] usesSdkLibrariesVersionsMajor; |
| @Nullable |
| private String[][] usesSdkLibrariesCertDigests; |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| private String sharedUserId; |
| private int sharedUserLabel; |
| @NonNull |
| private List<ConfigurationInfo> configPreferences = emptyList(); |
| @NonNull |
| private List<FeatureInfo> reqFeatures = emptyList(); |
| @NonNull |
| private List<FeatureGroupInfo> featureGroups = emptyList(); |
| @Nullable |
| private byte[] restrictUpdateHash; |
| @NonNull |
| private List<ParsedUsesPermission> usesPermissions = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<String> implicitPermissions = emptyList(); |
| @NonNull |
| private Set<String> upgradeKeySets = emptySet(); |
| @NonNull |
| private Map<String, ArraySet<PublicKey>> keySetMapping = emptyMap(); |
| @NonNull |
| private List<ParsedAttribution> attributions = emptyList(); |
| @NonNull |
| // @DataClass.ParcelWith(ParsingUtils.StringPairListParceler.class) |
| private List<Pair<String, ParsedIntentInfo>> preferredActivityFilters = emptyList(); |
| /** |
| * Map from a process name to a {@link ParsedProcess}. |
| */ |
| @NonNull |
| private Map<String, ParsedProcess> processes = emptyMap(); |
| @Nullable |
| private Bundle metaData; |
| @NonNull |
| private Map<String, PackageManager.Property> mProperties = emptyMap(); |
| @NonNull |
| private SigningDetails signingDetails = SigningDetails.UNKNOWN; |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<Intent> queriesIntents = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class) |
| private List<String> queriesPackages = emptyList(); |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class) |
| private Set<String> queriesProviders = emptySet(); |
| @Nullable |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringArray.class) |
| private String[] splitClassLoaderNames; |
| @Nullable |
| private SparseArray<int[]> 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; |
| @NonNull |
| @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class) |
| private Set<String> mimeGroups = emptySet(); |
| // Usually there's code to set enabled to true during parsing, but it's possible to install |
| // an APK targeting <R that doesn't contain an <application> 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; |
| @NonNull |
| private Set<String> mKnownActivityEmbeddingCerts = emptySet(); |
| // Derived fields |
| private long mLongVersionCode; |
| private int mLocaleConfigRes; |
| |
| private List<AndroidPackageSplit> mSplits; |
| |
| @NonNull |
| private String[] mUsesLibrariesSorted; |
| @NonNull |
| private String[] mUsesOptionalLibrariesSorted; |
| @NonNull |
| private String[] mUsesSdkLibrariesSorted; |
| @NonNull |
| private String[] mUsesStaticLibrariesSorted; |
| |
| @NonNull |
| public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath, |
| @NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp) { |
| return new PackageImpl(packageName, baseCodePath, codePath, manifestArray, isCoreApp); |
| } |
| |
| /** |
| * Mock an unavailable {@link AndroidPackage} to use when |
| * removing |
| * a package from the system. |
| * This can occur if the package was installed on a storage device that has since been removed. |
| * Since the infrastructure uses {@link AndroidPackage}, but |
| * for |
| * this case only cares about |
| * volumeUuid, just fake it rather than having separate method paths. |
| */ |
| @NonNull |
| public static AndroidPackage buildFakeForDeletion(String packageName, String volumeUuid) { |
| return PackageImpl.forTesting(packageName) |
| .setVolumeUuid(volumeUuid) |
| .hideAsParsed() |
| .hideAsFinal(); |
| } |
| |
| @NonNull |
| @VisibleForTesting |
| public static ParsingPackage forTesting(String packageName) { |
| return forTesting(packageName, ""); |
| } |
| |
| @NonNull |
| @VisibleForTesting |
| public static ParsingPackage forTesting(String packageName, String baseCodePath) { |
| return new PackageImpl(packageName, baseCodePath, baseCodePath, null, false); |
| } |
| |
| @NonNull |
| @DataClass.ParcelWith(ForInternedString.class) |
| private final String manifestPackageName; |
| |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| protected String nativeLibraryDir; |
| |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| protected String nativeLibraryRootDir; |
| |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| protected String primaryCpuAbi; |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| protected String secondaryCpuAbi; |
| @Nullable |
| @DataClass.ParcelWith(ForInternedString.class) |
| protected String secondaryNativeLibraryDir; |
| |
| /** |
| * This is an appId, the uid if the userId is == USER_SYSTEM |
| */ |
| private int uid = -1; |
| |
| // This is kept around as a boolean to avoid flag calculation |
| // during ApplicationInfo generation. |
| private boolean nativeLibraryRootRequiresIsa; |
| |
| @Override |
| public PackageImpl addActivity(ParsedActivity parsedActivity) { |
| this.activities = CollectionUtils.add(this.activities, parsedActivity); |
| addMimeGroupsFromComponent(parsedActivity); |
| return this; |
| } |
| |
| @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<PublicKey> 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--) { |
| if (mimeGroups != null && mimeGroups.size() > 500) { |
| throw new IllegalStateException("Max limit on number of MIME Groups reached"); |
| } |
| mimeGroups = CollectionUtils.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 isAttributionsUserVisible() { |
| return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE); |
| } |
| |
| @Override |
| public PackageImpl asSplit(String[] splitNames, String[] splitCodePaths, |
| int[] splitRevisionCodes, SparseArray<int[]> 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 <processes><process android:name="xxx">. |
| * |
| * 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<String, String> buildAppClassNamesByProcess() { |
| if (ArrayUtils.size(processes) == 0) { |
| return null; |
| } |
| final ArrayMap<String, String> ret = new ArrayMap<>(4); |
| for (String processName : processes.keySet()) { |
| final ParsedProcess process = processes.get(processName); |
| final ArrayMap<String, String> 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 List<AndroidPackageSplit> getSplits() { |
| if (mSplits == null) { |
| var splits = new ArrayList<AndroidPackageSplit>(); |
| splits.add(new AndroidPackageSplitImpl( |
| null, |
| getBaseApkPath(), |
| getBaseRevisionCode(), |
| isDeclaredHavingCode() ? ApplicationInfo.FLAG_HAS_CODE : 0, |
| getClassLoaderName() |
| )); |
| |
| if (splitNames != null) { |
| for (int index = 0; index < splitNames.length; index++) { |
| splits.add(new AndroidPackageSplitImpl( |
| splitNames[index], |
| splitCodePaths[index], |
| splitRevisionCodes[index], |
| splitFlags[index], |
| splitClassLoaderNames[index] |
| )); |
| } |
| } |
| |
| if (splitDependencies != null) { |
| for (int index = 0; index < splitDependencies.size(); index++) { |
| var splitIndex = splitDependencies.keyAt(index); |
| var dependenciesByIndex = splitDependencies.valueAt(index); |
| var dependencies = new ArrayList<AndroidPackageSplit>(); |
| for (int dependencyIndex : dependenciesByIndex) { |
| // Legacy holdover, base dependencies are an array of -1 rather than empty |
| if (dependencyIndex >= 0) { |
| dependencies.add(splits.get(dependencyIndex)); |
| } |
| } |
| ((AndroidPackageSplitImpl) splits.get(splitIndex)) |
| .fillDependencies(Collections.unmodifiableList(dependencies)); |
| } |
| } |
| |
| mSplits = Collections.unmodifiableList(splits); |
| } |
| return mSplits; |
| } |
| |
| @Override |
| public String toString() { |
| return "Package{" |
| + Integer.toHexString(System.identityHashCode(this)) |
| + " " + packageName + "}"; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedActivity> getActivities() { |
| return activities; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getAdoptPermissions() { |
| return adoptPermissions; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedApexSystemService> getApexSystemServices() { |
| return apexSystemServices; |
| } |
| |
| @Nullable |
| @Override |
| public String getAppComponentFactory() { |
| return appComponentFactory; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedAttribution> getAttributions() { |
| return attributions; |
| } |
| |
| @Override |
| public int getAutoRevokePermissions() { |
| return autoRevokePermissions; |
| } |
| |
| @Nullable |
| @Override |
| public String getBackupAgentName() { |
| return backupAgentName; |
| } |
| |
| @Override |
| public int getBannerResourceId() { |
| 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 getApplicationClassName() { |
| 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<ConfigurationInfo> getConfigPreferences() { |
| return configPreferences; |
| } |
| |
| @Override |
| public int getDataExtractionRulesResourceId() { |
| return dataExtractionRules; |
| } |
| |
| @Override |
| public int getDescriptionResourceId() { |
| return descriptionRes; |
| } |
| |
| @NonNull |
| @Override |
| public List<FeatureGroupInfo> getFeatureGroups() { |
| return featureGroups; |
| } |
| |
| @Override |
| public int getFullBackupContentResourceId() { |
| return fullBackupContent; |
| } |
| |
| @ApplicationInfo.GwpAsanMode |
| @Override |
| public int getGwpAsanMode() { |
| return gwpAsanMode; |
| } |
| |
| @Override |
| public int getIconResourceId() { |
| return iconRes; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getImplicitPermissions() { |
| return implicitPermissions; |
| } |
| |
| @Override |
| public int getInstallLocation() { |
| return installLocation; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedInstrumentation> getInstrumentations() { |
| return instrumentations; |
| } |
| |
| @NonNull |
| @Override |
| public Map<String,ArraySet<PublicKey>> getKeySetMapping() { |
| return keySetMapping; |
| } |
| |
| @NonNull |
| @Override |
| public Set<String> getKnownActivityEmbeddingCerts() { |
| return mKnownActivityEmbeddingCerts; |
| } |
| |
| @Override |
| public int getLabelResourceId() { |
| return labelRes; |
| } |
| |
| @Override |
| public int getLargestWidthLimitDp() { |
| return largestWidthLimitDp; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getLibraryNames() { |
| return libraryNames; |
| } |
| |
| @Override |
| public int getLocaleConfigResourceId() { |
| return mLocaleConfigRes; |
| } |
| |
| @Override |
| public int getLogoResourceId() { |
| 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<String> 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 getNetworkSecurityConfigResourceId() { |
| return networkSecurityConfigRes; |
| } |
| |
| @Nullable |
| @Override |
| public CharSequence getNonLocalizedLabel() { |
| return nonLocalizedLabel; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> 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<String,String> 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<ParsedPermissionGroup> getPermissionGroups() { |
| return permissionGroups; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedPermission> getPermissions() { |
| return permissions; |
| } |
| |
| @NonNull |
| @Override |
| public List<Pair<String,ParsedIntentInfo>> getPreferredActivityFilters() { |
| return preferredActivityFilters; |
| } |
| |
| @NonNull |
| @Override |
| public String getProcessName() { |
| return processName != null ? processName : packageName; |
| } |
| |
| @NonNull |
| @Override |
| public Map<String,ParsedProcess> getProcesses() { |
| return processes; |
| } |
| |
| @NonNull |
| @Override |
| public Map<String, PackageManager.Property> getProperties() { |
| return mProperties; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getProtectedBroadcasts() { |
| return protectedBroadcasts; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedProvider> getProviders() { |
| return providers; |
| } |
| |
| @NonNull |
| @Override |
| public List<Intent> getQueriesIntents() { |
| return queriesIntents; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getQueriesPackages() { |
| return queriesPackages; |
| } |
| |
| @NonNull |
| @Override |
| public Set<String> getQueriesProviders() { |
| return queriesProviders; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedActivity> getReceivers() { |
| return receivers; |
| } |
| |
| @NonNull |
| @Override |
| public List<FeatureInfo> getRequestedFeatures() { |
| return reqFeatures; |
| } |
| |
| /** |
| * @deprecated consider migrating to {@link #getUsesPermissions} which has |
| * more parsed details, such as flags |
| */ |
| @NonNull |
| @Override |
| @Deprecated |
| public List<String> 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 getRoundIconResourceId() { |
| return roundIconRes; |
| } |
| |
| @Nullable |
| @Override |
| public String getSdkLibraryName() { |
| return sdkLibraryName; |
| } |
| |
| @Override |
| public int getSdkLibVersionMajor() { |
| return sdkLibVersionMajor; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedService> getServices() { |
| return services; |
| } |
| |
| @Nullable |
| @Override |
| public String getSharedUserId() { |
| return sharedUserId; |
| } |
| |
| @Override |
| public int getSharedUserLabelResourceId() { |
| 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<int[]> 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 getStaticSharedLibraryName() { |
| return staticSharedLibraryName; |
| } |
| |
| @Override |
| public long getStaticSharedLibraryVersion() { |
| return staticSharedLibVersion; |
| } |
| |
| @Override |
| public UUID getStorageUuid() { |
| return mStorageUuid; |
| } |
| |
| @Override |
| public int getTargetSandboxVersion() { |
| return targetSandboxVersion; |
| } |
| |
| @Override |
| public int getTargetSdkVersion() { |
| return targetSdkVersion; |
| } |
| |
| @Nullable |
| @Override |
| public String getTaskAffinity() { |
| return taskAffinity; |
| } |
| |
| @Override |
| public int getThemeResourceId() { |
| return theme; |
| } |
| |
| @Override |
| public int getUiOptions() { |
| return uiOptions; |
| } |
| |
| @NonNull |
| @Override |
| public Set<String> getUpgradeKeySets() { |
| return upgradeKeySets; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesLibraries() { |
| return usesLibraries; |
| } |
| |
| @NonNull |
| @Override |
| public String[] getUsesLibrariesSorted() { |
| if (mUsesLibrariesSorted == null) { |
| // Note lazy-sorting here doesn't break immutability because it always |
| // return the same content. In the case of multi-threading, data race in accessing |
| // mUsesLibrariesSorted might result in unnecessary creation of sorted copies |
| // which is OK because the case is quite rare. |
| mUsesLibrariesSorted = sortLibraries(usesLibraries); |
| } |
| return mUsesLibrariesSorted; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesNativeLibraries() { |
| return usesNativeLibraries; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesOptionalLibraries() { |
| return usesOptionalLibraries; |
| } |
| |
| @NonNull |
| @Override |
| public String[] getUsesOptionalLibrariesSorted() { |
| if (mUsesOptionalLibrariesSorted == null) { |
| mUsesOptionalLibrariesSorted = sortLibraries(usesOptionalLibraries); |
| } |
| return mUsesOptionalLibrariesSorted; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesOptionalNativeLibraries() { |
| return usesOptionalNativeLibraries; |
| } |
| |
| @NonNull |
| @Override |
| public List<ParsedUsesPermission> getUsesPermissions() { |
| return usesPermissions; |
| } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesSdkLibraries() { return usesSdkLibraries; } |
| |
| @NonNull |
| @Override |
| public String[] getUsesSdkLibrariesSorted() { |
| if (mUsesSdkLibrariesSorted == null) { |
| mUsesSdkLibrariesSorted = sortLibraries(usesSdkLibraries); |
| } |
| return mUsesSdkLibrariesSorted; |
| } |
| |
| @Nullable |
| @Override |
| public String[][] getUsesSdkLibrariesCertDigests() { return usesSdkLibrariesCertDigests; } |
| |
| @Nullable |
| @Override |
| public long[] getUsesSdkLibrariesVersionsMajor() { return usesSdkLibrariesVersionsMajor; } |
| |
| @NonNull |
| @Override |
| public List<String> getUsesStaticLibraries() { |
| return usesStaticLibraries; |
| } |
| |
| @NonNull |
| @Override |
| public String[] getUsesStaticLibrariesSorted() { |
| if (mUsesStaticLibrariesSorted == null) { |
| mUsesStaticLibrariesSorted = sortLibraries(usesStaticLibraries); |
| } |
| return mUsesStaticLibrariesSorted; |
| } |
| |
| @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 isBackupAllowed() { |
| return getBoolean(Booleans.ALLOW_BACKUP); |
| } |
| |
| @Override |
| public boolean isClearUserDataAllowed() { |
| return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA); |
| } |
| |
| @Override |
| public boolean isClearUserDataOnFailedRestoreAllowed() { |
| 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 isTaskReparentingAllowed() { |
| 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 isHardwareAccelerated() { |
| return getBoolean(Booleans.HARDWARE_ACCELERATED); |
| } |
| |
| @Override |
| public boolean isSaveStateDisallowed() { |
| 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 isExtractNativeLibrariesRequested() { |
| 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 isDeclaredHavingCode() { |
| return getBoolean(Booleans.HAS_CODE); |
| } |
| |
| @Override |
| public boolean isHasDomainUrls() { |
| return getBoolean(Booleans.HAS_DOMAIN_URLS); |
| } |
| |
| @Override |
| public boolean isUserDataFragile() { |
| return getBoolean(Booleans.HAS_FRAGILE_USER_DATA); |
| } |
| |
| @Override |
| public boolean isIsolatedSplitLoading() { |
| return getBoolean(Booleans.ISOLATED_SPLIT_LOADING); |
| } |
| |
| @Override |
| public boolean isKillAfterRestoreAllowed() { |
| return getBoolean(Booleans.KILL_AFTER_RESTORE); |
| } |
| |
| @Override |
| public boolean isLargeHeap() { |
| return getBoolean(Booleans.LARGE_HEAP); |
| } |
| |
| @Override |
| public boolean isLeavingSharedUser() { |
| 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 isResourceOverlay() { |
| 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 isExtraLargeScreensSupported() { |
| if (supportsExtraLargeScreens == null) { |
| return targetSdkVersion >= Build.VERSION_CODES.GINGERBREAD; |
| } |
| |
| return supportsExtraLargeScreens; |
| } |
| |
| public boolean isLargeScreensSupported() { |
| if (supportsLargeScreens == null) { |
| return targetSdkVersion >= Build.VERSION_CODES.DONUT; |
| } |
| |
| return supportsLargeScreens; |
| } |
| |
| public boolean isNormalScreensSupported() { |
| return supportsNormalScreens == null || supportsNormalScreens; |
| } |
| |
| @Override |
| public boolean isRtlSupported() { |
| return getBoolean(Booleans.SUPPORTS_RTL); |
| } |
| |
| public boolean isSmallScreensSupported() { |
| if (supportsSmallScreens == null) { |
| return targetSdkVersion >= Build.VERSION_CODES.DONUT; |
| } |
| |
| return supportsSmallScreens; |
| } |
| |
| @Override |
| public boolean isTestOnly() { |
| return getBoolean(Booleans.TEST_ONLY); |
| } |
| |
| @Override |
| public boolean is32BitAbiPreferred() { |
| return getBoolean(Booleans.USE_32_BIT_ABI); |
| } |
| |
| @Override |
| public boolean isUseEmbeddedDex() { |
| return getBoolean(Booleans.USE_EMBEDDED_DEX); |
| } |
| |
| @Override |
| public boolean isCleartextTrafficAllowed() { |
| return getBoolean(Booleans.USES_CLEARTEXT_TRAFFIC); |
| } |
| |
| @Override |
| public boolean isNonSdkApiRequested() { |
| 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 setBackupAllowed(boolean value) { |
| return setBoolean(Booleans.ALLOW_BACKUP, value); |
| } |
| |
| @Override |
| public PackageImpl setClearUserDataAllowed(boolean value) { |
| return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA, value); |
| } |
| |
| @Override |
| public PackageImpl setClearUserDataOnFailedRestoreAllowed(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 setTaskReparentingAllowed(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 setBannerResourceId(int value) { |
| banner = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setHardwareAccelerated(boolean value) { |
| return setBoolean(Booleans.HARDWARE_ACCELERATED, value); |
| } |
| |
| @Override |
| public PackageImpl setBaseRevisionCode(int value) { |
| baseRevisionCode = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSaveStateDisallowed(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 setApplicationClassName(@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 setDataExtractionRulesResourceId(int value) { |
| dataExtractionRules = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setDebuggable(boolean value) { |
| return setBoolean(Booleans.DEBUGGABLE, value); |
| } |
| |
| @Override |
| public PackageImpl setDescriptionResourceId(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 setExtractNativeLibrariesRequested(boolean value) { |
| return setBoolean(Booleans.EXTRACT_NATIVE_LIBS, value); |
| } |
| |
| @Override |
| public PackageImpl setForceQueryable(boolean value) { |
| return setBoolean(Booleans.FORCE_QUERYABLE, value); |
| } |
| |
| @Override |
| public PackageImpl setFullBackupContentResourceId(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 setDeclaredHavingCode(boolean value) { |
| return setBoolean(Booleans.HAS_CODE, value); |
| } |
| |
| @Override |
| public PackageImpl setHasDomainUrls(boolean value) { |
| return setBoolean(Booleans.HAS_DOMAIN_URLS, value); |
| } |
| |
| @Override |
| public PackageImpl setUserDataFragile(boolean value) { |
| return setBoolean(Booleans.HAS_FRAGILE_USER_DATA, value); |
| } |
| |
| @Override |
| public PackageImpl setIconResourceId(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 setKillAfterRestoreAllowed(boolean value) { |
| return setBoolean(Booleans.KILL_AFTER_RESTORE, value); |
| } |
| |
| @Override |
| public ParsingPackage setKnownActivityEmbeddingCerts(@NonNull Set<String> knownEmbeddingCerts) { |
| mKnownActivityEmbeddingCerts = knownEmbeddingCerts; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setLabelResourceId(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 setLeavingSharedUser(boolean value) { |
| return setBoolean(Booleans.LEAVING_SHARED_UID, value); |
| } |
| |
| @Override |
| public PackageImpl setLocaleConfigResourceId(int value) { |
| mLocaleConfigRes = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setLogoResourceId(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 setNetworkSecurityConfigResourceId(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 setResourceOverlay(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<String,ParsedProcess> 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 setRoundIconResourceId(int value) { |
| roundIconRes = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSdkLibraryName(String sdkLibraryName) { |
| this.sdkLibraryName = TextUtils.safeIntern(sdkLibraryName); |
| 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 setSharedUserLabelResourceId(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 setStaticSharedLibraryName(String staticSharedLibraryName) { |
| this.staticSharedLibraryName = TextUtils.safeIntern(staticSharedLibraryName); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setStaticSharedLibraryVersion(long value) { |
| staticSharedLibVersion = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setStaticSharedLibrary(boolean value) { |
| return setBoolean(Booleans.STATIC_SHARED_LIBRARY, value); |
| } |
| |
| @Override |
| public PackageImpl setExtraLargeScreensSupported(int supportsExtraLargeScreens) { |
| if (supportsExtraLargeScreens == 1) { |
| return this; |
| } |
| |
| this.supportsExtraLargeScreens = supportsExtraLargeScreens < 0; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setLargeScreensSupported(int supportsLargeScreens) { |
| if (supportsLargeScreens == 1) { |
| return this; |
| } |
| |
| this.supportsLargeScreens = supportsLargeScreens < 0; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setNormalScreensSupported(int supportsNormalScreens) { |
| if (supportsNormalScreens == 1) { |
| return this; |
| } |
| |
| this.supportsNormalScreens = supportsNormalScreens < 0; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setRtlSupported(boolean value) { |
| return setBoolean(Booleans.SUPPORTS_RTL, value); |
| } |
| |
| @Override |
| public PackageImpl setSmallScreensSupported(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 setThemeResourceId(int value) { |
| theme = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setUiOptions(int value) { |
| uiOptions = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setUpgradeKeySets(@NonNull Set<String> value) { |
| upgradeKeySets = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl set32BitAbiPreferred(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 setCleartextTrafficAllowed(boolean value) { |
| return setBoolean(Booleans.USES_CLEARTEXT_TRAFFIC, value); |
| } |
| |
| @Override |
| public PackageImpl setNonSdkApiRequested(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.isEmpty()) { |
| appInfo.setKnownActivityEmbeddingCerts(mKnownActivityEmbeddingCerts); |
| } |
| |
| return appInfo; |
| } |
| |
| private PackageImpl setBoolean(@Booleans.Flags long flag, boolean value) { |
| if (value) { |
| mBooleans |= flag; |
| } else { |
| mBooleans &= ~flag; |
| } |
| return this; |
| } |
| |
| 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; |
| private int mBaseAppInfoPrivateFlagsExt; |
| private String mBaseAppDataCredentialProtectedDirForSystemUser; |
| private String mBaseAppDataDeviceProtectedDirForSystemUser; |
| |
| @VisibleForTesting |
| public PackageImpl(@NonNull String packageName, @NonNull String baseApkPath, |
| @NonNull String path, @Nullable TypedArray manifestArray, boolean isCoreApp) { |
| 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 PackageImpl hideAsParsed() { |
| assignDerivedFields(); |
| return this; |
| } |
| |
| @Override |
| public AndroidPackageInternal hideAsFinal() { |
| if (mStorageUuid == null) { |
| assignDerivedFields(); |
| } |
| assignDerivedFields2(); |
| makeImmutable(); |
| return this; |
| } |
| |
| private static String[] sortLibraries(List<String> libraryNames) { |
| int size = libraryNames.size(); |
| if (size == 0) { |
| return EmptyArray.STRING; |
| } |
| var arr = libraryNames.toArray(EmptyArray.STRING); |
| Arrays.sort(arr); |
| return arr; |
| } |
| |
| private void assignDerivedFields2() { |
| mBaseAppInfoFlags = PackageInfoUtils.appInfoFlags(this, null); |
| mBaseAppInfoPrivateFlags = PackageInfoUtils.appInfoPrivateFlags(this, null); |
| mBaseAppInfoPrivateFlagsExt = PackageInfoUtils.appInfoPrivateFlagsExt(this, null); |
| String baseAppDataDir = Environment.getDataDirectoryPath(getVolumeUuid()) + File.separator; |
| String systemUserSuffix = File.separator + UserHandle.USER_SYSTEM + File.separator; |
| mBaseAppDataCredentialProtectedDirForSystemUser = TextUtils.safeIntern( |
| baseAppDataDir + Environment.DIR_USER_CE + systemUserSuffix); |
| mBaseAppDataDeviceProtectedDirForSystemUser = TextUtils.safeIntern( |
| baseAppDataDir + Environment.DIR_USER_DE + systemUserSuffix); |
| } |
| |
| private void makeImmutable() { |
| usesLibraries = Collections.unmodifiableList(usesLibraries); |
| usesOptionalLibraries = Collections.unmodifiableList(usesOptionalLibraries); |
| usesNativeLibraries = Collections.unmodifiableList(usesNativeLibraries); |
| usesOptionalNativeLibraries = Collections.unmodifiableList(usesOptionalNativeLibraries); |
| originalPackages = Collections.unmodifiableList(originalPackages); |
| adoptPermissions = Collections.unmodifiableList(adoptPermissions); |
| requestedPermissions = Collections.unmodifiableList(requestedPermissions); |
| protectedBroadcasts = Collections.unmodifiableList(protectedBroadcasts); |
| apexSystemServices = Collections.unmodifiableList(apexSystemServices); |
| |
| activities = Collections.unmodifiableList(activities); |
| receivers = Collections.unmodifiableList(receivers); |
| services = Collections.unmodifiableList(services); |
| providers = Collections.unmodifiableList(providers); |
| permissions = Collections.unmodifiableList(permissions); |
| permissionGroups = Collections.unmodifiableList(permissionGroups); |
| instrumentations = Collections.unmodifiableList(instrumentations); |
| |
| overlayables = Collections.unmodifiableMap(overlayables); |
| libraryNames = Collections.unmodifiableList(libraryNames); |
| usesStaticLibraries = Collections.unmodifiableList(usesStaticLibraries); |
| usesSdkLibraries = Collections.unmodifiableList(usesSdkLibraries); |
| configPreferences = Collections.unmodifiableList(configPreferences); |
| reqFeatures = Collections.unmodifiableList(reqFeatures); |
| featureGroups = Collections.unmodifiableList(featureGroups); |
| usesPermissions = Collections.unmodifiableList(usesPermissions); |
| usesSdkLibraries = Collections.unmodifiableList(usesSdkLibraries); |
| implicitPermissions = Collections.unmodifiableList(implicitPermissions); |
| upgradeKeySets = Collections.unmodifiableSet(upgradeKeySets); |
| keySetMapping = Collections.unmodifiableMap(keySetMapping); |
| attributions = Collections.unmodifiableList(attributions); |
| preferredActivityFilters = Collections.unmodifiableList(preferredActivityFilters); |
| processes = Collections.unmodifiableMap(processes); |
| mProperties = Collections.unmodifiableMap(mProperties); |
| queriesIntents = Collections.unmodifiableList(queriesIntents); |
| queriesPackages = Collections.unmodifiableList(queriesPackages); |
| queriesProviders = Collections.unmodifiableSet(queriesProviders); |
| mimeGroups = Collections.unmodifiableSet(mimeGroups); |
| mKnownActivityEmbeddingCerts = Collections.unmodifiableSet(mKnownActivityEmbeddingCerts); |
| } |
| |
| @Override |
| public long getLongVersionCode() { |
| return PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode); |
| } |
| |
| @Override |
| public PackageImpl removePermission(int index) { |
| this.permissions.remove(index); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl addUsesOptionalLibrary(int index, String libraryName) { |
| this.usesOptionalLibraries = CollectionUtils.add(usesOptionalLibraries, index, |
| TextUtils.safeIntern(libraryName)); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl addUsesLibrary(int index, String libraryName) { |
| this.usesLibraries = CollectionUtils.add(usesLibraries, index, |
| TextUtils.safeIntern(libraryName)); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl removeUsesLibrary(String libraryName) { |
| this.usesLibraries = CollectionUtils.remove(this.usesLibraries, libraryName); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl removeUsesOptionalLibrary(String libraryName) { |
| this.usesOptionalLibraries = CollectionUtils.remove(this.usesOptionalLibraries, |
| libraryName); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSigningDetails(@NonNull SigningDetails value) { |
| signingDetails = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setRestrictUpdateHash(@Nullable byte... value) { |
| restrictUpdateHash = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setPersistent(boolean value) { |
| setBoolean(Booleans.PERSISTENT, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setDefaultToDeviceProtectedStorage(boolean value) { |
| setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setDirectBootAware(boolean value) { |
| setBoolean(Booleans.DIRECT_BOOT_AWARE, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl clearProtectedBroadcasts() { |
| protectedBroadcasts.clear(); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl clearOriginalPackages() { |
| originalPackages.clear(); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl clearAdoptPermissions() { |
| adoptPermissions.clear(); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setPath(@NonNull String path) { |
| this.mPath = path; |
| return this; |
| } |
| |
| // TODO(b/135203078): Move PackageManagerService#renameStaticSharedLibraryPackage |
| // into initial package parsing |
| @Override |
| public PackageImpl setPackageName(@NonNull String packageName) { |
| this.packageName = TextUtils.safeIntern(packageName); |
| |
| int permissionsSize = permissions.size(); |
| for (int index = 0; index < permissionsSize; index++) { |
| ComponentMutateUtils.setPackageName(permissions.get(index), this.packageName); |
| } |
| |
| int permissionGroupsSize = permissionGroups.size(); |
| for (int index = 0; index < permissionGroupsSize; index++) { |
| ComponentMutateUtils.setPackageName(permissionGroups.get(index), this.packageName); |
| } |
| |
| int activitiesSize = activities.size(); |
| for (int index = 0; index < activitiesSize; index++) { |
| ComponentMutateUtils.setPackageName(activities.get(index), this.packageName); |
| } |
| |
| int receiversSize = receivers.size(); |
| for (int index = 0; index < receiversSize; index++) { |
| ComponentMutateUtils.setPackageName(receivers.get(index), this.packageName); |
| } |
| |
| int providersSize = providers.size(); |
| for (int index = 0; index < providersSize; index++) { |
| ComponentMutateUtils.setPackageName(providers.get(index), this.packageName); |
| } |
| |
| int servicesSize = services.size(); |
| for (int index = 0; index < servicesSize; index++) { |
| ComponentMutateUtils.setPackageName(services.get(index), this.packageName); |
| } |
| |
| int instrumentationsSize = instrumentations.size(); |
| for (int index = 0; index < instrumentationsSize; index++) { |
| ComponentMutateUtils.setPackageName(instrumentations.get(index), this.packageName); |
| } |
| |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setAllComponentsDirectBootAware(boolean allComponentsDirectBootAware) { |
| int activitiesSize = activities.size(); |
| for (int index = 0; index < activitiesSize; index++) { |
| ComponentMutateUtils.setDirectBootAware(activities.get(index), |
| allComponentsDirectBootAware); |
| } |
| |
| int receiversSize = receivers.size(); |
| for (int index = 0; index < receiversSize; index++) { |
| ComponentMutateUtils.setDirectBootAware(receivers.get(index), |
| allComponentsDirectBootAware); |
| } |
| |
| int providersSize = providers.size(); |
| for (int index = 0; index < providersSize; index++) { |
| ComponentMutateUtils.setDirectBootAware(providers.get(index), |
| allComponentsDirectBootAware); |
| } |
| |
| int servicesSize = services.size(); |
| for (int index = 0; index < servicesSize; index++) { |
| ComponentMutateUtils.setDirectBootAware(services.get(index), |
| allComponentsDirectBootAware); |
| } |
| |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setBaseApkPath(@NonNull String baseApkPath) { |
| this.mBaseApkPath = TextUtils.safeIntern(baseApkPath); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setNativeLibraryDir(@Nullable String nativeLibraryDir) { |
| this.nativeLibraryDir = TextUtils.safeIntern(nativeLibraryDir); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setNativeLibraryRootDir(@Nullable String nativeLibraryRootDir) { |
| this.nativeLibraryRootDir = TextUtils.safeIntern(nativeLibraryRootDir); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setPrimaryCpuAbi(@Nullable String primaryCpuAbi) { |
| this.primaryCpuAbi = TextUtils.safeIntern(primaryCpuAbi); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSecondaryCpuAbi(@Nullable String secondaryCpuAbi) { |
| this.secondaryCpuAbi = TextUtils.safeIntern(secondaryCpuAbi); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSecondaryNativeLibraryDir(@Nullable String secondaryNativeLibraryDir) { |
| this.secondaryNativeLibraryDir = TextUtils.safeIntern(secondaryNativeLibraryDir); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSplitCodePaths(@Nullable String[] splitCodePaths) { |
| this.splitCodePaths = splitCodePaths; |
| if (splitCodePaths != null) { |
| int size = splitCodePaths.length; |
| for (int index = 0; index < size; index++) { |
| this.splitCodePaths[index] = TextUtils.safeIntern(this.splitCodePaths[index]); |
| } |
| } |
| return this; |
| } |
| |
| @Override |
| public PackageImpl capPermissionPriorities() { |
| int size = permissionGroups.size(); |
| for (int index = size - 1; index >= 0; --index) { |
| // TODO(b/135203078): Builder/immutability |
| ComponentMutateUtils.setPriority(permissionGroups.get(index), 0); |
| } |
| return this; |
| } |
| |
| @Override |
| public PackageImpl markNotActivitiesAsNotExportedIfSingleUser() { |
| // ignore export request for single user receivers |
| int receiversSize = receivers.size(); |
| for (int index = 0; index < receiversSize; index++) { |
| ParsedActivity receiver = receivers.get(index); |
| if ((receiver.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) { |
| ComponentMutateUtils.setExported(receiver, false); |
| } |
| } |
| |
| // ignore export request for single user services |
| int servicesSize = services.size(); |
| for (int index = 0; index < servicesSize; index++) { |
| ParsedService service = services.get(index); |
| if ((service.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) { |
| ComponentMutateUtils.setExported(service, false); |
| } |
| } |
| |
| // ignore export request for single user providers |
| int providersSize = providers.size(); |
| for (int index = 0; index < providersSize; index++) { |
| ParsedProvider provider = providers.get(index); |
| if ((provider.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) { |
| ComponentMutateUtils.setExported(provider, false); |
| } |
| } |
| |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setCoreApp(boolean coreApp) { |
| return setBoolean(Booleans.CORE_APP, coreApp); |
| } |
| |
| @Override |
| public PackageImpl setVersionCode(int versionCode) { |
| this.versionCode = versionCode; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setVersionCodeMajor(int versionCodeMajor) { |
| this.versionCodeMajor = versionCodeMajor; |
| return this; |
| } |
| |
| @Override |
| public ApplicationInfo toAppInfoWithoutState() { |
| ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags(); |
| appInfo.flags = mBaseAppInfoFlags; |
| appInfo.privateFlags = mBaseAppInfoPrivateFlags; |
| appInfo.privateFlagsExt = mBaseAppInfoPrivateFlagsExt; |
| appInfo.nativeLibraryDir = nativeLibraryDir; |
| appInfo.nativeLibraryRootDir = nativeLibraryRootDir; |
| appInfo.nativeLibraryRootRequiresIsa = nativeLibraryRootRequiresIsa; |
| appInfo.primaryCpuAbi = primaryCpuAbi; |
| appInfo.secondaryCpuAbi = secondaryCpuAbi; |
| appInfo.secondaryNativeLibraryDir = secondaryNativeLibraryDir; |
| appInfo.seInfoUser = SELinuxUtil.COMPLETE_STR; |
| appInfo.uid = uid; |
| return appInfo; |
| } |
| |
| @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.sdkLibraryName, dest, flags); |
| dest.writeInt(this.sdkLibVersionMajor); |
| sForInternedString.parcel(this.staticSharedLibraryName, 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); |
| sForInternedStringSet.parcel(this.mimeGroups, dest, flags); |
| 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); |
| dest.writeBoolean(this.nativeLibraryRootRequiresIsa); |
| sForInternedString.parcel(this.primaryCpuAbi, dest, flags); |
| sForInternedString.parcel(this.secondaryCpuAbi, dest, flags); |
| dest.writeString(this.secondaryNativeLibraryDir); |
| dest.writeInt(this.uid); |
| dest.writeLong(this.mBooleans); |
| dest.writeLong(this.mBooleans2); |
| } |
| |
| public PackageImpl(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.sdkLibraryName = sForInternedString.unparcel(in); |
| this.sdkLibVersionMajor = in.readInt(); |
| this.staticSharedLibraryName = 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 = sForInternedStringSet.unparcel(in); |
| 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(); |
| this.nativeLibraryRootRequiresIsa = in.readBoolean(); |
| this.primaryCpuAbi = sForInternedString.unparcel(in); |
| this.secondaryCpuAbi = sForInternedString.unparcel(in); |
| this.secondaryNativeLibraryDir = in.readString(); |
| this.uid = in.readInt(); |
| this.mBooleans = in.readLong(); |
| this.mBooleans2 = in.readLong(); |
| |
| assignDerivedFields(); |
| assignDerivedFields2(); |
| |
| // Do not call makeImmutable here as cached parsing will need |
| // to mutate this instance before it's finalized. |
| } |
| |
| @NonNull |
| public static final Creator<PackageImpl> CREATOR = new Creator<PackageImpl>() { |
| @Override |
| public PackageImpl createFromParcel(Parcel source) { |
| return new PackageImpl(source); |
| } |
| |
| @Override |
| public PackageImpl[] newArray(int size) { |
| return new PackageImpl[size]; |
| } |
| }; |
| |
| @NonNull |
| @Override |
| public String getManifestPackageName() { |
| return manifestPackageName; |
| } |
| |
| public boolean isStub() { |
| return getBoolean2(Booleans2.STUB); |
| } |
| |
| @Nullable |
| @Override |
| public String getNativeLibraryDir() { |
| return nativeLibraryDir; |
| } |
| |
| @Nullable |
| @Override |
| public String getNativeLibraryRootDir() { |
| return nativeLibraryRootDir; |
| } |
| |
| @Override |
| public boolean isNativeLibraryRootRequiresIsa() { |
| return nativeLibraryRootRequiresIsa; |
| } |
| |
| @Nullable |
| @Override |
| public String getPrimaryCpuAbi() { |
| return primaryCpuAbi; |
| } |
| |
| @Nullable |
| @Override |
| public String getSecondaryCpuAbi() { |
| return secondaryCpuAbi; |
| } |
| |
| @Nullable |
| @Override |
| public String getSecondaryNativeLibraryDir() { |
| return secondaryNativeLibraryDir; |
| } |
| |
| @Override |
| public boolean isCoreApp() { |
| return getBoolean(Booleans.CORE_APP); |
| } |
| |
| @Override |
| public boolean isSystem() { |
| return getBoolean(Booleans.SYSTEM); |
| } |
| |
| @Override |
| public boolean isFactoryTest() { |
| return getBoolean(Booleans.FACTORY_TEST); |
| } |
| |
| @Override |
| public boolean isApex() { |
| return getBoolean2(Booleans2.APEX); |
| } |
| |
| @Override |
| public boolean isSystemExt() { |
| return getBoolean(Booleans.SYSTEM_EXT); |
| } |
| |
| @Override |
| public boolean isPrivileged() { |
| return getBoolean(Booleans.PRIVILEGED); |
| } |
| |
| @Override |
| public boolean isOem() { |
| return getBoolean(Booleans.OEM); |
| } |
| |
| @Override |
| public boolean isVendor() { |
| return getBoolean(Booleans.VENDOR); |
| } |
| |
| @Override |
| public boolean isProduct() { |
| return getBoolean(Booleans.PRODUCT); |
| } |
| |
| @Override |
| public boolean isOdm() { |
| return getBoolean(Booleans.ODM); |
| } |
| |
| @Override |
| public boolean isSignedWithPlatformKey() { |
| return getBoolean(Booleans.SIGNED_WITH_PLATFORM_KEY); |
| } |
| |
| /** |
| * This is an appId, the uid if the userId is == USER_SYSTEM |
| */ |
| @Override |
| public int getUid() { |
| return uid; |
| } |
| |
| @Override |
| public PackageImpl setStub(boolean value) { |
| setBoolean2(Booleans2.STUB, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setNativeLibraryRootRequiresIsa(boolean value) { |
| nativeLibraryRootRequiresIsa = value; |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSystem(boolean value) { |
| setBoolean(Booleans.SYSTEM, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setFactoryTest(boolean value) { |
| setBoolean(Booleans.FACTORY_TEST, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setApex(boolean isApex) { |
| setBoolean2(Booleans2.APEX, isApex); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSystemExt(boolean value) { |
| setBoolean(Booleans.SYSTEM_EXT, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setPrivileged(boolean value) { |
| setBoolean(Booleans.PRIVILEGED, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setOem(boolean value) { |
| setBoolean(Booleans.OEM, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setVendor(boolean value) { |
| setBoolean(Booleans.VENDOR, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setProduct(boolean value) { |
| setBoolean(Booleans.PRODUCT, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setOdm(boolean value) { |
| setBoolean(Booleans.ODM, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setSignedWithPlatformKey(boolean value) { |
| setBoolean(Booleans.SIGNED_WITH_PLATFORM_KEY, value); |
| return this; |
| } |
| |
| @Override |
| public PackageImpl setUid(int value) { |
| uid = value; |
| return this; |
| } |
| |
| // The following methods are explicitly not inside any interface. These are hidden under |
| // PackageImpl which is only accessible to the system server. This is to prevent/discourage |
| // usage of these fields outside of the utility classes. |
| public String getBaseAppDataCredentialProtectedDirForSystemUser() { |
| return mBaseAppDataCredentialProtectedDirForSystemUser; |
| } |
| |
| 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, |
| 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 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; |
| } |
| } |