• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.pm.parsing.pkg;
18 
19 import static java.util.Collections.emptyList;
20 import static java.util.Collections.emptyMap;
21 import static java.util.Collections.emptySet;
22 
23 import android.annotation.LongDef;
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.content.Intent;
27 import android.content.IntentFilter;
28 import android.content.pm.ActivityInfo;
29 import android.content.pm.ApplicationInfo;
30 import android.content.pm.ConfigurationInfo;
31 import android.content.pm.FeatureGroupInfo;
32 import android.content.pm.FeatureInfo;
33 import android.content.pm.PackageInfo;
34 import android.content.pm.PackageManager;
35 import android.content.pm.SigningDetails;
36 import android.content.res.TypedArray;
37 import android.os.Build;
38 import android.os.Bundle;
39 import android.os.Environment;
40 import android.os.Parcel;
41 import android.os.Parcelable;
42 import android.os.UserHandle;
43 import android.os.storage.StorageManager;
44 import android.text.TextUtils;
45 import android.util.ArrayMap;
46 import android.util.ArraySet;
47 import android.util.Pair;
48 import android.util.SparseArray;
49 import android.util.SparseIntArray;
50 
51 import com.android.internal.R;
52 import com.android.internal.annotations.VisibleForTesting;
53 import com.android.internal.pm.parsing.AppInfoUtils;
54 import com.android.internal.pm.pkg.AndroidPackageSplitImpl;
55 import com.android.internal.pm.pkg.SEInfoUtil;
56 import com.android.internal.pm.pkg.component.ComponentMutateUtils;
57 import com.android.internal.pm.pkg.component.ParsedActivity;
58 import com.android.internal.pm.pkg.component.ParsedActivityImpl;
59 import com.android.internal.pm.pkg.component.ParsedApexSystemService;
60 import com.android.internal.pm.pkg.component.ParsedApexSystemServiceImpl;
61 import com.android.internal.pm.pkg.component.ParsedAttribution;
62 import com.android.internal.pm.pkg.component.ParsedAttributionImpl;
63 import com.android.internal.pm.pkg.component.ParsedComponent;
64 import com.android.internal.pm.pkg.component.ParsedInstrumentation;
65 import com.android.internal.pm.pkg.component.ParsedInstrumentationImpl;
66 import com.android.internal.pm.pkg.component.ParsedIntentInfo;
67 import com.android.internal.pm.pkg.component.ParsedMainComponent;
68 import com.android.internal.pm.pkg.component.ParsedPermission;
69 import com.android.internal.pm.pkg.component.ParsedPermissionGroup;
70 import com.android.internal.pm.pkg.component.ParsedPermissionGroupImpl;
71 import com.android.internal.pm.pkg.component.ParsedPermissionImpl;
72 import com.android.internal.pm.pkg.component.ParsedProcess;
73 import com.android.internal.pm.pkg.component.ParsedProcessImpl;
74 import com.android.internal.pm.pkg.component.ParsedProvider;
75 import com.android.internal.pm.pkg.component.ParsedProviderImpl;
76 import com.android.internal.pm.pkg.component.ParsedService;
77 import com.android.internal.pm.pkg.component.ParsedServiceImpl;
78 import com.android.internal.pm.pkg.component.ParsedUsesPermission;
79 import com.android.internal.pm.pkg.component.ParsedUsesPermissionImpl;
80 import com.android.internal.pm.pkg.parsing.ParsingPackage;
81 import com.android.internal.pm.pkg.parsing.ParsingPackageHidden;
82 import com.android.internal.pm.pkg.parsing.ParsingPackageUtils;
83 import com.android.internal.pm.pkg.parsing.ParsingUtils;
84 import com.android.internal.util.ArrayUtils;
85 import com.android.internal.util.CollectionUtils;
86 import com.android.internal.util.DataClass;
87 import com.android.internal.util.Parcelling;
88 import com.android.internal.util.Parcelling.BuiltIn.ForInternedString;
89 import com.android.server.pm.pkg.AndroidPackage;
90 import com.android.server.pm.pkg.AndroidPackageSplit;
91 
92 import libcore.util.EmptyArray;
93 
94 import java.io.File;
95 import java.security.PublicKey;
96 import java.util.ArrayList;
97 import java.util.Arrays;
98 import java.util.Collections;
99 import java.util.Comparator;
100 import java.util.List;
101 import java.util.Map;
102 import java.util.Set;
103 import java.util.UUID;
104 
105 /**
106  * Extensions to {@link PackageImpl} including fields/state contained in the system server
107  * and not exposed to the core SDK.
108  *
109  * @hide
110  */
111 public class PackageImpl implements ParsedPackage, AndroidPackageInternal,
112         AndroidPackageHidden, ParsingPackage, ParsingPackageHidden, Parcelable {
113 
114     private static final SparseArray<int[]> EMPTY_INT_ARRAY_SPARSE_ARRAY = new SparseArray<>();
115     private static final Comparator<ParsedMainComponent> ORDER_COMPARATOR =
116             (first, second) -> Integer.compare(second.getOrder(), first.getOrder());
117     public static final Parcelling.BuiltIn.ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(
118             Parcelling.BuiltIn.ForBoolean.class);
119     public static final ForInternedString sForInternedString = Parcelling.Cache.getOrCreate(
120             ForInternedString.class);
121     public static final Parcelling.BuiltIn.ForInternedStringArray sForInternedStringArray =
122             Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringArray.class);
123     public static final Parcelling.BuiltIn.ForInternedStringList sForInternedStringList =
124             Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringList.class);
125     public static final Parcelling.BuiltIn.ForInternedStringValueMap sForInternedStringValueMap =
126             Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringValueMap.class);
127     public static final Parcelling.BuiltIn.ForStringSet sForStringSet =
128             Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForStringSet.class);
129     public static final Parcelling.BuiltIn.ForInternedStringSet sForInternedStringSet =
130             Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForInternedStringSet.class);
131     protected static final ParsingUtils.StringPairListParceler sForIntentInfoPairs =
132             new ParsingUtils.StringPairListParceler();
133     protected int versionCode;
134     protected int versionCodeMajor;
135     @NonNull
136     @DataClass.ParcelWith(ForInternedString.class)
137     protected String packageName;
138     @NonNull
139     protected String mBaseApkPath;
140     @NonNull
141     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
142     protected List<String> usesLibraries = emptyList();
143     @NonNull
144     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
145     protected List<String> usesOptionalLibraries = emptyList();
146     @NonNull
147     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
148     protected List<String> usesNativeLibraries = emptyList();
149     @NonNull
150     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
151     protected List<String> usesOptionalNativeLibraries = emptyList();
152     @NonNull
153     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
154     protected List<String> originalPackages = emptyList();
155     @NonNull
156     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
157     protected List<String> adoptPermissions = emptyList();
158     /**
159      * @deprecated consider migrating to {@link #getUsesPermissions} which has
160      *             more parsed details, such as flags
161      */
162     @NonNull
163     @Deprecated
164     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
165     protected Set<String> requestedPermissions = emptySet();
166     @NonNull
167     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
168     protected List<String> protectedBroadcasts = emptyList();
169     @NonNull
170     protected List<ParsedActivity> activities = emptyList();
171     @NonNull
172     protected List<ParsedApexSystemService> apexSystemServices = emptyList();
173     @NonNull
174     protected List<ParsedActivity> receivers = emptyList();
175     @NonNull
176     protected List<ParsedService> services = emptyList();
177     @NonNull
178     protected List<ParsedProvider> providers = emptyList();
179     @NonNull
180     protected List<ParsedPermission> permissions = emptyList();
181     @NonNull
182     protected List<ParsedPermissionGroup> permissionGroups = emptyList();
183     @NonNull
184     protected List<ParsedInstrumentation> instrumentations = emptyList();
185     @Nullable
186     @DataClass.ParcelWith(ForInternedString.class)
187     protected String volumeUuid;
188     @NonNull
189     @DataClass.ParcelWith(ForInternedString.class)
190     protected String mPath;
191     @Nullable
192     protected String[] splitCodePaths;
193     @NonNull
194     protected UUID mStorageUuid;
195     // These are objects because null represents not explicitly set
196     @Nullable
197     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
198     private Boolean supportsSmallScreens;
199     @Nullable
200     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
201     private Boolean supportsNormalScreens;
202     @Nullable
203     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
204     private Boolean supportsLargeScreens;
205     @Nullable
206     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
207     private Boolean supportsExtraLargeScreens;
208     @Nullable
209     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
210     private Boolean resizeable;
211     @Nullable
212     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
213     private Boolean anyDensity;
214     private int baseRevisionCode;
215     @Nullable
216     @DataClass.ParcelWith(ForInternedString.class)
217     private String versionName;
218     private int compileSdkVersion;
219     @Nullable
220     @DataClass.ParcelWith(ForInternedString.class)
221     private String compileSdkVersionCodeName;
222     @Nullable
223     @DataClass.ParcelWith(ForInternedString.class)
224     private String restrictedAccountType;
225     @Nullable
226     @DataClass.ParcelWith(ForInternedString.class)
227     private String requiredAccountType;
228     @Nullable
229     @DataClass.ParcelWith(ForInternedString.class)
230     private String mEmergencyInstaller;
231     @Nullable
232     @DataClass.ParcelWith(ForInternedString.class)
233     private String overlayTarget;
234     @Nullable
235     @DataClass.ParcelWith(ForInternedString.class)
236     private String overlayTargetOverlayableName;
237     @Nullable
238     @DataClass.ParcelWith(ForInternedString.class)
239     private String overlayCategory;
240     private int overlayPriority;
241     @NonNull
242     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringValueMap.class)
243     private Map<String, String> overlayables = emptyMap();
244     @Nullable
245     @DataClass.ParcelWith(ForInternedString.class)
246     private String sdkLibraryName;
247     private int sdkLibVersionMajor;
248     @Nullable
249     @DataClass.ParcelWith(ForInternedString.class)
250     private String staticSharedLibraryName;
251     private long staticSharedLibVersion;
252     @NonNull
253     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
254     private List<String> libraryNames = emptyList();
255     @NonNull
256     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
257     private List<String> usesStaticLibraries = emptyList();
258     @Nullable
259     private long[] usesStaticLibrariesVersions;
260     @Nullable
261     private String[][] usesStaticLibrariesCertDigests;
262     @NonNull
263     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
264     private List<String> usesSdkLibraries = emptyList();
265     @Nullable
266     private long[] usesSdkLibrariesVersionsMajor;
267     @Nullable
268     private String[][] usesSdkLibrariesCertDigests;
269     @Nullable
270     private boolean[] usesSdkLibrariesOptional;
271     @Nullable
272     @DataClass.ParcelWith(ForInternedString.class)
273     private String sharedUserId;
274     private int sharedUserLabel;
275     @NonNull
276     private List<ConfigurationInfo> configPreferences = emptyList();
277     @NonNull
278     private List<FeatureInfo> reqFeatures = emptyList();
279     @NonNull
280     private List<FeatureGroupInfo> featureGroups = emptyList();
281     @Nullable
282     private byte[] restrictUpdateHash;
283     @NonNull
284     private List<ParsedUsesPermission> usesPermissions = emptyList();
285     @NonNull
286     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
287     private Set<String> implicitPermissions = emptySet();
288     @NonNull
289     private Set<String> upgradeKeySets = emptySet();
290     @NonNull
291     private Map<String, ArraySet<PublicKey>> keySetMapping = emptyMap();
292     @NonNull
293     private List<ParsedAttribution> attributions = emptyList();
294     @NonNull
295 //    @DataClass.ParcelWith(ParsingUtils.StringPairListParceler.class)
296     private List<Pair<String, ParsedIntentInfo>> preferredActivityFilters = emptyList();
297     /**
298      * Map from a process name to a {@link ParsedProcess}.
299      */
300     @NonNull
301     private Map<String, ParsedProcess> processes = emptyMap();
302     @Nullable
303     private Bundle metaData;
304     @NonNull
305     private Map<String, PackageManager.Property> mProperties = emptyMap();
306     @NonNull
307     private SigningDetails signingDetails = SigningDetails.UNKNOWN;
308     @NonNull
309     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
310     private List<Intent> queriesIntents = emptyList();
311     @NonNull
312     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringList.class)
313     private List<String> queriesPackages = emptyList();
314     @NonNull
315     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
316     private Set<String> queriesProviders = emptySet();
317     @Nullable
318     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringArray.class)
319     private String[] splitClassLoaderNames;
320     @Nullable
321     private SparseArray<int[]> splitDependencies;
322     @Nullable
323     private int[] splitFlags;
324     @Nullable
325     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringArray.class)
326     private String[] splitNames;
327     @Nullable
328     private int[] splitRevisionCodes;
329     @Nullable
330     @DataClass.ParcelWith(ForInternedString.class)
331     private String appComponentFactory;
332     @Nullable
333     @DataClass.ParcelWith(ForInternedString.class)
334     private String backupAgentName;
335     private int banner;
336     private int category = ApplicationInfo.CATEGORY_UNDEFINED;
337     @Nullable
338     @DataClass.ParcelWith(ForInternedString.class)
339     private String classLoaderName;
340     @Nullable
341     @DataClass.ParcelWith(ForInternedString.class)
342     private String className;
343     private int compatibleWidthLimitDp;
344     private int descriptionRes;
345     private int fullBackupContent;
346     private int dataExtractionRules;
347     private int iconRes;
348     private int installLocation = ParsingPackageUtils.PARSE_DEFAULT_INSTALL_LOCATION;
349     private int labelRes;
350     private int largestWidthLimitDp;
351     private int logo;
352     @Nullable
353     @DataClass.ParcelWith(ForInternedString.class)
354     private String manageSpaceActivityName;
355     private float maxAspectRatio;
356     private float minAspectRatio;
357     @Nullable
358     private SparseIntArray minExtensionVersions;
359     private int minSdkVersion = ParsingUtils.DEFAULT_MIN_SDK_VERSION;
360     private int maxSdkVersion = ParsingUtils.DEFAULT_MAX_SDK_VERSION;
361     private int networkSecurityConfigRes;
362     @Nullable
363     private CharSequence nonLocalizedLabel;
364     @Nullable
365     @DataClass.ParcelWith(ForInternedString.class)
366     private String permission;
367     @Nullable
368     @DataClass.ParcelWith(ForInternedString.class)
369     private String processName;
370     private int requiresSmallestWidthDp;
371     private int roundIconRes;
372     private int targetSandboxVersion;
373     private int targetSdkVersion = ParsingUtils.DEFAULT_TARGET_SDK_VERSION;
374     @Nullable
375     @DataClass.ParcelWith(ForInternedString.class)
376     private String taskAffinity;
377     private int theme;
378     private int uiOptions;
379     @Nullable
380     @DataClass.ParcelWith(ForInternedString.class)
381     private String zygotePreloadName;
382     /**
383      * @see AndroidPackage#getResizeableActivity()
384      */
385     @Nullable
386     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
387     private Boolean resizeableActivity;
388     private int autoRevokePermissions;
389     @ApplicationInfo.GwpAsanMode
390     private int gwpAsanMode;
391     @ApplicationInfo.MemtagMode
392     private int memtagMode;
393     @ApplicationInfo.NativeHeapZeroInitialized
394     private int nativeHeapZeroInitialized;
395 
396     @ApplicationInfo.PageSizeAppCompatFlags private int mPageSizeAppCompatFlags =
397             ApplicationInfo.PAGE_SIZE_APP_COMPAT_FLAG_UNDEFINED;
398 
399     @Nullable
400     @DataClass.ParcelWith(Parcelling.BuiltIn.ForBoolean.class)
401     private Boolean requestRawExternalStorageAccess;
402     @NonNull
403     @DataClass.ParcelWith(Parcelling.BuiltIn.ForInternedStringSet.class)
404     private Set<String> mimeGroups = emptySet();
405     // Usually there's code to set enabled to true during parsing, but it's possible to install
406     // an APK targeting <R that doesn't contain an <application> tag. That code would be skipped
407     // and never assign this, so initialize this to true for those cases.
408     private long mBooleans = Booleans.ENABLED;
409     private long mBooleans2 = Booleans2.UPDATABLE_SYSTEM;
410     @NonNull
411     private Set<String> mKnownActivityEmbeddingCerts = emptySet();
412     // Derived fields
413     private long mLongVersionCode;
414     private int mLocaleConfigRes;
415     private boolean mAllowCrossUidActivitySwitchFromBelow;
416 
417     @Nullable
418     private int[] mAlternateLauncherIconResIds;
419     @Nullable
420     private int[] mAlternateLauncherLabelResIds;
421 
422     private List<AndroidPackageSplit> mSplits;
423 
424     @NonNull
425     private String[] mUsesLibrariesSorted;
426     @NonNull
427     private String[] mUsesOptionalLibrariesSorted;
428     @NonNull
429     private String[] mUsesSdkLibrariesSorted;
430     @NonNull
431     private String[] mUsesStaticLibrariesSorted;
432 
433     private Map<String, Boolean> mFeatureFlagState = new ArrayMap<>();
434 
435     private int mIntentMatchingFlags;
436 
437     @NonNull
forParsing(@onNull String packageName, @NonNull String baseCodePath, @NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp, @Nullable ParsingPackageUtils.Callback callback)438     public static PackageImpl forParsing(@NonNull String packageName, @NonNull String baseCodePath,
439             @NonNull String codePath, @NonNull TypedArray manifestArray, boolean isCoreApp,
440             @Nullable ParsingPackageUtils.Callback callback) {
441         return new PackageImpl(
442                 packageName, baseCodePath, codePath, manifestArray, isCoreApp, callback);
443     }
444 
445     /**
446      * Mock an unavailable {@link AndroidPackage} to use when
447      * removing
448      * a package from the system.
449      * This can occur if the package was installed on a storage device that has since been removed.
450      * Since the infrastructure uses {@link AndroidPackage}, but
451      * for
452      * this case only cares about
453      * volumeUuid, just fake it rather than having separate method paths.
454      */
455     @NonNull
buildFakeForDeletion(String packageName, String volumeUuid)456     public static AndroidPackage buildFakeForDeletion(String packageName, String volumeUuid) {
457         return PackageImpl.forTesting(packageName)
458                 .setVolumeUuid(volumeUuid)
459                 .hideAsParsed()
460                 .hideAsFinal();
461     }
462 
463     @NonNull
464     @VisibleForTesting
forTesting(String packageName)465     public static ParsingPackage forTesting(String packageName) {
466         return forTesting(packageName, "");
467     }
468 
469     @NonNull
470     @VisibleForTesting
forTesting(String packageName, String baseCodePath)471     public static ParsingPackage forTesting(String packageName, String baseCodePath) {
472         return new PackageImpl(packageName, baseCodePath, baseCodePath, null, false, null);
473     }
474 
475     @NonNull
476     @DataClass.ParcelWith(ForInternedString.class)
477     private final String manifestPackageName;
478 
479     @Nullable
480     @DataClass.ParcelWith(ForInternedString.class)
481     protected String nativeLibraryDir;
482 
483     @Nullable
484     @DataClass.ParcelWith(ForInternedString.class)
485     protected String nativeLibraryRootDir;
486 
487     @Nullable
488     @DataClass.ParcelWith(ForInternedString.class)
489     protected String primaryCpuAbi;
490     @Nullable
491     @DataClass.ParcelWith(ForInternedString.class)
492     protected String secondaryCpuAbi;
493     @Nullable
494     @DataClass.ParcelWith(ForInternedString.class)
495     protected String secondaryNativeLibraryDir;
496 
497     /**
498      * This is an appId, the uid if the userId is == USER_SYSTEM
499      */
500     private int uid = -1;
501 
502     // This is kept around as a boolean to avoid flag calculation
503     // during ApplicationInfo generation.
504     private boolean nativeLibraryRootRequiresIsa;
505 
506     @Override
addActivity(ParsedActivity parsedActivity)507     public PackageImpl addActivity(ParsedActivity parsedActivity) {
508         this.activities = CollectionUtils.add(this.activities, parsedActivity);
509         addMimeGroupsFromComponent(parsedActivity);
510         return this;
511     }
512 
513     @Override
addAdoptPermission(String adoptPermission)514     public PackageImpl addAdoptPermission(String adoptPermission) {
515         this.adoptPermissions = CollectionUtils.add(this.adoptPermissions,
516                 TextUtils.safeIntern(adoptPermission));
517         return this;
518     }
519 
520     @Override
addApexSystemService( ParsedApexSystemService parsedApexSystemService)521     public final PackageImpl addApexSystemService(
522             ParsedApexSystemService parsedApexSystemService) {
523         this.apexSystemServices = CollectionUtils.add(
524                 this.apexSystemServices, parsedApexSystemService);
525         return this;
526     }
527 
528     @Override
addAttribution(ParsedAttribution attribution)529     public PackageImpl addAttribution(ParsedAttribution attribution) {
530         this.attributions = CollectionUtils.add(this.attributions, attribution);
531         return this;
532     }
533 
534     @Override
addConfigPreference(ConfigurationInfo configPreference)535     public PackageImpl addConfigPreference(ConfigurationInfo configPreference) {
536         this.configPreferences = CollectionUtils.add(this.configPreferences, configPreference);
537         return this;
538     }
539 
540     @Override
addFeatureGroup(FeatureGroupInfo featureGroup)541     public PackageImpl addFeatureGroup(FeatureGroupInfo featureGroup) {
542         this.featureGroups = CollectionUtils.add(this.featureGroups, featureGroup);
543         return this;
544     }
545 
546     @Override
addImplicitPermission(String permission)547     public PackageImpl addImplicitPermission(String permission) {
548         addUsesPermission(new ParsedUsesPermissionImpl(permission, 0 /*usesPermissionFlags*/));
549         this.implicitPermissions = CollectionUtils.add(this.implicitPermissions,
550                 TextUtils.safeIntern(permission));
551         return this;
552     }
553 
554     @Override
addInstrumentation(ParsedInstrumentation instrumentation)555     public PackageImpl addInstrumentation(ParsedInstrumentation instrumentation) {
556         this.instrumentations = CollectionUtils.add(this.instrumentations, instrumentation);
557         return this;
558     }
559 
560     @Override
addKeySet(String keySetName, PublicKey publicKey)561     public PackageImpl addKeySet(String keySetName, PublicKey publicKey) {
562         ArraySet<PublicKey> publicKeys = keySetMapping.get(keySetName);
563         if (publicKeys == null) {
564             publicKeys = new ArraySet<>();
565         }
566         publicKeys.add(publicKey);
567         keySetMapping = CollectionUtils.add(this.keySetMapping, keySetName, publicKeys);
568         return this;
569     }
570 
571     @Override
addLibraryName(String libraryName)572     public PackageImpl addLibraryName(String libraryName) {
573         this.libraryNames = CollectionUtils.add(this.libraryNames,
574                 TextUtils.safeIntern(libraryName));
575         return this;
576     }
577 
addMimeGroupsFromComponent(ParsedComponent component)578     private void addMimeGroupsFromComponent(ParsedComponent component) {
579         for (int i = component.getIntents().size() - 1; i >= 0; i--) {
580             IntentFilter filter = component.getIntents().get(i).getIntentFilter();
581             for (int groupIndex = filter.countMimeGroups() - 1; groupIndex >= 0; groupIndex--) {
582                 if (mimeGroups != null && mimeGroups.size() > 500) {
583                     throw new IllegalStateException("Max limit on number of MIME Groups reached");
584                 }
585                 mimeGroups = CollectionUtils.add(mimeGroups, filter.getMimeGroup(groupIndex));
586             }
587         }
588     }
589 
590     @Override
addOriginalPackage(String originalPackage)591     public PackageImpl addOriginalPackage(String originalPackage) {
592         this.originalPackages = CollectionUtils.add(this.originalPackages, originalPackage);
593         return this;
594     }
595 
596     @Override
addOverlayable(String overlayableName, String actorName)597     public ParsingPackage addOverlayable(String overlayableName, String actorName) {
598         this.overlayables = CollectionUtils.add(this.overlayables, overlayableName,
599                 TextUtils.safeIntern(actorName));
600         return this;
601     }
602 
603     @Override
addPermission(ParsedPermission permission)604     public PackageImpl addPermission(ParsedPermission permission) {
605         this.permissions = CollectionUtils.add(this.permissions, permission);
606         return this;
607     }
608 
609     @Override
addPermissionGroup(ParsedPermissionGroup permissionGroup)610     public PackageImpl addPermissionGroup(ParsedPermissionGroup permissionGroup) {
611         this.permissionGroups = CollectionUtils.add(this.permissionGroups, permissionGroup);
612         return this;
613     }
614 
615     @Override
addPreferredActivityFilter(String className, ParsedIntentInfo intentInfo)616     public PackageImpl addPreferredActivityFilter(String className,
617             ParsedIntentInfo intentInfo) {
618         this.preferredActivityFilters = CollectionUtils.add(this.preferredActivityFilters,
619                 Pair.create(className, intentInfo));
620         return this;
621     }
622 
623     @Override
addProperty(@ullable PackageManager.Property property)624     public PackageImpl addProperty(@Nullable PackageManager.Property property) {
625         if (property == null) {
626             return this;
627         }
628         this.mProperties = CollectionUtils.add(this.mProperties, property.getName(), property);
629         return this;
630     }
631 
632     @Override
addProtectedBroadcast(String protectedBroadcast)633     public PackageImpl addProtectedBroadcast(String protectedBroadcast) {
634         if (!this.protectedBroadcasts.contains(protectedBroadcast)) {
635             this.protectedBroadcasts = CollectionUtils.add(this.protectedBroadcasts,
636                     TextUtils.safeIntern(protectedBroadcast));
637         }
638         return this;
639     }
640 
641     @Override
addProvider(ParsedProvider parsedProvider)642     public PackageImpl addProvider(ParsedProvider parsedProvider) {
643         this.providers = CollectionUtils.add(this.providers, parsedProvider);
644         addMimeGroupsFromComponent(parsedProvider);
645         return this;
646     }
647 
648     @Override
addQueriesIntent(Intent intent)649     public PackageImpl addQueriesIntent(Intent intent) {
650         this.queriesIntents = CollectionUtils.add(this.queriesIntents, intent);
651         return this;
652     }
653 
654     @Override
addQueriesPackage(String packageName)655     public PackageImpl addQueriesPackage(String packageName) {
656         this.queriesPackages = CollectionUtils.add(this.queriesPackages,
657                 TextUtils.safeIntern(packageName));
658         return this;
659     }
660 
661     @Override
addQueriesProvider(String authority)662     public PackageImpl addQueriesProvider(String authority) {
663         this.queriesProviders = CollectionUtils.add(this.queriesProviders, authority);
664         return this;
665     }
666 
667     @Override
addReceiver(ParsedActivity parsedReceiver)668     public PackageImpl addReceiver(ParsedActivity parsedReceiver) {
669         this.receivers = CollectionUtils.add(this.receivers, parsedReceiver);
670         addMimeGroupsFromComponent(parsedReceiver);
671         return this;
672     }
673 
674     @Override
addReqFeature(FeatureInfo reqFeature)675     public PackageImpl addReqFeature(FeatureInfo reqFeature) {
676         this.reqFeatures = CollectionUtils.add(this.reqFeatures, reqFeature);
677         return this;
678     }
679 
680     @Override
addService(ParsedService parsedService)681     public PackageImpl addService(ParsedService parsedService) {
682         this.services = CollectionUtils.add(this.services, parsedService);
683         addMimeGroupsFromComponent(parsedService);
684         return this;
685     }
686 
687     @Override
addUsesLibrary(String libraryName)688     public PackageImpl addUsesLibrary(String libraryName) {
689         libraryName = TextUtils.safeIntern(libraryName);
690         if (!ArrayUtils.contains(this.usesLibraries, libraryName)) {
691             this.usesLibraries = CollectionUtils.add(this.usesLibraries, libraryName);
692         }
693         return this;
694     }
695 
696     @Override
addUsesNativeLibrary(String libraryName)697     public final PackageImpl addUsesNativeLibrary(String libraryName) {
698         libraryName = TextUtils.safeIntern(libraryName);
699         if (!ArrayUtils.contains(this.usesNativeLibraries, libraryName)) {
700             this.usesNativeLibraries = CollectionUtils.add(this.usesNativeLibraries, libraryName);
701         }
702         return this;
703     }
704 
705     @Override
addUsesOptionalLibrary(String libraryName)706     public PackageImpl addUsesOptionalLibrary(String libraryName) {
707         libraryName = TextUtils.safeIntern(libraryName);
708         if (!ArrayUtils.contains(this.usesOptionalLibraries, libraryName)) {
709             this.usesOptionalLibraries = CollectionUtils.add(this.usesOptionalLibraries,
710                     libraryName);
711         }
712         return this;
713     }
714 
715     @Override
addUsesOptionalNativeLibrary(String libraryName)716     public final PackageImpl addUsesOptionalNativeLibrary(String libraryName) {
717         libraryName = TextUtils.safeIntern(libraryName);
718         if (!ArrayUtils.contains(this.usesOptionalNativeLibraries, libraryName)) {
719             this.usesOptionalNativeLibraries = CollectionUtils.add(this.usesOptionalNativeLibraries,
720                     libraryName);
721         }
722         return this;
723     }
724 
725     @Override
addUsesPermission(ParsedUsesPermission permission)726     public PackageImpl addUsesPermission(ParsedUsesPermission permission) {
727         this.usesPermissions = CollectionUtils.add(this.usesPermissions, permission);
728 
729         // Continue populating legacy data structures to avoid performance
730         // issues until all that code can be migrated
731         this.requestedPermissions = CollectionUtils.add(this.requestedPermissions,
732                 permission.getName());
733 
734         return this;
735     }
736 
737     @Override
addUsesSdkLibrary(String libraryName, long versionMajor, String[] certSha256Digests, boolean usesSdkLibrariesOptional)738     public PackageImpl addUsesSdkLibrary(String libraryName, long versionMajor,
739             String[] certSha256Digests, boolean usesSdkLibrariesOptional) {
740         this.usesSdkLibraries = CollectionUtils.add(this.usesSdkLibraries,
741                 TextUtils.safeIntern(libraryName));
742         this.usesSdkLibrariesVersionsMajor = ArrayUtils.appendLong(
743                 this.usesSdkLibrariesVersionsMajor, versionMajor, /* allowDuplicates= */ true);
744         this.usesSdkLibrariesCertDigests = ArrayUtils.appendElement(String[].class,
745                 this.usesSdkLibrariesCertDigests, certSha256Digests, /* allowDuplicates= */ true);
746         this.usesSdkLibrariesOptional = ArrayUtils.appendBooleanDuplicatesAllowed(
747                 this.usesSdkLibrariesOptional, usesSdkLibrariesOptional);
748         return this;
749     }
750 
751     @Override
addUsesStaticLibrary(String libraryName, long version, String[] certSha256Digests)752     public PackageImpl addUsesStaticLibrary(String libraryName, long version,
753             String[] certSha256Digests) {
754         this.usesStaticLibraries = CollectionUtils.add(this.usesStaticLibraries,
755                 TextUtils.safeIntern(libraryName));
756         this.usesStaticLibrariesVersions = ArrayUtils.appendLong(this.usesStaticLibrariesVersions,
757                 version, true);
758         this.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String[].class,
759                 this.usesStaticLibrariesCertDigests, certSha256Digests, true);
760         return this;
761     }
762 
763     @Override
isAttributionsUserVisible()764     public boolean isAttributionsUserVisible() {
765         return getBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE);
766     }
767 
768     @Override
asSplit(String[] splitNames, String[] splitCodePaths, int[] splitRevisionCodes, SparseArray<int[]> splitDependencies)769     public PackageImpl asSplit(String[] splitNames, String[] splitCodePaths,
770             int[] splitRevisionCodes, SparseArray<int[]> splitDependencies) {
771         this.splitNames = splitNames;
772         this.splitCodePaths = splitCodePaths;
773         this.splitRevisionCodes = splitRevisionCodes;
774         this.splitDependencies = splitDependencies;
775 
776         int count = splitNames.length;
777         this.splitFlags = new int[count];
778         this.splitClassLoaderNames = new String[count];
779         return this;
780     }
781 
assignDerivedFields()782     protected void assignDerivedFields() {
783         mStorageUuid = StorageManager.convert(volumeUuid);
784         mLongVersionCode = PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode);
785     }
786 
787     /**
788      * Create a map from a process name to the custom application class for this process,
789      * which comes from <processes><process android:name="xxx">.
790      *
791      * The original information is stored in {@link #processes}, but it's stored in
792      * a form of: [process name] -[1:N]-> [package name] -[1:N]-> [class name].
793      * We scan it and collect the process names and their app class names, only for this package.
794      *
795      * The resulting map only contains processes with a custom application class set.
796      */
797     @Nullable
buildAppClassNamesByProcess()798     private ArrayMap<String, String> buildAppClassNamesByProcess() {
799         if (ArrayUtils.size(processes) == 0) {
800             return null;
801         }
802         final ArrayMap<String, String> ret = new ArrayMap<>(4);
803         for (String processName : processes.keySet()) {
804             final ParsedProcess process = processes.get(processName);
805             final ArrayMap<String, String> appClassesByPackage =
806                     process.getAppClassNamesByPackage();
807 
808             for (int i = 0; i < appClassesByPackage.size(); i++) {
809                 final String packageName = appClassesByPackage.keyAt(i);
810 
811                 if (this.packageName.equals(packageName)) {
812                     final String appClassName = appClassesByPackage.valueAt(i);
813                     if (!TextUtils.isEmpty(appClassName)) {
814                         ret.put(processName, appClassName);
815                     }
816                 }
817             }
818         }
819         return ret;
820     }
821 
822     @Override
getSplits()823     public List<AndroidPackageSplit> getSplits() {
824         if (mSplits == null) {
825             var splits = new ArrayList<AndroidPackageSplit>();
826             splits.add(new AndroidPackageSplitImpl(
827                     null,
828                     getBaseApkPath(),
829                     getBaseRevisionCode(),
830                     isDeclaredHavingCode() ? ApplicationInfo.FLAG_HAS_CODE : 0,
831                     getClassLoaderName()
832             ));
833 
834             if (splitNames != null) {
835                 for (int index = 0; index < splitNames.length; index++) {
836                     splits.add(new AndroidPackageSplitImpl(
837                             splitNames[index],
838                             splitCodePaths[index],
839                             splitRevisionCodes[index],
840                             splitFlags[index],
841                             splitClassLoaderNames[index]
842                     ));
843                 }
844             }
845 
846             if (splitDependencies != null) {
847                 for (int index = 0; index < splitDependencies.size(); index++) {
848                     var splitIndex = splitDependencies.keyAt(index);
849                     var dependenciesByIndex = splitDependencies.valueAt(index);
850                     var dependencies = new ArrayList<AndroidPackageSplit>();
851                     for (int dependencyIndex : dependenciesByIndex) {
852                         // Legacy holdover, base dependencies are an array of -1 rather than empty
853                         if (dependencyIndex >= 0) {
854                             dependencies.add(splits.get(dependencyIndex));
855                         }
856                     }
857                     ((AndroidPackageSplitImpl) splits.get(splitIndex))
858                             .fillDependencies(Collections.unmodifiableList(dependencies));
859                 }
860             }
861 
862             mSplits = Collections.unmodifiableList(splits);
863         }
864         return mSplits;
865     }
866 
867     @Override
toString()868     public String toString() {
869         return "Package{"
870                 + Integer.toHexString(System.identityHashCode(this))
871                 + " " + packageName + "}";
872     }
873 
874     @NonNull
875     @Override
getActivities()876     public List<ParsedActivity> getActivities() {
877         return activities;
878     }
879 
880     @NonNull
881     @Override
getAdoptPermissions()882     public List<String> getAdoptPermissions() {
883         return adoptPermissions;
884     }
885 
886     @Nullable
887     @Override
getAlternateLauncherIconResIds()888     public int[] getAlternateLauncherIconResIds() {
889         return mAlternateLauncherIconResIds;
890     }
891 
892     @Nullable
893     @Override
getAlternateLauncherLabelResIds()894     public int[] getAlternateLauncherLabelResIds() {
895         return mAlternateLauncherLabelResIds;
896     }
897 
898     @NonNull
899     @Override
getApexSystemServices()900     public List<ParsedApexSystemService> getApexSystemServices() {
901         return apexSystemServices;
902     }
903 
904     @Nullable
905     @Override
getAppComponentFactory()906     public String getAppComponentFactory() {
907         return appComponentFactory;
908     }
909 
910     @NonNull
911     @Override
getAttributions()912     public List<ParsedAttribution> getAttributions() {
913         return attributions;
914     }
915 
916     @Override
getAutoRevokePermissions()917     public int getAutoRevokePermissions() {
918         return autoRevokePermissions;
919     }
920 
921     @Nullable
922     @Override
getBackupAgentName()923     public String getBackupAgentName() {
924         return backupAgentName;
925     }
926 
927     @Override
getBannerResourceId()928     public int getBannerResourceId() {
929         return banner;
930     }
931 
932     @NonNull
933     @Override
getBaseApkPath()934     public String getBaseApkPath() {
935         return mBaseApkPath;
936     }
937 
938     @Override
getBaseRevisionCode()939     public int getBaseRevisionCode() {
940         return baseRevisionCode;
941     }
942 
943     @Override
getCategory()944     public int getCategory() {
945         return category;
946     }
947 
948     @Nullable
949     @Override
getClassLoaderName()950     public String getClassLoaderName() {
951         return classLoaderName;
952     }
953 
954     @Nullable
955     @Override
getApplicationClassName()956     public String getApplicationClassName() {
957         return className;
958     }
959 
960     @Override
getCompatibleWidthLimitDp()961     public int getCompatibleWidthLimitDp() {
962         return compatibleWidthLimitDp;
963     }
964 
965     @Override
getCompileSdkVersion()966     public int getCompileSdkVersion() {
967         return compileSdkVersion;
968     }
969 
970     @Nullable
971     @Override
getCompileSdkVersionCodeName()972     public String getCompileSdkVersionCodeName() {
973         return compileSdkVersionCodeName;
974     }
975 
976     @NonNull
977     @Override
getConfigPreferences()978     public List<ConfigurationInfo> getConfigPreferences() {
979         return configPreferences;
980     }
981 
982     @Override
getDataExtractionRulesResourceId()983     public int getDataExtractionRulesResourceId() {
984         return dataExtractionRules;
985     }
986 
987     @Override
getDescriptionResourceId()988     public int getDescriptionResourceId() {
989         return descriptionRes;
990     }
991 
992     @NonNull
993     @Override
getFeatureGroups()994     public List<FeatureGroupInfo> getFeatureGroups() {
995         return featureGroups;
996     }
997 
998     @Override
getFullBackupContentResourceId()999     public int getFullBackupContentResourceId() {
1000         return fullBackupContent;
1001     }
1002 
1003     @ApplicationInfo.GwpAsanMode
1004     @Override
getGwpAsanMode()1005     public int getGwpAsanMode() {
1006         return gwpAsanMode;
1007     }
1008 
1009     @Override
getIconResourceId()1010     public int getIconResourceId() {
1011         return iconRes;
1012     }
1013 
1014     @NonNull
1015     @Override
getImplicitPermissions()1016     public Set<String> getImplicitPermissions() {
1017         return implicitPermissions;
1018     }
1019 
1020     @Override
getInstallLocation()1021     public int getInstallLocation() {
1022         return installLocation;
1023     }
1024 
1025     @NonNull
1026     @Override
getInstrumentations()1027     public List<ParsedInstrumentation> getInstrumentations() {
1028         return instrumentations;
1029     }
1030 
1031     @NonNull
1032     @Override
getKeySetMapping()1033     public Map<String,ArraySet<PublicKey>> getKeySetMapping() {
1034         return keySetMapping;
1035     }
1036 
1037     @NonNull
1038     @Override
getKnownActivityEmbeddingCerts()1039     public Set<String> getKnownActivityEmbeddingCerts() {
1040         return mKnownActivityEmbeddingCerts;
1041     }
1042 
1043     @Override
getLabelResourceId()1044     public int getLabelResourceId() {
1045         return labelRes;
1046     }
1047 
1048     @Override
getLargestWidthLimitDp()1049     public int getLargestWidthLimitDp() {
1050         return largestWidthLimitDp;
1051     }
1052 
1053     @NonNull
1054     @Override
getLibraryNames()1055     public List<String> getLibraryNames() {
1056         return libraryNames;
1057     }
1058 
1059     @Override
getLocaleConfigResourceId()1060     public int getLocaleConfigResourceId() {
1061         return mLocaleConfigRes;
1062     }
1063 
1064     @Override
getLogoResourceId()1065     public int getLogoResourceId() {
1066         return logo;
1067     }
1068 
1069     @Nullable
1070     @Override
getManageSpaceActivityName()1071     public String getManageSpaceActivityName() {
1072         return manageSpaceActivityName;
1073     }
1074 
1075     @Override
getMaxAspectRatio()1076     public float getMaxAspectRatio() {
1077         return maxAspectRatio;
1078     }
1079 
1080     @Override
getMaxSdkVersion()1081     public int getMaxSdkVersion() {
1082         return maxSdkVersion;
1083     }
1084 
1085     @ApplicationInfo.MemtagMode
1086     @Override
getMemtagMode()1087     public int getMemtagMode() {
1088         return memtagMode;
1089     }
1090 
1091     @Nullable
1092     @Override
getMetaData()1093     public Bundle getMetaData() {
1094         return metaData;
1095     }
1096 
1097     @Override
1098     @Nullable
getMimeGroups()1099     public Set<String> getMimeGroups() {
1100         return mimeGroups;
1101     }
1102 
1103     @Override
getMinAspectRatio()1104     public float getMinAspectRatio() {
1105         return minAspectRatio;
1106     }
1107 
1108     @Nullable
1109     @Override
getMinExtensionVersions()1110     public SparseIntArray getMinExtensionVersions() {
1111         return minExtensionVersions;
1112     }
1113 
1114     @Override
getMinSdkVersion()1115     public int getMinSdkVersion() {
1116         return minSdkVersion;
1117     }
1118 
1119     @ApplicationInfo.NativeHeapZeroInitialized
1120     @Override
getNativeHeapZeroInitialized()1121     public int getNativeHeapZeroInitialized() {
1122         return nativeHeapZeroInitialized;
1123     }
1124 
1125     @ApplicationInfo.PageSizeAppCompatFlags
1126     @Override
getPageSizeAppCompatFlags()1127     public int getPageSizeAppCompatFlags() {
1128         return mPageSizeAppCompatFlags;
1129     }
1130 
1131     @Override
getNetworkSecurityConfigResourceId()1132     public int getNetworkSecurityConfigResourceId() {
1133         return networkSecurityConfigRes;
1134     }
1135 
1136     @Nullable
1137     @Override
getNonLocalizedLabel()1138     public CharSequence getNonLocalizedLabel() {
1139         return nonLocalizedLabel;
1140     }
1141 
1142     @NonNull
1143     @Override
getOriginalPackages()1144     public List<String> getOriginalPackages() {
1145         return originalPackages;
1146     }
1147 
1148     @Nullable
1149     @Override
getOverlayCategory()1150     public String getOverlayCategory() {
1151         return overlayCategory;
1152     }
1153 
1154     @Override
getOverlayPriority()1155     public int getOverlayPriority() {
1156         return overlayPriority;
1157     }
1158 
1159     @Nullable
1160     @Override
getOverlayTarget()1161     public String getOverlayTarget() {
1162         return overlayTarget;
1163     }
1164 
1165     @Nullable
1166     @Override
getOverlayTargetOverlayableName()1167     public String getOverlayTargetOverlayableName() {
1168         return overlayTargetOverlayableName;
1169     }
1170 
1171     @NonNull
1172     @Override
getOverlayables()1173     public Map<String,String> getOverlayables() {
1174         return overlayables;
1175     }
1176 
1177     @NonNull
1178     @Override
getPackageName()1179     public String getPackageName() {
1180         return packageName;
1181     }
1182 
1183     @NonNull
1184     @Override
getPath()1185     public String getPath() {
1186         return mPath;
1187     }
1188 
1189     @Nullable
1190     @Override
getPermission()1191     public String getPermission() {
1192         return permission;
1193     }
1194 
1195     @NonNull
1196     @Override
getPermissionGroups()1197     public List<ParsedPermissionGroup> getPermissionGroups() {
1198         return permissionGroups;
1199     }
1200 
1201     @NonNull
1202     @Override
getPermissions()1203     public List<ParsedPermission> getPermissions() {
1204         return permissions;
1205     }
1206 
1207     @NonNull
1208     @Override
getPreferredActivityFilters()1209     public List<Pair<String,ParsedIntentInfo>> getPreferredActivityFilters() {
1210         return preferredActivityFilters;
1211     }
1212 
1213     @NonNull
1214     @Override
getProcessName()1215     public String getProcessName() {
1216         return processName != null ? processName : packageName;
1217     }
1218 
1219     @NonNull
1220     @Override
getProcesses()1221     public Map<String,ParsedProcess> getProcesses() {
1222         return processes;
1223     }
1224 
1225     @NonNull
1226     @Override
getProperties()1227     public Map<String, PackageManager.Property> getProperties() {
1228         return mProperties;
1229     }
1230 
1231     @NonNull
1232     @Override
getProtectedBroadcasts()1233     public List<String> getProtectedBroadcasts() {
1234         return protectedBroadcasts;
1235     }
1236 
1237     @NonNull
1238     @Override
getProviders()1239     public List<ParsedProvider> getProviders() {
1240         return providers;
1241     }
1242 
1243     @NonNull
1244     @Override
getQueriesIntents()1245     public List<Intent> getQueriesIntents() {
1246         return queriesIntents;
1247     }
1248 
1249     @NonNull
1250     @Override
getQueriesPackages()1251     public List<String> getQueriesPackages() {
1252         return queriesPackages;
1253     }
1254 
1255     @NonNull
1256     @Override
getQueriesProviders()1257     public Set<String> getQueriesProviders() {
1258         return queriesProviders;
1259     }
1260 
1261     @NonNull
1262     @Override
getReceivers()1263     public List<ParsedActivity> getReceivers() {
1264         return receivers;
1265     }
1266 
1267     @NonNull
1268     @Override
getRequestedFeatures()1269     public List<FeatureInfo> getRequestedFeatures() {
1270         return reqFeatures;
1271     }
1272 
1273     /**
1274      * @deprecated consider migrating to {@link #getUsesPermissions} which has
1275      *             more parsed details, such as flags
1276      */
1277     @NonNull
1278     @Override
1279     @Deprecated
getRequestedPermissions()1280     public Set<String> getRequestedPermissions() {
1281         return requestedPermissions;
1282     }
1283 
1284     @Nullable
1285     @Override
getRequiredAccountType()1286     public String getRequiredAccountType() {
1287         return requiredAccountType;
1288     }
1289 
1290     @Override
getRequiresSmallestWidthDp()1291     public int getRequiresSmallestWidthDp() {
1292         return requiresSmallestWidthDp;
1293     }
1294 
1295     @Nullable
1296     @Override
getResizeableActivity()1297     public Boolean getResizeableActivity() {
1298         return resizeableActivity;
1299     }
1300 
1301     @Nullable
1302     @Override
getRestrictUpdateHash()1303     public byte[] getRestrictUpdateHash() {
1304         return restrictUpdateHash;
1305     }
1306 
1307     @Nullable
1308     @Override
getRestrictedAccountType()1309     public String getRestrictedAccountType() {
1310         return restrictedAccountType;
1311     }
1312 
1313     @Nullable
1314     @Override
getEmergencyInstaller()1315     public String getEmergencyInstaller() {
1316         return mEmergencyInstaller;
1317     }
1318 
1319     @Override
getRoundIconResourceId()1320     public int getRoundIconResourceId() {
1321         return roundIconRes;
1322     }
1323 
1324     @Nullable
1325     @Override
getSdkLibraryName()1326     public String getSdkLibraryName() {
1327         return sdkLibraryName;
1328     }
1329 
1330     @Override
getSdkLibVersionMajor()1331     public int getSdkLibVersionMajor() {
1332         return sdkLibVersionMajor;
1333     }
1334 
1335     @NonNull
1336     @Override
getServices()1337     public List<ParsedService> getServices() {
1338         return services;
1339     }
1340 
1341     @Nullable
1342     @Override
getSharedUserId()1343     public String getSharedUserId() {
1344         return sharedUserId;
1345     }
1346 
1347     @Override
getSharedUserLabelResourceId()1348     public int getSharedUserLabelResourceId() {
1349         return sharedUserLabel;
1350     }
1351 
1352     @NonNull
1353     @Override
getSigningDetails()1354     public SigningDetails getSigningDetails() {
1355         return signingDetails;
1356     }
1357 
1358     @NonNull
1359     @Override
getSplitClassLoaderNames()1360     public String[] getSplitClassLoaderNames() {
1361         return splitClassLoaderNames == null ? EmptyArray.STRING : splitClassLoaderNames;
1362     }
1363 
1364     @NonNull
1365     @Override
getSplitCodePaths()1366     public String[] getSplitCodePaths() {
1367         return splitCodePaths == null ? EmptyArray.STRING : splitCodePaths;
1368     }
1369 
1370     @Nullable
1371     @Override
getSplitDependencies()1372     public SparseArray<int[]> getSplitDependencies() {
1373         return splitDependencies == null ? EMPTY_INT_ARRAY_SPARSE_ARRAY : splitDependencies;
1374     }
1375 
1376     @Nullable
1377     @Override
getSplitFlags()1378     public int[] getSplitFlags() {
1379         return splitFlags;
1380     }
1381 
1382     @NonNull
1383     @Override
getSplitNames()1384     public String[] getSplitNames() {
1385         return splitNames == null ? EmptyArray.STRING : splitNames;
1386     }
1387 
1388     @NonNull
1389     @Override
getSplitRevisionCodes()1390     public int[] getSplitRevisionCodes() {
1391         return splitRevisionCodes == null ? EmptyArray.INT : splitRevisionCodes;
1392     }
1393 
1394     @Nullable
1395     @Override
getStaticSharedLibraryName()1396     public String getStaticSharedLibraryName() {
1397         return staticSharedLibraryName;
1398     }
1399 
1400     @Override
getStaticSharedLibraryVersion()1401     public long getStaticSharedLibraryVersion() {
1402         return staticSharedLibVersion;
1403     }
1404 
1405     @Override
getStorageUuid()1406     public UUID getStorageUuid() {
1407         return mStorageUuid;
1408     }
1409 
1410     @Override
getTargetSandboxVersion()1411     public int getTargetSandboxVersion() {
1412         return targetSandboxVersion;
1413     }
1414 
1415     @Override
getTargetSdkVersion()1416     public int getTargetSdkVersion() {
1417         return targetSdkVersion;
1418     }
1419 
1420     @Nullable
1421     @Override
getTaskAffinity()1422     public String getTaskAffinity() {
1423         return taskAffinity;
1424     }
1425 
1426     @Override
getThemeResourceId()1427     public int getThemeResourceId() {
1428         return theme;
1429     }
1430 
1431     @Override
getUiOptions()1432     public int getUiOptions() {
1433         return uiOptions;
1434     }
1435 
1436     @NonNull
1437     @Override
getUpgradeKeySets()1438     public Set<String> getUpgradeKeySets() {
1439         return upgradeKeySets;
1440     }
1441 
1442     @NonNull
1443     @Override
getUsesLibraries()1444     public List<String> getUsesLibraries() {
1445         return usesLibraries;
1446     }
1447 
1448     @NonNull
1449     @Override
getUsesLibrariesSorted()1450     public String[] getUsesLibrariesSorted() {
1451         if (mUsesLibrariesSorted == null) {
1452             // Note lazy-sorting here doesn't break immutability because it always
1453             // return the same content. In the case of multi-threading, data race in accessing
1454             // mUsesLibrariesSorted might result in unnecessary creation of sorted copies
1455             // which is OK because the case is quite rare.
1456             mUsesLibrariesSorted = sortLibraries(usesLibraries);
1457         }
1458         return mUsesLibrariesSorted;
1459     }
1460 
1461     @NonNull
1462     @Override
getUsesNativeLibraries()1463     public List<String> getUsesNativeLibraries() {
1464         return usesNativeLibraries;
1465     }
1466 
1467     @NonNull
1468     @Override
getUsesOptionalLibraries()1469     public List<String> getUsesOptionalLibraries() {
1470         return usesOptionalLibraries;
1471     }
1472 
1473     @NonNull
1474     @Override
getUsesOptionalLibrariesSorted()1475     public String[] getUsesOptionalLibrariesSorted() {
1476         if (mUsesOptionalLibrariesSorted == null) {
1477             mUsesOptionalLibrariesSorted = sortLibraries(usesOptionalLibraries);
1478         }
1479         return mUsesOptionalLibrariesSorted;
1480     }
1481 
1482     @NonNull
1483     @Override
getUsesOptionalNativeLibraries()1484     public List<String> getUsesOptionalNativeLibraries() {
1485         return usesOptionalNativeLibraries;
1486     }
1487 
1488     @NonNull
1489     @Override
getUsesPermissions()1490     public List<ParsedUsesPermission> getUsesPermissions() {
1491         return usesPermissions;
1492     }
1493 
1494     @NonNull
1495     @Override
getUsesSdkLibraries()1496     public List<String> getUsesSdkLibraries() { return usesSdkLibraries; }
1497 
1498     @NonNull
1499     @Override
getUsesSdkLibrariesSorted()1500     public String[] getUsesSdkLibrariesSorted() {
1501         if (mUsesSdkLibrariesSorted == null) {
1502             mUsesSdkLibrariesSorted = sortLibraries(usesSdkLibraries);
1503         }
1504         return mUsesSdkLibrariesSorted;
1505     }
1506 
1507     @Nullable
1508     @Override
getUsesSdkLibrariesCertDigests()1509     public String[][] getUsesSdkLibrariesCertDigests() { return usesSdkLibrariesCertDigests; }
1510 
1511     @Nullable
1512     @Override
getUsesSdkLibrariesVersionsMajor()1513     public long[] getUsesSdkLibrariesVersionsMajor() { return usesSdkLibrariesVersionsMajor; }
1514 
1515     @Nullable
1516     @Override
getUsesSdkLibrariesOptional()1517     public boolean[] getUsesSdkLibrariesOptional() {
1518         return usesSdkLibrariesOptional;
1519     }
1520 
1521     @NonNull
1522     @Override
getUsesStaticLibraries()1523     public List<String> getUsesStaticLibraries() {
1524         return usesStaticLibraries;
1525     }
1526 
1527     @NonNull
1528     @Override
getUsesStaticLibrariesSorted()1529     public String[] getUsesStaticLibrariesSorted() {
1530         if (mUsesStaticLibrariesSorted == null) {
1531             mUsesStaticLibrariesSorted = sortLibraries(usesStaticLibraries);
1532         }
1533         return mUsesStaticLibrariesSorted;
1534     }
1535 
1536     @Nullable
1537     @Override
getUsesStaticLibrariesCertDigests()1538     public String[][] getUsesStaticLibrariesCertDigests() {
1539         return usesStaticLibrariesCertDigests;
1540     }
1541 
1542     @Nullable
1543     @Override
getUsesStaticLibrariesVersions()1544     public long[] getUsesStaticLibrariesVersions() {
1545         return usesStaticLibrariesVersions;
1546     }
1547 
1548     @Override
getVersionCode()1549     public int getVersionCode() {
1550         return versionCode;
1551     }
1552 
1553     @Override
getVersionCodeMajor()1554     public int getVersionCodeMajor() {
1555         return versionCodeMajor;
1556     }
1557 
1558     @Nullable
1559     @Override
getVersionName()1560     public String getVersionName() {
1561         return versionName;
1562     }
1563 
1564     @Nullable
1565     @Override
getVolumeUuid()1566     public String getVolumeUuid() {
1567         return volumeUuid;
1568     }
1569 
1570     @Nullable
1571     @Override
getZygotePreloadName()1572     public String getZygotePreloadName() {
1573         return zygotePreloadName;
1574     }
1575 
1576     @Override
isAllowCrossUidActivitySwitchFromBelow()1577     public boolean isAllowCrossUidActivitySwitchFromBelow() {
1578         return mAllowCrossUidActivitySwitchFromBelow;
1579     }
1580 
1581     @Override
hasPreserveLegacyExternalStorage()1582     public boolean hasPreserveLegacyExternalStorage() {
1583         return getBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE);
1584     }
1585 
1586     @Override
hasRequestForegroundServiceExemption()1587     public boolean hasRequestForegroundServiceExemption() {
1588         return getBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION);
1589     }
1590 
1591     @Nullable
1592     @Override
hasRequestRawExternalStorageAccess()1593     public Boolean hasRequestRawExternalStorageAccess() {
1594         return requestRawExternalStorageAccess;
1595     }
1596 
1597     @Override
isAllowAudioPlaybackCapture()1598     public boolean isAllowAudioPlaybackCapture() {
1599         return getBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE);
1600     }
1601 
1602     @Override
isBackupAllowed()1603     public boolean isBackupAllowed() {
1604         return getBoolean(Booleans.ALLOW_BACKUP);
1605     }
1606 
1607     @Override
isClearUserDataAllowed()1608     public boolean isClearUserDataAllowed() {
1609         return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA);
1610     }
1611 
1612     @Override
isClearUserDataOnFailedRestoreAllowed()1613     public boolean isClearUserDataOnFailedRestoreAllowed() {
1614         return getBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE);
1615     }
1616 
1617     @Override
isAllowNativeHeapPointerTagging()1618     public boolean isAllowNativeHeapPointerTagging() {
1619         return getBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING);
1620     }
1621 
1622     @Override
isTaskReparentingAllowed()1623     public boolean isTaskReparentingAllowed() {
1624         return getBoolean(Booleans.ALLOW_TASK_REPARENTING);
1625     }
1626 
isAnyDensity()1627     public boolean isAnyDensity() {
1628         if (anyDensity == null) {
1629             return targetSdkVersion >= Build.VERSION_CODES.DONUT;
1630         }
1631 
1632         return anyDensity;
1633     }
1634 
1635     @Override
isBackupInForeground()1636     public boolean isBackupInForeground() {
1637         return getBoolean(Booleans.BACKUP_IN_FOREGROUND);
1638     }
1639 
1640     @Override
isHardwareAccelerated()1641     public boolean isHardwareAccelerated() {
1642         return getBoolean(Booleans.HARDWARE_ACCELERATED);
1643     }
1644 
1645     @Override
isSaveStateDisallowed()1646     public boolean isSaveStateDisallowed() {
1647         return getBoolean(Booleans.CANT_SAVE_STATE);
1648     }
1649 
1650     @Override
isCrossProfile()1651     public boolean isCrossProfile() {
1652         return getBoolean(Booleans.CROSS_PROFILE);
1653     }
1654 
1655     @Override
isDebuggable()1656     public boolean isDebuggable() {
1657         return getBoolean(Booleans.DEBUGGABLE);
1658     }
1659 
1660     @Override
isDefaultToDeviceProtectedStorage()1661     public boolean isDefaultToDeviceProtectedStorage() {
1662         return getBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE);
1663     }
1664 
1665     @Override
isDirectBootAware()1666     public boolean isDirectBootAware() {
1667         return getBoolean(Booleans.DIRECT_BOOT_AWARE);
1668     }
1669 
1670     @Override
isEnabled()1671     public boolean isEnabled() {
1672         return getBoolean(Booleans.ENABLED);
1673     }
1674 
1675     @Override
isExternalStorage()1676     public boolean isExternalStorage() {
1677         return getBoolean(Booleans.EXTERNAL_STORAGE);
1678     }
1679 
1680     @Override
isExtractNativeLibrariesRequested()1681     public boolean isExtractNativeLibrariesRequested() {
1682         return getBoolean(Booleans.EXTRACT_NATIVE_LIBS);
1683     }
1684 
1685     @Override
isForceQueryable()1686     public boolean isForceQueryable() {
1687         return getBoolean(Booleans.FORCE_QUERYABLE);
1688     }
1689 
1690     @Override
isFullBackupOnly()1691     public boolean isFullBackupOnly() {
1692         return getBoolean(Booleans.FULL_BACKUP_ONLY);
1693     }
1694 
1695     @Override
isGame()1696     public boolean isGame() {
1697         return getBoolean(Booleans.GAME);
1698     }
1699 
1700     @Override
isDeclaredHavingCode()1701     public boolean isDeclaredHavingCode() {
1702         return getBoolean(Booleans.HAS_CODE);
1703     }
1704 
1705     @Override
isHasDomainUrls()1706     public boolean isHasDomainUrls() {
1707         return getBoolean(Booleans.HAS_DOMAIN_URLS);
1708     }
1709 
1710     @Override
isUserDataFragile()1711     public boolean isUserDataFragile() {
1712         return getBoolean(Booleans.HAS_FRAGILE_USER_DATA);
1713     }
1714 
1715     @Override
isIsolatedSplitLoading()1716     public boolean isIsolatedSplitLoading() {
1717         return getBoolean(Booleans.ISOLATED_SPLIT_LOADING);
1718     }
1719 
1720     @Override
isKillAfterRestoreAllowed()1721     public boolean isKillAfterRestoreAllowed() {
1722         return getBoolean(Booleans.KILL_AFTER_RESTORE);
1723     }
1724 
1725     @Override
isLargeHeap()1726     public boolean isLargeHeap() {
1727         return getBoolean(Booleans.LARGE_HEAP);
1728     }
1729 
1730     @Override
isLeavingSharedUser()1731     public boolean isLeavingSharedUser() {
1732         return getBoolean(Booleans.LEAVING_SHARED_UID);
1733     }
1734 
1735     @Override
isMultiArch()1736     public boolean isMultiArch() {
1737         return getBoolean(Booleans.MULTI_ARCH);
1738     }
1739 
1740     @Override
isOnBackInvokedCallbackEnabled()1741     public boolean isOnBackInvokedCallbackEnabled() {
1742         return getBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK);
1743     }
1744 
1745     @Override
isResourceOverlay()1746     public boolean isResourceOverlay() {
1747         return getBoolean(Booleans.OVERLAY);
1748     }
1749 
1750     @Override
isOverlayIsStatic()1751     public boolean isOverlayIsStatic() {
1752         return getBoolean(Booleans.OVERLAY_IS_STATIC);
1753     }
1754 
1755     @Override
isPartiallyDirectBootAware()1756     public boolean isPartiallyDirectBootAware() {
1757         return getBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE);
1758     }
1759 
1760     @Override
isPersistent()1761     public boolean isPersistent() {
1762         return getBoolean(Booleans.PERSISTENT);
1763     }
1764 
1765     @Override
isProfileable()1766     public boolean isProfileable() {
1767         return !getBoolean(Booleans.DISALLOW_PROFILING);
1768     }
1769 
1770     @Override
isProfileableByShell()1771     public boolean isProfileableByShell() {
1772         return isProfileable() && getBoolean(Booleans.PROFILEABLE_BY_SHELL);
1773     }
1774 
1775     @Override
isRequestLegacyExternalStorage()1776     public boolean isRequestLegacyExternalStorage() {
1777         return getBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE);
1778     }
1779 
1780     @Override
isRequiredForAllUsers()1781     public boolean isRequiredForAllUsers() {
1782         return getBoolean(Booleans.REQUIRED_FOR_ALL_USERS);
1783     }
1784 
1785     @Override
isResetEnabledSettingsOnAppDataCleared()1786     public boolean isResetEnabledSettingsOnAppDataCleared() {
1787         return getBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED);
1788     }
1789 
isResizeable()1790     public boolean isResizeable() {
1791         if (resizeable == null) {
1792             return targetSdkVersion >= Build.VERSION_CODES.DONUT;
1793         }
1794 
1795         return resizeable;
1796     }
1797 
1798     @Override
isResizeableActivityViaSdkVersion()1799     public boolean isResizeableActivityViaSdkVersion() {
1800         return getBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION);
1801     }
1802 
1803     @Override
isRestoreAnyVersion()1804     public boolean isRestoreAnyVersion() {
1805         return getBoolean(Booleans.RESTORE_ANY_VERSION);
1806     }
1807 
1808     @Override
isSdkLibrary()1809     public boolean isSdkLibrary() {
1810         return getBoolean(Booleans.SDK_LIBRARY);
1811     }
1812 
1813     @Override
isStaticSharedLibrary()1814     public boolean isStaticSharedLibrary() {
1815         return getBoolean(Booleans.STATIC_SHARED_LIBRARY);
1816     }
1817 
isExtraLargeScreensSupported()1818     public boolean isExtraLargeScreensSupported() {
1819         if (supportsExtraLargeScreens == null) {
1820             return targetSdkVersion >= Build.VERSION_CODES.GINGERBREAD;
1821         }
1822 
1823         return supportsExtraLargeScreens;
1824     }
1825 
isLargeScreensSupported()1826     public boolean isLargeScreensSupported() {
1827         if (supportsLargeScreens == null) {
1828             return targetSdkVersion >= Build.VERSION_CODES.DONUT;
1829         }
1830 
1831         return supportsLargeScreens;
1832     }
1833 
isNormalScreensSupported()1834     public boolean isNormalScreensSupported() {
1835         return supportsNormalScreens == null || supportsNormalScreens;
1836     }
1837 
1838     @Override
isRtlSupported()1839     public boolean isRtlSupported() {
1840         return getBoolean(Booleans.SUPPORTS_RTL);
1841     }
1842 
isSmallScreensSupported()1843     public boolean isSmallScreensSupported() {
1844         if (supportsSmallScreens == null) {
1845             return targetSdkVersion >= Build.VERSION_CODES.DONUT;
1846         }
1847 
1848         return supportsSmallScreens;
1849     }
1850 
1851     @Override
isTestOnly()1852     public boolean isTestOnly() {
1853         return getBoolean(Booleans.TEST_ONLY);
1854     }
1855 
1856     @Override
is32BitAbiPreferred()1857     public boolean is32BitAbiPreferred() {
1858         return getBoolean(Booleans.USE_32_BIT_ABI);
1859     }
1860 
1861     @Override
isUseEmbeddedDex()1862     public boolean isUseEmbeddedDex() {
1863         return getBoolean(Booleans.USE_EMBEDDED_DEX);
1864     }
1865 
1866     @Override
isCleartextTrafficAllowed()1867     public boolean isCleartextTrafficAllowed() {
1868         return getBoolean(Booleans.USES_CLEARTEXT_TRAFFIC);
1869     }
1870 
1871     @Override
isNonSdkApiRequested()1872     public boolean isNonSdkApiRequested() {
1873         return getBoolean(Booleans.USES_NON_SDK_API);
1874     }
1875 
1876     @Override
isVisibleToInstantApps()1877     public boolean isVisibleToInstantApps() {
1878         return getBoolean(Booleans.VISIBLE_TO_INSTANT_APPS);
1879     }
1880 
1881     @Override
isVmSafeMode()1882     public boolean isVmSafeMode() {
1883         return getBoolean(Booleans.VM_SAFE_MODE);
1884     }
1885 
removeUsesOptionalNativeLibrary(String libraryName)1886     @Override public PackageImpl removeUsesOptionalNativeLibrary(String libraryName) {
1887         this.usesOptionalNativeLibraries = CollectionUtils.remove(this.usesOptionalNativeLibraries,
1888                 libraryName);
1889         return this;
1890     }
1891 
1892     @Override
setAllowAudioPlaybackCapture(boolean value)1893     public PackageImpl setAllowAudioPlaybackCapture(boolean value) {
1894         return setBoolean(Booleans.ALLOW_AUDIO_PLAYBACK_CAPTURE, value);
1895     }
1896 
1897     @Override
setBackupAllowed(boolean value)1898     public PackageImpl setBackupAllowed(boolean value) {
1899         return setBoolean(Booleans.ALLOW_BACKUP, value);
1900     }
1901 
1902     @Override
setClearUserDataAllowed(boolean value)1903     public PackageImpl setClearUserDataAllowed(boolean value) {
1904         return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA, value);
1905     }
1906 
1907     @Override
setClearUserDataOnFailedRestoreAllowed(boolean value)1908     public PackageImpl setClearUserDataOnFailedRestoreAllowed(boolean value) {
1909         return setBoolean(Booleans.ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE, value);
1910     }
1911 
1912     @Override
setAllowNativeHeapPointerTagging(boolean value)1913     public PackageImpl setAllowNativeHeapPointerTagging(boolean value) {
1914         return setBoolean(Booleans.ALLOW_NATIVE_HEAP_POINTER_TAGGING, value);
1915     }
1916 
1917     @Override
setAlternateLauncherIconResIds(@ullable int[] alternateLauncherIconResIds)1918     public PackageImpl setAlternateLauncherIconResIds(@Nullable int[] alternateLauncherIconResIds) {
1919         this.mAlternateLauncherIconResIds = alternateLauncherIconResIds;
1920         return this;
1921     }
1922 
1923     @Override
setAlternateLauncherLabelResIds( @ullable int[] alternateLauncherLabelResIds)1924     public PackageImpl setAlternateLauncherLabelResIds(
1925             @Nullable int[] alternateLauncherLabelResIds) {
1926         this.mAlternateLauncherLabelResIds = alternateLauncherLabelResIds;
1927         return this;
1928     }
1929 
1930     @Override
setTaskReparentingAllowed(boolean value)1931     public PackageImpl setTaskReparentingAllowed(boolean value) {
1932         return setBoolean(Booleans.ALLOW_TASK_REPARENTING, value);
1933     }
1934 
1935     @Override
setAnyDensity(int anyDensity)1936     public PackageImpl setAnyDensity(int anyDensity) {
1937         if (anyDensity == 1) {
1938             return this;
1939         }
1940 
1941         this.anyDensity = anyDensity < 0;
1942         return this;
1943     }
1944 
1945     @Override
1946     public PackageImpl setAppComponentFactory(@Nullable String appComponentFactory) {
1947         this.appComponentFactory = appComponentFactory;
1948         return this;
1949     }
1950 
1951     @Override
1952     public ParsingPackage setAttributionsAreUserVisible(boolean attributionsAreUserVisible) {
1953         setBoolean(Booleans.ATTRIBUTIONS_ARE_USER_VISIBLE, attributionsAreUserVisible);
1954         return this;
1955     }
1956 
1957     @Override
1958     public PackageImpl setAutoRevokePermissions(int value) {
1959         autoRevokePermissions = value;
1960         return this;
1961     }
1962 
1963     @Override
1964     public PackageImpl setBackupAgentName(@Nullable String backupAgentName) {
1965         this.backupAgentName = backupAgentName;
1966         return this;
1967     }
1968 
1969     @Override
1970     public PackageImpl setBackupInForeground(boolean value) {
1971         return setBoolean(Booleans.BACKUP_IN_FOREGROUND, value);
1972     }
1973 
1974     @Override
1975     public PackageImpl setBannerResourceId(int value) {
1976         banner = value;
1977         return this;
1978     }
1979 
1980     @Override
1981     public PackageImpl setHardwareAccelerated(boolean value) {
1982         return setBoolean(Booleans.HARDWARE_ACCELERATED, value);
1983     }
1984 
1985     @Override
1986     public PackageImpl setBaseRevisionCode(int value) {
1987         baseRevisionCode = value;
1988         return this;
1989     }
1990 
1991     @Override
1992     public PackageImpl setSaveStateDisallowed(boolean value) {
1993         return setBoolean(Booleans.CANT_SAVE_STATE, value);
1994     }
1995 
1996     @Override
1997     public PackageImpl setCategory(int value) {
1998         category = value;
1999         return this;
2000     }
2001 
2002     @Override
2003     public PackageImpl setClassLoaderName(@Nullable String classLoaderName) {
2004         this.classLoaderName = classLoaderName;
2005         return this;
2006     }
2007 
2008     @Override
2009     public PackageImpl setApplicationClassName(@Nullable String className) {
2010         this.className = className == null ? null : className.trim();
2011         return this;
2012     }
2013 
2014     @Override
2015     public PackageImpl setCompatibleWidthLimitDp(int value) {
2016         compatibleWidthLimitDp = value;
2017         return this;
2018     }
2019 
2020     @Override
2021     public PackageImpl setCompileSdkVersion(int value) {
2022         compileSdkVersion = value;
2023         return this;
2024     }
2025 
2026     @Override
2027     public ParsingPackage setCompileSdkVersionCodeName(String compileSdkVersionCodeName) {
2028         this.compileSdkVersionCodeName = compileSdkVersionCodeName;
2029         return this;
2030     }
2031 
2032     @Override
2033     public PackageImpl setCrossProfile(boolean value) {
2034         return setBoolean(Booleans.CROSS_PROFILE, value);
2035     }
2036 
2037     @Override
2038     public PackageImpl setDataExtractionRulesResourceId(int value) {
2039         dataExtractionRules = value;
2040         return this;
2041     }
2042 
2043     @Override
2044     public PackageImpl setDebuggable(boolean value) {
2045         return setBoolean(Booleans.DEBUGGABLE, value);
2046     }
2047 
2048     @Override
2049     public PackageImpl setDescriptionResourceId(int value) {
2050         descriptionRes = value;
2051         return this;
2052     }
2053 
2054     @Override
2055     public PackageImpl setEnabled(boolean value) {
2056         return setBoolean(Booleans.ENABLED, value);
2057     }
2058 
2059     @Override
2060     public PackageImpl setExternalStorage(boolean value) {
2061         return setBoolean(Booleans.EXTERNAL_STORAGE, value);
2062     }
2063 
2064     @Override
2065     public PackageImpl setExtractNativeLibrariesRequested(boolean value) {
2066         return setBoolean(Booleans.EXTRACT_NATIVE_LIBS, value);
2067     }
2068 
2069     @Override
2070     public PackageImpl setForceQueryable(boolean value) {
2071         return setBoolean(Booleans.FORCE_QUERYABLE, value);
2072     }
2073 
2074     @Override
2075     public PackageImpl setFullBackupContentResourceId(int value) {
2076         fullBackupContent = value;
2077         return this;
2078     }
2079 
2080     @Override
2081     public PackageImpl setFullBackupOnly(boolean value) {
2082         return setBoolean(Booleans.FULL_BACKUP_ONLY, value);
2083     }
2084 
2085     @Override
2086     public PackageImpl setGame(boolean value) {
2087         return setBoolean(Booleans.GAME, value);
2088     }
2089 
2090     @Override
2091     public PackageImpl setGwpAsanMode(@ApplicationInfo.GwpAsanMode int value) {
2092         gwpAsanMode = value;
2093         return this;
2094     }
2095 
2096     @Override
2097     public PackageImpl setDeclaredHavingCode(boolean value) {
2098         return setBoolean(Booleans.HAS_CODE, value);
2099     }
2100 
2101     @Override
2102     public PackageImpl setHasDomainUrls(boolean value) {
2103         return setBoolean(Booleans.HAS_DOMAIN_URLS, value);
2104     }
2105 
2106     @Override
2107     public PackageImpl setUserDataFragile(boolean value) {
2108         return setBoolean(Booleans.HAS_FRAGILE_USER_DATA, value);
2109     }
2110 
2111     @Override
2112     public PackageImpl setIconResourceId(int value) {
2113         iconRes = value;
2114         return this;
2115     }
2116 
2117     @Override
2118     public PackageImpl setInstallLocation(int value) {
2119         installLocation = value;
2120         return this;
2121     }
2122 
2123     @Override
2124     public PackageImpl setIsolatedSplitLoading(boolean value) {
2125         return setBoolean(Booleans.ISOLATED_SPLIT_LOADING, value);
2126     }
2127 
2128     @Override
2129     public PackageImpl setKillAfterRestoreAllowed(boolean value) {
2130         return setBoolean(Booleans.KILL_AFTER_RESTORE, value);
2131     }
2132 
2133     @Override
2134     public ParsingPackage setKnownActivityEmbeddingCerts(@NonNull Set<String> knownEmbeddingCerts) {
2135         mKnownActivityEmbeddingCerts = knownEmbeddingCerts;
2136         return this;
2137     }
2138 
2139     @Override
2140     public PackageImpl setLabelResourceId(int value) {
2141         labelRes = value;
2142         return this;
2143     }
2144 
2145     @Override
2146     public PackageImpl setLargeHeap(boolean value) {
2147         return setBoolean(Booleans.LARGE_HEAP, value);
2148     }
2149 
2150     @Override
2151     public PackageImpl setLargestWidthLimitDp(int value) {
2152         largestWidthLimitDp = value;
2153         return this;
2154     }
2155 
2156     @Override
2157     public PackageImpl setLeavingSharedUser(boolean value) {
2158         return setBoolean(Booleans.LEAVING_SHARED_UID, value);
2159     }
2160 
2161     @Override
2162     public PackageImpl setLocaleConfigResourceId(int value) {
2163         mLocaleConfigRes = value;
2164         return this;
2165     }
2166 
2167     @Override
2168     public PackageImpl setLogoResourceId(int value) {
2169         logo = value;
2170         return this;
2171     }
2172 
2173     @Override
2174     public PackageImpl setManageSpaceActivityName(@Nullable String manageSpaceActivityName) {
2175         this.manageSpaceActivityName = manageSpaceActivityName;
2176         return this;
2177     }
2178 
2179     @Override
2180     public PackageImpl setMaxAspectRatio(float value) {
2181         maxAspectRatio = value;
2182         return this;
2183     }
2184 
2185     @Override
2186     public PackageImpl setMaxSdkVersion(int value) {
2187         maxSdkVersion = value;
2188         return this;
2189     }
2190 
2191     @Override
2192     public PackageImpl setMemtagMode(@ApplicationInfo.MemtagMode int value) {
2193         memtagMode = value;
2194         return this;
2195     }
2196 
2197     @Override
2198     public PackageImpl setMetaData(@Nullable Bundle value) {
2199         metaData = value;
2200         return this;
2201     }
2202 
2203     @Override
2204     public PackageImpl setMinAspectRatio(float value) {
2205         minAspectRatio = value;
2206         return this;
2207     }
2208 
2209     @Override
2210     public PackageImpl setMinExtensionVersions(@Nullable SparseIntArray value) {
2211         minExtensionVersions = value;
2212         return this;
2213     }
2214 
2215     @Override
2216     public PackageImpl setMinSdkVersion(int value) {
2217         minSdkVersion = value;
2218         return this;
2219     }
2220 
2221     @Override
2222     public PackageImpl setMultiArch(boolean value) {
2223         return setBoolean(Booleans.MULTI_ARCH, value);
2224     }
2225 
2226     @Override
2227     public PackageImpl setNativeHeapZeroInitialized(
2228             @ApplicationInfo.NativeHeapZeroInitialized int value) {
2229         nativeHeapZeroInitialized = value;
2230         return this;
2231     }
2232 
2233     @Override
2234     public PackageImpl setPageSizeAppCompatFlags(@ApplicationInfo.PageSizeAppCompatFlags int flag) {
2235         mPageSizeAppCompatFlags = flag;
2236         return this;
2237     }
2238 
2239     @Override
2240     public PackageImpl setNetworkSecurityConfigResourceId(int value) {
2241         networkSecurityConfigRes = value;
2242         return this;
2243     }
2244 
2245     @Override
2246     public PackageImpl setNonLocalizedLabel(@Nullable CharSequence value) {
2247         nonLocalizedLabel = value == null ? null : value.toString().trim();
2248         return this;
2249     }
2250 
2251     @Override
2252     public ParsingPackage setOnBackInvokedCallbackEnabled(boolean value) {
2253         setBoolean(Booleans.ENABLE_ON_BACK_INVOKED_CALLBACK, value);
2254         return this;
2255     }
2256 
2257     @Override
2258     public ParsingPackage setAllowCrossUidActivitySwitchFromBelow(boolean value) {
2259         mAllowCrossUidActivitySwitchFromBelow = value;
2260         return this;
2261     }
2262 
2263     @Override
2264     public PackageImpl setResourceOverlay(boolean value) {
2265         return setBoolean(Booleans.OVERLAY, value);
2266     }
2267 
2268     @Override
2269     public PackageImpl setOverlayCategory(@Nullable String overlayCategory) {
2270         this.overlayCategory = overlayCategory;
2271         return this;
2272     }
2273 
2274     @Override
2275     public PackageImpl setOverlayIsStatic(boolean value) {
2276         return setBoolean(Booleans.OVERLAY_IS_STATIC, value);
2277     }
2278 
2279     @Override
2280     public PackageImpl setOverlayPriority(int value) {
2281         overlayPriority = value;
2282         return this;
2283     }
2284 
2285     @Override
2286     public PackageImpl setOverlayTarget(@Nullable String overlayTarget) {
2287         this.overlayTarget = TextUtils.safeIntern(overlayTarget);
2288         return this;
2289     }
2290 
2291     @Override
2292     public PackageImpl setOverlayTargetOverlayableName(
2293             @Nullable String overlayTargetOverlayableName) {
2294         this.overlayTargetOverlayableName = overlayTargetOverlayableName;
2295         return this;
2296     }
2297 
2298     @Override
2299     public PackageImpl setPartiallyDirectBootAware(boolean value) {
2300         return setBoolean(Booleans.PARTIALLY_DIRECT_BOOT_AWARE, value);
2301     }
2302 
2303     @Override
2304     public PackageImpl setPermission(@Nullable String permission) {
2305         this.permission = permission;
2306         return this;
2307     }
2308 
2309     @Override
2310     public PackageImpl setPreserveLegacyExternalStorage(boolean value) {
2311         return setBoolean(Booleans.PRESERVE_LEGACY_EXTERNAL_STORAGE, value);
2312     }
2313 
2314     @Override
2315     public PackageImpl setProcessName(String processName) {
2316         this.processName = processName;
2317         return this;
2318     }
2319 
2320     @Override
2321     public PackageImpl setProcesses(@NonNull Map<String,ParsedProcess> value) {
2322         processes = value;
2323         return this;
2324     }
2325 
2326     @Override
2327     public PackageImpl setProfileable(boolean value) {
2328         return setBoolean(Booleans.DISALLOW_PROFILING, !value);
2329     }
2330 
2331     @Override
2332     public PackageImpl setProfileableByShell(boolean value) {
2333         return setBoolean(Booleans.PROFILEABLE_BY_SHELL, value);
2334     }
2335 
2336     @Override
2337     public PackageImpl setRequestForegroundServiceExemption(boolean value) {
2338         return setBoolean(Booleans.REQUEST_FOREGROUND_SERVICE_EXEMPTION, value);
2339     }
2340 
2341     @Override
2342     public PackageImpl setRequestLegacyExternalStorage(boolean value) {
2343         return setBoolean(Booleans.REQUEST_LEGACY_EXTERNAL_STORAGE, value);
2344     }
2345 
2346     @Override
2347     public PackageImpl setRequestRawExternalStorageAccess(@Nullable Boolean value) {
2348         requestRawExternalStorageAccess = value;
2349         return this;
2350     }
2351 
2352     @Override
2353     public PackageImpl setRequiredAccountType(@Nullable String requiredAccountType) {
2354         this.requiredAccountType = TextUtils.nullIfEmpty(requiredAccountType);
2355         return this;
2356     }
2357 
2358     @Override
2359     public PackageImpl setRequiredForAllUsers(boolean value) {
2360         return setBoolean(Booleans.REQUIRED_FOR_ALL_USERS, value);
2361     }
2362 
2363     @Override
2364     public PackageImpl setRequiresSmallestWidthDp(int value) {
2365         requiresSmallestWidthDp = value;
2366         return this;
2367     }
2368 
2369     @Override
2370     public ParsingPackage setResetEnabledSettingsOnAppDataCleared(
2371             boolean resetEnabledSettingsOnAppDataCleared) {
2372         setBoolean(Booleans.RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED,
2373                 resetEnabledSettingsOnAppDataCleared);
2374         return this;
2375     }
2376 
2377     @Override
2378     public PackageImpl setResizeable(int resizeable) {
2379         if (resizeable == 1) {
2380             return this;
2381         }
2382 
2383         this.resizeable = resizeable < 0;
2384         return this;
2385     }
2386 
2387     @Override
2388     public PackageImpl setResizeableActivity(@Nullable Boolean value) {
2389         resizeableActivity = value;
2390         return this;
2391     }
2392 
2393     @Override
2394     public PackageImpl setResizeableActivityViaSdkVersion(boolean value) {
2395         return setBoolean(Booleans.RESIZEABLE_ACTIVITY_VIA_SDK_VERSION, value);
2396     }
2397 
2398     @Override
2399     public PackageImpl setRestoreAnyVersion(boolean value) {
2400         return setBoolean(Booleans.RESTORE_ANY_VERSION, value);
2401     }
2402 
2403     @Override
2404     public PackageImpl setRestrictedAccountType(@Nullable String restrictedAccountType) {
2405         this.restrictedAccountType = restrictedAccountType;
2406         return this;
2407     }
2408 
2409     @Override
2410     public PackageImpl setEmergencyInstaller(@Nullable String emergencyInstaller) {
2411         this.mEmergencyInstaller = emergencyInstaller;
2412         return this;
2413     }
2414 
2415     @Override
2416     public PackageImpl setRoundIconResourceId(int value) {
2417         roundIconRes = value;
2418         return this;
2419     }
2420 
2421     @Override
2422     public PackageImpl setSdkLibraryName(String sdkLibraryName) {
2423         this.sdkLibraryName = TextUtils.safeIntern(sdkLibraryName);
2424         return this;
2425     }
2426 
2427     @Override
2428     public PackageImpl setSdkLibVersionMajor(int sdkLibVersionMajor) {
2429         this.sdkLibVersionMajor = sdkLibVersionMajor;
2430         return this;
2431     }
2432 
2433     @Override
2434     public PackageImpl setSdkLibrary(boolean value) {
2435         return setBoolean(Booleans.SDK_LIBRARY, value);
2436     }
2437 
2438     @Override
2439     public PackageImpl setSharedUserId(String sharedUserId) {
2440         this.sharedUserId = TextUtils.safeIntern(sharedUserId);
2441         return this;
2442     }
2443 
2444     @Override
2445     public PackageImpl setSharedUserLabelResourceId(int value) {
2446         sharedUserLabel = value;
2447         return this;
2448     }
2449 
2450     @Override
2451     public PackageImpl setSplitClassLoaderName(int splitIndex, String classLoaderName) {
2452         this.splitClassLoaderNames[splitIndex] = classLoaderName;
2453         return this;
2454     }
2455 
2456     @Override
2457     public PackageImpl setSplitHasCode(int splitIndex, boolean splitHasCode) {
2458         this.splitFlags[splitIndex] = splitHasCode
2459                 ? this.splitFlags[splitIndex] | ApplicationInfo.FLAG_HAS_CODE
2460                 : this.splitFlags[splitIndex] & ~ApplicationInfo.FLAG_HAS_CODE;
2461         return this;
2462     }
2463 
2464     @Override
2465     public PackageImpl setStaticSharedLibraryName(String staticSharedLibraryName) {
2466         this.staticSharedLibraryName = TextUtils.safeIntern(staticSharedLibraryName);
2467         return this;
2468     }
2469 
2470     @Override
2471     public PackageImpl setStaticSharedLibraryVersion(long value) {
2472         staticSharedLibVersion = value;
2473         return this;
2474     }
2475 
2476     @Override
2477     public PackageImpl setStaticSharedLibrary(boolean value) {
2478         return setBoolean(Booleans.STATIC_SHARED_LIBRARY, value);
2479     }
2480 
2481     @Override
2482     public PackageImpl setExtraLargeScreensSupported(int supportsExtraLargeScreens) {
2483         if (supportsExtraLargeScreens == 1) {
2484             return this;
2485         }
2486 
2487         this.supportsExtraLargeScreens = supportsExtraLargeScreens < 0;
2488         return this;
2489     }
2490 
2491     @Override
2492     public PackageImpl setLargeScreensSupported(int supportsLargeScreens) {
2493         if (supportsLargeScreens == 1) {
2494             return this;
2495         }
2496 
2497         this.supportsLargeScreens = supportsLargeScreens < 0;
2498         return this;
2499     }
2500 
2501     @Override
2502     public PackageImpl setNormalScreensSupported(int supportsNormalScreens) {
2503         if (supportsNormalScreens == 1) {
2504             return this;
2505         }
2506 
2507         this.supportsNormalScreens = supportsNormalScreens < 0;
2508         return this;
2509     }
2510 
2511     @Override
2512     public PackageImpl setRtlSupported(boolean value) {
2513         return setBoolean(Booleans.SUPPORTS_RTL, value);
2514     }
2515 
2516     @Override
2517     public PackageImpl setSmallScreensSupported(int supportsSmallScreens) {
2518         if (supportsSmallScreens == 1) {
2519             return this;
2520         }
2521 
2522         this.supportsSmallScreens = supportsSmallScreens < 0;
2523         return this;
2524     }
2525 
2526     @Override
2527     public PackageImpl setTargetSandboxVersion(int value) {
2528         targetSandboxVersion = value;
2529         return this;
2530     }
2531 
2532     @Override
2533     public PackageImpl setTargetSdkVersion(int value) {
2534         targetSdkVersion = value;
2535         return this;
2536     }
2537 
2538     @Override
2539     public PackageImpl setTaskAffinity(@Nullable String taskAffinity) {
2540         this.taskAffinity = taskAffinity;
2541         return this;
2542     }
2543 
2544     @Override
2545     public PackageImpl setTestOnly(boolean value) {
2546         return setBoolean(Booleans.TEST_ONLY, value);
2547     }
2548 
2549     @Override
2550     public PackageImpl setThemeResourceId(int value) {
2551         theme = value;
2552         return this;
2553     }
2554 
2555     @Override
2556     public PackageImpl setUiOptions(int value) {
2557         uiOptions = value;
2558         return this;
2559     }
2560 
2561     @Override
2562     public PackageImpl setUpgradeKeySets(@NonNull Set<String> value) {
2563         upgradeKeySets = value;
2564         return this;
2565     }
2566 
2567     @Override
2568     public PackageImpl set32BitAbiPreferred(boolean value) {
2569         return setBoolean(Booleans.USE_32_BIT_ABI, value);
2570     }
2571 
2572     @Override
2573     public PackageImpl setUseEmbeddedDex(boolean value) {
2574         return setBoolean(Booleans.USE_EMBEDDED_DEX, value);
2575     }
2576 
2577     @Override
2578     public PackageImpl setCleartextTrafficAllowed(boolean value) {
2579         return setBoolean(Booleans.USES_CLEARTEXT_TRAFFIC, value);
2580     }
2581 
2582     @Override
2583     public PackageImpl setNonSdkApiRequested(boolean value) {
2584         return setBoolean(Booleans.USES_NON_SDK_API, value);
2585     }
2586 
2587     @Override
2588     public PackageImpl setVersionName(String versionName) {
2589         this.versionName = versionName;
2590         return this;
2591     }
2592 
2593     @Override
2594     public PackageImpl setVisibleToInstantApps(boolean value) {
2595         return setBoolean(Booleans.VISIBLE_TO_INSTANT_APPS, value);
2596     }
2597 
2598     @Override
2599     public PackageImpl setVmSafeMode(boolean value) {
2600         return setBoolean(Booleans.VM_SAFE_MODE, value);
2601     }
2602 
2603     @Override
2604     public PackageImpl setVolumeUuid(@Nullable String volumeUuid) {
2605         this.volumeUuid = TextUtils.safeIntern(volumeUuid);
2606         return this;
2607     }
2608 
2609     @Override
2610     public PackageImpl setZygotePreloadName(@Nullable String zygotePreloadName) {
2611         this.zygotePreloadName = zygotePreloadName;
2612         return this;
2613     }
2614 
2615     @Override
2616     public PackageImpl sortActivities() {
2617         Collections.sort(this.activities, ORDER_COMPARATOR);
2618         return this;
2619     }
2620 
2621     @Override
2622     public PackageImpl sortReceivers() {
2623         Collections.sort(this.receivers, ORDER_COMPARATOR);
2624         return this;
2625     }
2626 
2627     @Override
2628     public PackageImpl sortServices() {
2629         Collections.sort(this.services, ORDER_COMPARATOR);
2630         return this;
2631     }
2632 
2633     public ApplicationInfo toAppInfoWithoutStateWithoutFlags() {
2634         ApplicationInfo appInfo = new ApplicationInfo();
2635 
2636         // Lines that are commented below are state related and should not be assigned here.
2637         // They are left in as placeholders, since there is no good backwards compatible way to
2638         // separate these.
2639         appInfo.appComponentFactory = appComponentFactory;
2640         appInfo.backupAgentName = backupAgentName;
2641         appInfo.banner = banner;
2642         appInfo.category = category;
2643         appInfo.classLoaderName = classLoaderName;
2644         appInfo.className = className;
2645         appInfo.compatibleWidthLimitDp = compatibleWidthLimitDp;
2646         appInfo.compileSdkVersion = compileSdkVersion;
2647         appInfo.compileSdkVersionCodename = compileSdkVersionCodeName;
2648 //        appInfo.credentialProtectedDataDir
2649         appInfo.crossProfile = isCrossProfile();
2650 //        appInfo.dataDir
2651         appInfo.descriptionRes = descriptionRes;
2652 //        appInfo.deviceProtectedDataDir
2653         appInfo.enabled = getBoolean(Booleans.ENABLED);
2654 //        appInfo.enabledSetting
2655         appInfo.fullBackupContent = fullBackupContent;
2656         appInfo.dataExtractionRulesRes = dataExtractionRules;
2657         // TODO(b/135203078): See PackageImpl#getHiddenApiEnforcementPolicy
2658 //        appInfo.mHiddenApiPolicy
2659 //        appInfo.hiddenUntilInstalled
2660         appInfo.icon =
2661                 (ParsingPackageUtils.sUseRoundIcon && roundIconRes != 0) ? roundIconRes : iconRes;
2662         appInfo.iconRes = iconRes;
2663         appInfo.roundIconRes = roundIconRes;
2664         appInfo.installLocation = installLocation;
2665         appInfo.labelRes = labelRes;
2666         appInfo.largestWidthLimitDp = largestWidthLimitDp;
2667         appInfo.logo = logo;
2668         appInfo.manageSpaceActivityName = manageSpaceActivityName;
2669         appInfo.maxAspectRatio = maxAspectRatio;
2670         appInfo.metaData = metaData;
2671         appInfo.minAspectRatio = minAspectRatio;
2672         appInfo.minSdkVersion = minSdkVersion;
2673         appInfo.name = className;
2674 //        appInfo.nativeLibraryDir
2675 //        appInfo.nativeLibraryRootDir
2676 //        appInfo.nativeLibraryRootRequiresIsa
2677         appInfo.networkSecurityConfigRes = networkSecurityConfigRes;
2678         appInfo.nonLocalizedLabel = nonLocalizedLabel;
2679         appInfo.packageName = packageName;
2680         appInfo.permission = permission;
2681 //        appInfo.primaryCpuAbi
2682         appInfo.processName = getProcessName();
2683         appInfo.requiresSmallestWidthDp = requiresSmallestWidthDp;
2684 //        appInfo.resourceDirs
2685 //        appInfo.secondaryCpuAbi
2686 //        appInfo.secondaryNativeLibraryDir
2687 //        appInfo.seInfo
2688 //        appInfo.seInfoUser
2689 //        appInfo.sharedLibraryFiles
2690 //        appInfo.sharedLibraryInfos
2691 //        appInfo.showUserIcon
2692         appInfo.splitClassLoaderNames = splitClassLoaderNames;
2693         appInfo.splitDependencies = (splitDependencies == null || splitDependencies.size() == 0)
2694                 ? null : splitDependencies;
2695         appInfo.splitNames = splitNames;
2696         appInfo.storageUuid = mStorageUuid;
2697         appInfo.targetSandboxVersion = targetSandboxVersion;
2698         appInfo.targetSdkVersion = targetSdkVersion;
2699         appInfo.taskAffinity = taskAffinity;
2700         appInfo.theme = theme;
2701 //        appInfo.uid
2702         appInfo.uiOptions = uiOptions;
2703         appInfo.volumeUuid = volumeUuid;
2704         appInfo.zygotePreloadName = zygotePreloadName;
2705         appInfo.setGwpAsanMode(gwpAsanMode);
2706         appInfo.setMemtagMode(memtagMode);
2707         appInfo.setNativeHeapZeroInitialized(nativeHeapZeroInitialized);
2708         appInfo.setRequestRawExternalStorageAccess(requestRawExternalStorageAccess);
2709         appInfo.setBaseCodePath(mBaseApkPath);
2710         appInfo.setBaseResourcePath(mBaseApkPath);
2711         appInfo.setCodePath(mPath);
2712         appInfo.setResourcePath(mPath);
2713         appInfo.setSplitCodePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths);
2714         appInfo.setSplitResourcePaths(ArrayUtils.size(splitCodePaths) == 0 ? null : splitCodePaths);
2715         appInfo.setVersionCode(mLongVersionCode);
2716         appInfo.setAppClassNamesByProcess(buildAppClassNamesByProcess());
2717         appInfo.setLocaleConfigRes(mLocaleConfigRes);
2718         if (!mKnownActivityEmbeddingCerts.isEmpty()) {
2719             appInfo.setKnownActivityEmbeddingCerts(mKnownActivityEmbeddingCerts);
2720         }
2721         appInfo.allowCrossUidActivitySwitchFromBelow = mAllowCrossUidActivitySwitchFromBelow;
2722         appInfo.setPageSizeAppCompatFlags(mPageSizeAppCompatFlags);
2723 
2724         return appInfo;
2725     }
2726 
2727     private PackageImpl setBoolean(@Booleans.Flags long flag, boolean value) {
2728         if (value) {
2729             mBooleans |= flag;
2730         } else {
2731             mBooleans &= ~flag;
2732         }
2733         return this;
2734     }
2735 
2736     private boolean getBoolean(@Booleans.Flags long flag) {
2737         return (mBooleans & flag) != 0;
2738     }
2739 
2740     private PackageImpl setBoolean2(@Booleans2.Flags long flag, boolean value) {
2741         if (value) {
2742             mBooleans2 |= flag;
2743         } else {
2744             mBooleans2 &= ~flag;
2745         }
2746         return this;
2747     }
2748 
2749     private boolean getBoolean2(@Booleans2.Flags long flag) {
2750         return (mBooleans2 & flag) != 0;
2751     }
2752 
2753     // Derived fields
2754     private int mBaseAppInfoFlags;
2755     private int mBaseAppInfoPrivateFlags;
2756     private int mBaseAppInfoPrivateFlagsExt;
2757     private String mBaseAppDataCredentialProtectedDirForSystemUser;
2758     private String mBaseAppDataDeviceProtectedDirForSystemUser;
2759 
2760     ParsingPackageUtils.Callback mCallback;
2761 
2762     @VisibleForTesting
2763     public PackageImpl(@NonNull String packageName, @NonNull String baseApkPath,
2764             @NonNull String path, @Nullable TypedArray manifestArray, boolean isCoreApp,
2765             @Nullable ParsingPackageUtils.Callback callback) {
2766         this.packageName = TextUtils.safeIntern(packageName);
2767         this.mBaseApkPath = baseApkPath;
2768         this.mPath = path;
2769         this.mCallback = callback;
2770 
2771         if (manifestArray != null) {
2772             versionCode = manifestArray.getInteger(R.styleable.AndroidManifest_versionCode, 0);
2773             versionCodeMajor = manifestArray.getInteger(
2774                     R.styleable.AndroidManifest_versionCodeMajor, 0);
2775             setBaseRevisionCode(
2776                     manifestArray.getInteger(R.styleable.AndroidManifest_revisionCode, 0));
2777             setVersionName(manifestArray.getNonConfigurationString(
2778                     R.styleable.AndroidManifest_versionName, 0));
2779 
2780             setCompileSdkVersion(manifestArray.getInteger(
2781                     R.styleable.AndroidManifest_compileSdkVersion, 0));
2782             setCompileSdkVersionCodeName(manifestArray.getNonConfigurationString(
2783                     R.styleable.AndroidManifest_compileSdkVersionCodename, 0));
2784 
2785             setIsolatedSplitLoading(manifestArray.getBoolean(
2786                     R.styleable.AndroidManifest_isolatedSplits, false));
2787 
2788         }
2789         this.manifestPackageName = this.packageName;
2790         setBoolean(Booleans.CORE_APP, isCoreApp);
2791     }
2792 
2793     @Override
2794     public PackageImpl hideAsParsed() {
2795         assignDerivedFields();
2796         return this;
2797     }
2798 
2799     @Override
2800     public AndroidPackageInternal hideAsFinal() {
2801         if (mStorageUuid == null) {
2802             assignDerivedFields();
2803         }
2804         assignDerivedFields2();
2805         makeImmutable();
2806         return this;
2807     }
2808 
2809     private static String[] sortLibraries(List<String> libraryNames) {
2810         int size = libraryNames.size();
2811         if (size == 0) {
2812             return EmptyArray.STRING;
2813         }
2814         var arr = libraryNames.toArray(EmptyArray.STRING);
2815         Arrays.sort(arr);
2816         return arr;
2817     }
2818 
2819     private void assignDerivedFields2() {
2820         mBaseAppInfoFlags = AppInfoUtils.appInfoFlags(this);
2821         mBaseAppInfoPrivateFlags = AppInfoUtils.appInfoPrivateFlags(this);
2822         mBaseAppInfoPrivateFlagsExt = AppInfoUtils.appInfoPrivateFlagsExt(this,
2823                 mCallback == null ? false :
2824                         mCallback.getHiddenApiWhitelistedApps().contains(this.packageName));
2825         String baseAppDataDir = Environment.getDataDirectoryPath(getVolumeUuid()) + File.separator;
2826         String systemUserSuffix = File.separator + UserHandle.USER_SYSTEM + File.separator;
2827         mBaseAppDataCredentialProtectedDirForSystemUser = TextUtils.safeIntern(
2828                 baseAppDataDir + Environment.DIR_USER_CE + systemUserSuffix);
2829         mBaseAppDataDeviceProtectedDirForSystemUser = TextUtils.safeIntern(
2830                 baseAppDataDir + Environment.DIR_USER_DE + systemUserSuffix);
2831     }
2832 
2833     private void makeImmutable() {
2834         usesLibraries = Collections.unmodifiableList(usesLibraries);
2835         usesOptionalLibraries = Collections.unmodifiableList(usesOptionalLibraries);
2836         usesNativeLibraries = Collections.unmodifiableList(usesNativeLibraries);
2837         usesOptionalNativeLibraries = Collections.unmodifiableList(usesOptionalNativeLibraries);
2838         originalPackages = Collections.unmodifiableList(originalPackages);
2839         adoptPermissions = Collections.unmodifiableList(adoptPermissions);
2840         requestedPermissions = Collections.unmodifiableSet(requestedPermissions);
2841         protectedBroadcasts = Collections.unmodifiableList(protectedBroadcasts);
2842         apexSystemServices = Collections.unmodifiableList(apexSystemServices);
2843 
2844         activities = Collections.unmodifiableList(activities);
2845         receivers = Collections.unmodifiableList(receivers);
2846         services = Collections.unmodifiableList(services);
2847         providers = Collections.unmodifiableList(providers);
2848         permissions = Collections.unmodifiableList(permissions);
2849         permissionGroups = Collections.unmodifiableList(permissionGroups);
2850         instrumentations = Collections.unmodifiableList(instrumentations);
2851 
2852         overlayables = Collections.unmodifiableMap(overlayables);
2853         libraryNames = Collections.unmodifiableList(libraryNames);
2854         usesStaticLibraries = Collections.unmodifiableList(usesStaticLibraries);
2855         usesSdkLibraries = Collections.unmodifiableList(usesSdkLibraries);
2856         configPreferences = Collections.unmodifiableList(configPreferences);
2857         reqFeatures = Collections.unmodifiableList(reqFeatures);
2858         featureGroups = Collections.unmodifiableList(featureGroups);
2859         usesPermissions = Collections.unmodifiableList(usesPermissions);
2860         usesSdkLibraries = Collections.unmodifiableList(usesSdkLibraries);
2861         implicitPermissions = Collections.unmodifiableSet(implicitPermissions);
2862         upgradeKeySets = Collections.unmodifiableSet(upgradeKeySets);
2863         keySetMapping = Collections.unmodifiableMap(keySetMapping);
2864         attributions = Collections.unmodifiableList(attributions);
2865         preferredActivityFilters = Collections.unmodifiableList(preferredActivityFilters);
2866         processes = Collections.unmodifiableMap(processes);
2867         mProperties = Collections.unmodifiableMap(mProperties);
2868         queriesIntents = Collections.unmodifiableList(queriesIntents);
2869         queriesPackages = Collections.unmodifiableList(queriesPackages);
2870         queriesProviders = Collections.unmodifiableSet(queriesProviders);
2871         mimeGroups = Collections.unmodifiableSet(mimeGroups);
2872         mKnownActivityEmbeddingCerts = Collections.unmodifiableSet(mKnownActivityEmbeddingCerts);
2873         mFeatureFlagState = Collections.unmodifiableMap(mFeatureFlagState);
2874     }
2875 
2876     @Override
2877     public long getLongVersionCode() {
2878         return PackageInfo.composeLongVersionCode(versionCodeMajor, versionCode);
2879     }
2880 
2881     @Override
2882     public PackageImpl removePermission(int index) {
2883         this.permissions.remove(index);
2884         return this;
2885     }
2886 
2887     @Override
2888     public PackageImpl addUsesOptionalLibrary(int index, String libraryName) {
2889         this.usesOptionalLibraries = CollectionUtils.add(usesOptionalLibraries, index,
2890                 TextUtils.safeIntern(libraryName));
2891         return this;
2892     }
2893 
2894     @Override
2895     public PackageImpl addUsesLibrary(int index, String libraryName) {
2896         this.usesLibraries = CollectionUtils.add(usesLibraries, index,
2897                 TextUtils.safeIntern(libraryName));
2898         return this;
2899     }
2900 
2901     @Override
2902     public PackageImpl removeUsesLibrary(String libraryName) {
2903         this.usesLibraries = CollectionUtils.remove(this.usesLibraries, libraryName);
2904         return this;
2905     }
2906 
2907     @Override
2908     public PackageImpl removeUsesOptionalLibrary(String libraryName) {
2909         this.usesOptionalLibraries = CollectionUtils.remove(this.usesOptionalLibraries,
2910                 libraryName);
2911         return this;
2912     }
2913 
2914     @Override
2915     public PackageImpl setSigningDetails(@NonNull SigningDetails value) {
2916         signingDetails = value;
2917         return this;
2918     }
2919 
2920     @Override
2921     public PackageImpl setRestrictUpdateHash(@Nullable byte... value) {
2922         restrictUpdateHash = value;
2923         return this;
2924     }
2925 
2926     @Override
2927     public PackageImpl setPersistent(boolean value) {
2928         setBoolean(Booleans.PERSISTENT, value);
2929         return this;
2930     }
2931 
2932     @Override
2933     public PackageImpl setDefaultToDeviceProtectedStorage(boolean value) {
2934         setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE, value);
2935         return this;
2936     }
2937 
2938     @Override
2939     public PackageImpl setDirectBootAware(boolean value) {
2940         setBoolean(Booleans.DIRECT_BOOT_AWARE, value);
2941         return this;
2942     }
2943 
2944     @Override
2945     public PackageImpl clearProtectedBroadcasts() {
2946         protectedBroadcasts.clear();
2947         return this;
2948     }
2949 
2950     @Override
2951     public PackageImpl clearOriginalPackages() {
2952         originalPackages.clear();
2953         return this;
2954     }
2955 
2956     @Override
2957     public PackageImpl clearAdoptPermissions() {
2958         adoptPermissions.clear();
2959         return this;
2960     }
2961 
2962     @Override
2963     public PackageImpl setPath(@NonNull String path) {
2964         this.mPath = path;
2965         return this;
2966     }
2967 
2968     // TODO(b/135203078): Move PackageManagerService#renameStaticSharedLibraryPackage
2969     //  into initial package parsing
2970     @Override
2971     public PackageImpl setPackageName(@NonNull String packageName) {
2972         this.packageName = TextUtils.safeIntern(packageName);
2973 
2974         int permissionsSize = permissions.size();
2975         for (int index = 0; index < permissionsSize; index++) {
2976             ComponentMutateUtils.setPackageName(permissions.get(index), this.packageName);
2977         }
2978 
2979         int permissionGroupsSize = permissionGroups.size();
2980         for (int index = 0; index < permissionGroupsSize; index++) {
2981             ComponentMutateUtils.setPackageName(permissionGroups.get(index), this.packageName);
2982         }
2983 
2984         int activitiesSize = activities.size();
2985         for (int index = 0; index < activitiesSize; index++) {
2986             ComponentMutateUtils.setPackageName(activities.get(index), this.packageName);
2987         }
2988 
2989         int receiversSize = receivers.size();
2990         for (int index = 0; index < receiversSize; index++) {
2991             ComponentMutateUtils.setPackageName(receivers.get(index), this.packageName);
2992         }
2993 
2994         int providersSize = providers.size();
2995         for (int index = 0; index < providersSize; index++) {
2996             ComponentMutateUtils.setPackageName(providers.get(index), this.packageName);
2997         }
2998 
2999         int servicesSize = services.size();
3000         for (int index = 0; index < servicesSize; index++) {
3001             ComponentMutateUtils.setPackageName(services.get(index), this.packageName);
3002         }
3003 
3004         int instrumentationsSize = instrumentations.size();
3005         for (int index = 0; index < instrumentationsSize; index++) {
3006             ComponentMutateUtils.setPackageName(instrumentations.get(index), this.packageName);
3007         }
3008 
3009         return this;
3010     }
3011 
3012     @Override
3013     public PackageImpl setAllComponentsDirectBootAware(boolean allComponentsDirectBootAware) {
3014         int activitiesSize = activities.size();
3015         for (int index = 0; index < activitiesSize; index++) {
3016             ComponentMutateUtils.setDirectBootAware(activities.get(index),
3017                     allComponentsDirectBootAware);
3018         }
3019 
3020         int receiversSize = receivers.size();
3021         for (int index = 0; index < receiversSize; index++) {
3022             ComponentMutateUtils.setDirectBootAware(receivers.get(index),
3023                     allComponentsDirectBootAware);
3024         }
3025 
3026         int providersSize = providers.size();
3027         for (int index = 0; index < providersSize; index++) {
3028             ComponentMutateUtils.setDirectBootAware(providers.get(index),
3029                     allComponentsDirectBootAware);
3030         }
3031 
3032         int servicesSize = services.size();
3033         for (int index = 0; index < servicesSize; index++) {
3034             ComponentMutateUtils.setDirectBootAware(services.get(index),
3035                     allComponentsDirectBootAware);
3036         }
3037 
3038         return this;
3039     }
3040 
3041     @Override
3042     public PackageImpl setBaseApkPath(@NonNull String baseApkPath) {
3043         this.mBaseApkPath = TextUtils.safeIntern(baseApkPath);
3044         return this;
3045     }
3046 
3047     @Override
3048     public PackageImpl setNativeLibraryDir(@Nullable String nativeLibraryDir) {
3049         this.nativeLibraryDir = TextUtils.safeIntern(nativeLibraryDir);
3050         return this;
3051     }
3052 
3053     @Override
3054     public PackageImpl setNativeLibraryRootDir(@Nullable String nativeLibraryRootDir) {
3055         this.nativeLibraryRootDir = TextUtils.safeIntern(nativeLibraryRootDir);
3056         return this;
3057     }
3058 
3059     @Override
3060     public PackageImpl setPrimaryCpuAbi(@Nullable String primaryCpuAbi) {
3061         this.primaryCpuAbi = TextUtils.safeIntern(primaryCpuAbi);
3062         return this;
3063     }
3064 
3065     @Override
3066     public PackageImpl setSecondaryCpuAbi(@Nullable String secondaryCpuAbi) {
3067         this.secondaryCpuAbi = TextUtils.safeIntern(secondaryCpuAbi);
3068         return this;
3069     }
3070 
3071     @Override
3072     public PackageImpl setSecondaryNativeLibraryDir(@Nullable String secondaryNativeLibraryDir) {
3073         this.secondaryNativeLibraryDir = TextUtils.safeIntern(secondaryNativeLibraryDir);
3074         return this;
3075     }
3076 
3077     @Override
3078     public PackageImpl setSplitCodePaths(@Nullable String[] splitCodePaths) {
3079         this.splitCodePaths = splitCodePaths;
3080         this.mSplits = null; // reset for paths changed
3081         if (splitCodePaths != null) {
3082             int size = splitCodePaths.length;
3083             for (int index = 0; index < size; index++) {
3084                 this.splitCodePaths[index] = TextUtils.safeIntern(this.splitCodePaths[index]);
3085             }
3086         }
3087         return this;
3088     }
3089 
3090     @Override
3091     public PackageImpl capPermissionPriorities() {
3092         int size = permissionGroups.size();
3093         for (int index = size - 1; index >= 0; --index) {
3094             // TODO(b/135203078): Builder/immutability
3095             ComponentMutateUtils.setPriority(permissionGroups.get(index), 0);
3096         }
3097         return this;
3098     }
3099 
3100     @Override
3101     public PackageImpl markNotActivitiesAsNotExportedIfSingleUser() {
3102         // ignore export request for single user receivers
3103         int receiversSize = receivers.size();
3104         for (int index = 0; index < receiversSize; index++) {
3105             ParsedActivity receiver = receivers.get(index);
3106             if ((receiver.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) {
3107                 ComponentMutateUtils.setExported(receiver, false);
3108             }
3109         }
3110 
3111         // ignore export request for single user services
3112         int servicesSize = services.size();
3113         for (int index = 0; index < servicesSize; index++) {
3114             ParsedService service = services.get(index);
3115             if ((service.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) {
3116                 ComponentMutateUtils.setExported(service, false);
3117             }
3118         }
3119 
3120         // ignore export request for single user providers
3121         int providersSize = providers.size();
3122         for (int index = 0; index < providersSize; index++) {
3123             ParsedProvider provider = providers.get(index);
3124             if ((provider.getFlags() & ActivityInfo.FLAG_SINGLE_USER) != 0) {
3125                 ComponentMutateUtils.setExported(provider, false);
3126             }
3127         }
3128 
3129         return this;
3130     }
3131 
3132     @Override
3133     public PackageImpl setCoreApp(boolean coreApp) {
3134         return setBoolean(Booleans.CORE_APP, coreApp);
3135     }
3136 
3137     @Override
3138     public PackageImpl setVersionCode(int versionCode) {
3139         this.versionCode = versionCode;
3140         return this;
3141     }
3142 
3143     @Override
3144     public PackageImpl setVersionCodeMajor(int versionCodeMajor) {
3145         this.versionCodeMajor = versionCodeMajor;
3146         return this;
3147     }
3148 
3149     @Override
3150     public ApplicationInfo toAppInfoWithoutState() {
3151         ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags();
3152         appInfo.flags = mBaseAppInfoFlags;
3153         appInfo.privateFlags = mBaseAppInfoPrivateFlags;
3154         appInfo.privateFlagsExt = mBaseAppInfoPrivateFlagsExt;
3155         appInfo.nativeLibraryDir = nativeLibraryDir;
3156         appInfo.nativeLibraryRootDir = nativeLibraryRootDir;
3157         appInfo.nativeLibraryRootRequiresIsa = nativeLibraryRootRequiresIsa;
3158         appInfo.primaryCpuAbi = primaryCpuAbi;
3159         appInfo.secondaryCpuAbi = secondaryCpuAbi;
3160         appInfo.secondaryNativeLibraryDir = secondaryNativeLibraryDir;
3161         appInfo.seInfoUser = SEInfoUtil.COMPLETE_STR;
3162         appInfo.uid = uid;
3163         return appInfo;
3164     }
3165 
3166     @Override
3167     public int describeContents() {
3168         return 0;
3169     }
3170 
3171     @Override
3172     public void writeToParcel(Parcel dest, int flags) {
3173         writeFeatureFlagState(dest);
3174 
3175         sForBoolean.parcel(this.supportsSmallScreens, dest, flags);
3176         sForBoolean.parcel(this.supportsNormalScreens, dest, flags);
3177         sForBoolean.parcel(this.supportsLargeScreens, dest, flags);
3178         sForBoolean.parcel(this.supportsExtraLargeScreens, dest, flags);
3179         sForBoolean.parcel(this.resizeable, dest, flags);
3180         sForBoolean.parcel(this.anyDensity, dest, flags);
3181         dest.writeInt(this.versionCode);
3182         dest.writeInt(this.versionCodeMajor);
3183         dest.writeInt(this.baseRevisionCode);
3184         sForInternedString.parcel(this.versionName, dest, flags);
3185         dest.writeInt(this.compileSdkVersion);
3186         dest.writeString(this.compileSdkVersionCodeName);
3187         sForInternedString.parcel(this.packageName, dest, flags);
3188         dest.writeString(this.mBaseApkPath);
3189         dest.writeString(this.restrictedAccountType);
3190         dest.writeString(this.requiredAccountType);
3191         dest.writeString(this.mEmergencyInstaller);
3192         sForInternedString.parcel(this.overlayTarget, dest, flags);
3193         dest.writeString(this.overlayTargetOverlayableName);
3194         dest.writeString(this.overlayCategory);
3195         dest.writeInt(this.overlayPriority);
3196         sForInternedStringValueMap.parcel(this.overlayables, dest, flags);
3197         sForInternedString.parcel(this.sdkLibraryName, dest, flags);
3198         dest.writeInt(this.sdkLibVersionMajor);
3199         sForInternedString.parcel(this.staticSharedLibraryName, dest, flags);
3200         dest.writeLong(this.staticSharedLibVersion);
3201         sForInternedStringList.parcel(this.libraryNames, dest, flags);
3202         sForInternedStringList.parcel(this.usesLibraries, dest, flags);
3203         sForInternedStringList.parcel(this.usesOptionalLibraries, dest, flags);
3204         sForInternedStringList.parcel(this.usesNativeLibraries, dest, flags);
3205         sForInternedStringList.parcel(this.usesOptionalNativeLibraries, dest, flags);
3206 
3207         sForInternedStringList.parcel(this.usesStaticLibraries, dest, flags);
3208         dest.writeLongArray(this.usesStaticLibrariesVersions);
3209         if (this.usesStaticLibrariesCertDigests == null) {
3210             dest.writeInt(-1);
3211         } else {
3212             dest.writeInt(this.usesStaticLibrariesCertDigests.length);
3213             for (int index = 0; index < this.usesStaticLibrariesCertDigests.length; index++) {
3214                 dest.writeStringArray(this.usesStaticLibrariesCertDigests[index]);
3215             }
3216         }
3217 
3218         sForInternedStringList.parcel(this.usesSdkLibraries, dest, flags);
3219         dest.writeLongArray(this.usesSdkLibrariesVersionsMajor);
3220         if (this.usesSdkLibrariesCertDigests == null) {
3221             dest.writeInt(-1);
3222         } else {
3223             dest.writeInt(this.usesSdkLibrariesCertDigests.length);
3224             for (int index = 0; index < this.usesSdkLibrariesCertDigests.length; index++) {
3225                 dest.writeStringArray(this.usesSdkLibrariesCertDigests[index]);
3226             }
3227         }
3228         dest.writeBooleanArray(this.usesSdkLibrariesOptional);
3229 
3230         sForInternedString.parcel(this.sharedUserId, dest, flags);
3231         dest.writeInt(this.sharedUserLabel);
3232         dest.writeTypedList(this.configPreferences);
3233         dest.writeTypedList(this.reqFeatures);
3234         dest.writeTypedList(this.featureGroups);
3235         dest.writeByteArray(this.restrictUpdateHash);
3236         dest.writeStringList(this.originalPackages);
3237         sForInternedStringList.parcel(this.adoptPermissions, dest, flags);
3238         sForInternedStringSet.parcel(this.requestedPermissions, dest, flags);
3239         ParsingUtils.writeParcelableList(dest, this.usesPermissions);
3240         sForInternedStringSet.parcel(this.implicitPermissions, dest, flags);
3241         sForStringSet.parcel(this.upgradeKeySets, dest, flags);
3242         ParsingPackageUtils.writeKeySetMapping(dest, this.keySetMapping);
3243         sForInternedStringList.parcel(this.protectedBroadcasts, dest, flags);
3244         ParsingUtils.writeParcelableList(dest, this.activities);
3245         ParsingUtils.writeParcelableList(dest, this.apexSystemServices);
3246         ParsingUtils.writeParcelableList(dest, this.receivers);
3247         ParsingUtils.writeParcelableList(dest, this.services);
3248         ParsingUtils.writeParcelableList(dest, this.providers);
3249         ParsingUtils.writeParcelableList(dest, this.attributions);
3250         ParsingUtils.writeParcelableList(dest, this.permissions);
3251         ParsingUtils.writeParcelableList(dest, this.permissionGroups);
3252         ParsingUtils.writeParcelableList(dest, this.instrumentations);
3253         sForIntentInfoPairs.parcel(this.preferredActivityFilters, dest, flags);
3254         dest.writeMap(this.processes);
3255         dest.writeBundle(this.metaData);
3256         sForInternedString.parcel(this.volumeUuid, dest, flags);
3257         dest.writeParcelable(this.signingDetails, flags);
3258         dest.writeString(this.mPath);
3259         dest.writeTypedList(this.queriesIntents, flags);
3260         sForInternedStringList.parcel(this.queriesPackages, dest, flags);
3261         sForInternedStringSet.parcel(this.queriesProviders, dest, flags);
3262         dest.writeString(this.appComponentFactory);
3263         dest.writeString(this.backupAgentName);
3264         dest.writeInt(this.banner);
3265         dest.writeInt(this.category);
3266         dest.writeString(this.classLoaderName);
3267         dest.writeString(this.className);
3268         dest.writeInt(this.compatibleWidthLimitDp);
3269         dest.writeInt(this.descriptionRes);
3270         dest.writeInt(this.fullBackupContent);
3271         dest.writeInt(this.dataExtractionRules);
3272         dest.writeInt(this.iconRes);
3273         dest.writeInt(this.installLocation);
3274         dest.writeInt(this.labelRes);
3275         dest.writeInt(this.largestWidthLimitDp);
3276         dest.writeInt(this.logo);
3277         dest.writeString(this.manageSpaceActivityName);
3278         dest.writeFloat(this.maxAspectRatio);
3279         dest.writeFloat(this.minAspectRatio);
3280         dest.writeInt(this.minSdkVersion);
3281         dest.writeInt(this.maxSdkVersion);
3282         dest.writeInt(this.networkSecurityConfigRes);
3283         dest.writeCharSequence(this.nonLocalizedLabel);
3284         dest.writeString(this.permission);
3285         dest.writeString(this.processName);
3286         dest.writeInt(this.requiresSmallestWidthDp);
3287         dest.writeInt(this.roundIconRes);
3288         dest.writeInt(this.targetSandboxVersion);
3289         dest.writeInt(this.targetSdkVersion);
3290         dest.writeString(this.taskAffinity);
3291         dest.writeInt(this.theme);
3292         dest.writeInt(this.uiOptions);
3293         dest.writeString(this.zygotePreloadName);
3294         dest.writeStringArray(this.splitClassLoaderNames);
3295         dest.writeStringArray(this.splitCodePaths);
3296         dest.writeSparseArray(this.splitDependencies);
3297         dest.writeIntArray(this.splitFlags);
3298         dest.writeStringArray(this.splitNames);
3299         dest.writeIntArray(this.splitRevisionCodes);
3300         sForBoolean.parcel(this.resizeableActivity, dest, flags);
3301         dest.writeInt(this.autoRevokePermissions);
3302         sForInternedStringSet.parcel(this.mimeGroups, dest, flags);
3303         dest.writeInt(this.gwpAsanMode);
3304         dest.writeSparseIntArray(this.minExtensionVersions);
3305         dest.writeMap(this.mProperties);
3306         dest.writeInt(this.memtagMode);
3307         dest.writeInt(this.nativeHeapZeroInitialized);
3308         sForBoolean.parcel(this.requestRawExternalStorageAccess, dest, flags);
3309         dest.writeInt(this.mLocaleConfigRes);
3310         sForStringSet.parcel(mKnownActivityEmbeddingCerts, dest, flags);
3311         sForInternedString.parcel(this.manifestPackageName, dest, flags);
3312         dest.writeString(this.nativeLibraryDir);
3313         dest.writeString(this.nativeLibraryRootDir);
3314         dest.writeBoolean(this.nativeLibraryRootRequiresIsa);
3315         sForInternedString.parcel(this.primaryCpuAbi, dest, flags);
3316         sForInternedString.parcel(this.secondaryCpuAbi, dest, flags);
3317         dest.writeString(this.secondaryNativeLibraryDir);
3318         dest.writeInt(this.uid);
3319         dest.writeLong(this.mBooleans);
3320         dest.writeLong(this.mBooleans2);
3321         dest.writeBoolean(this.mAllowCrossUidActivitySwitchFromBelow);
3322         dest.writeInt(this.mIntentMatchingFlags);
3323         dest.writeIntArray(this.mAlternateLauncherIconResIds);
3324         dest.writeIntArray(this.mAlternateLauncherLabelResIds);
3325         dest.writeInt(this.mPageSizeAppCompatFlags);
3326     }
3327 
3328     private void writeFeatureFlagState(@NonNull Parcel dest) {
3329         // Use a string array to encode flag state. One string per flag in the form `<flag>=<value>`
3330         // where value is 0 (disabled), 1 (enabled) or ? (unknown flag or value).
3331         int featureFlagCount = this.mFeatureFlagState.size();
3332         String[] featureFlagStateAsArray = new String[featureFlagCount];
3333         var entryIterator = this.mFeatureFlagState.entrySet().iterator();
3334         for (int i = 0; i < featureFlagCount; i++) {
3335             var entry = entryIterator.next();
3336             Boolean flagValue = entry.getValue();
3337             if (flagValue == null) {
3338                 featureFlagStateAsArray[i] = entry.getKey() + "=?";
3339             } else if (flagValue.booleanValue()) {
3340                 featureFlagStateAsArray[i] = entry.getKey() + "=1";
3341             } else {
3342                 featureFlagStateAsArray[i] = entry.getKey() + "=0";
3343             }
3344 
3345         }
3346         dest.writeStringArray(featureFlagStateAsArray);
3347     }
3348 
3349     public PackageImpl(Parcel in) {
3350         this(in, /* callback */ null);
3351     }
3352 
3353     public PackageImpl(@NonNull Parcel in, @Nullable ParsingPackageUtils.Callback callback) {
3354         mCallback = callback;
3355         // We use the boot classloader for all classes that we load.
3356         final ClassLoader boot = Object.class.getClassLoader();
3357 
3358         readFeatureFlagState(in);
3359 
3360         this.supportsSmallScreens = sForBoolean.unparcel(in);
3361         this.supportsNormalScreens = sForBoolean.unparcel(in);
3362         this.supportsLargeScreens = sForBoolean.unparcel(in);
3363         this.supportsExtraLargeScreens = sForBoolean.unparcel(in);
3364         this.resizeable = sForBoolean.unparcel(in);
3365         this.anyDensity = sForBoolean.unparcel(in);
3366         this.versionCode = in.readInt();
3367         this.versionCodeMajor = in.readInt();
3368         this.baseRevisionCode = in.readInt();
3369         this.versionName = sForInternedString.unparcel(in);
3370         this.compileSdkVersion = in.readInt();
3371         this.compileSdkVersionCodeName = in.readString();
3372         this.packageName = sForInternedString.unparcel(in);
3373         this.mBaseApkPath = in.readString();
3374         this.restrictedAccountType = in.readString();
3375         this.requiredAccountType = in.readString();
3376         this.mEmergencyInstaller = in.readString();
3377         this.overlayTarget = sForInternedString.unparcel(in);
3378         this.overlayTargetOverlayableName = in.readString();
3379         this.overlayCategory = in.readString();
3380         this.overlayPriority = in.readInt();
3381         this.overlayables = sForInternedStringValueMap.unparcel(in);
3382         this.sdkLibraryName = sForInternedString.unparcel(in);
3383         this.sdkLibVersionMajor = in.readInt();
3384         this.staticSharedLibraryName = sForInternedString.unparcel(in);
3385         this.staticSharedLibVersion = in.readLong();
3386         this.libraryNames = sForInternedStringList.unparcel(in);
3387         this.usesLibraries = sForInternedStringList.unparcel(in);
3388         this.usesOptionalLibraries = sForInternedStringList.unparcel(in);
3389         this.usesNativeLibraries = sForInternedStringList.unparcel(in);
3390         this.usesOptionalNativeLibraries = sForInternedStringList.unparcel(in);
3391 
3392         this.usesStaticLibraries = sForInternedStringList.unparcel(in);
3393         this.usesStaticLibrariesVersions = in.createLongArray();
3394         {
3395             int digestsSize = in.readInt();
3396             if (digestsSize >= 0) {
3397                 this.usesStaticLibrariesCertDigests = new String[digestsSize][];
3398                 for (int index = 0; index < digestsSize; index++) {
3399                     this.usesStaticLibrariesCertDigests[index] = sForInternedStringArray.unparcel(
3400                             in);
3401                 }
3402             }
3403         }
3404 
3405         this.usesSdkLibraries = sForInternedStringList.unparcel(in);
3406         this.usesSdkLibrariesVersionsMajor = in.createLongArray();
3407         {
3408             int digestsSize = in.readInt();
3409             if (digestsSize >= 0) {
3410                 this.usesSdkLibrariesCertDigests = new String[digestsSize][];
3411                 for (int index = 0; index < digestsSize; index++) {
3412                     this.usesSdkLibrariesCertDigests[index] = sForInternedStringArray.unparcel(in);
3413                 }
3414             }
3415         }
3416         this.usesSdkLibrariesOptional = in.createBooleanArray();
3417 
3418         this.sharedUserId = sForInternedString.unparcel(in);
3419         this.sharedUserLabel = in.readInt();
3420         this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR);
3421         this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR);
3422         this.featureGroups = in.createTypedArrayList(FeatureGroupInfo.CREATOR);
3423         this.restrictUpdateHash = in.createByteArray();
3424         this.originalPackages = in.createStringArrayList();
3425         this.adoptPermissions = sForInternedStringList.unparcel(in);
3426         this.requestedPermissions = sForInternedStringSet.unparcel(in);
3427         this.usesPermissions = ParsingUtils.createTypedInterfaceList(in,
3428                 ParsedUsesPermissionImpl.CREATOR);
3429         this.implicitPermissions = sForInternedStringSet.unparcel(in);
3430         this.upgradeKeySets = sForStringSet.unparcel(in);
3431         this.keySetMapping = ParsingPackageUtils.readKeySetMapping(in);
3432         this.protectedBroadcasts = sForInternedStringList.unparcel(in);
3433 
3434         this.activities = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR);
3435         this.apexSystemServices = ParsingUtils.createTypedInterfaceList(in,
3436                 ParsedApexSystemServiceImpl.CREATOR);
3437         this.receivers = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR);
3438         this.services = ParsingUtils.createTypedInterfaceList(in, ParsedServiceImpl.CREATOR);
3439         this.providers = ParsingUtils.createTypedInterfaceList(in, ParsedProviderImpl.CREATOR);
3440         this.attributions = ParsingUtils.createTypedInterfaceList(in,
3441                 ParsedAttributionImpl.CREATOR);
3442         this.permissions = ParsingUtils.createTypedInterfaceList(in, ParsedPermissionImpl.CREATOR);
3443         this.permissionGroups = ParsingUtils.createTypedInterfaceList(in,
3444                 ParsedPermissionGroupImpl.CREATOR);
3445         this.instrumentations = ParsingUtils.createTypedInterfaceList(in,
3446                 ParsedInstrumentationImpl.CREATOR);
3447         this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in);
3448         this.processes = in.readHashMap(ParsedProcessImpl.class.getClassLoader());
3449         this.metaData = in.readBundle(boot);
3450         this.volumeUuid = sForInternedString.unparcel(in);
3451         this.signingDetails = in.readParcelable(boot, android.content.pm.SigningDetails.class);
3452         this.mPath = in.readString();
3453         this.queriesIntents = in.createTypedArrayList(Intent.CREATOR);
3454         this.queriesPackages = sForInternedStringList.unparcel(in);
3455         this.queriesProviders = sForInternedStringSet.unparcel(in);
3456         this.appComponentFactory = in.readString();
3457         this.backupAgentName = in.readString();
3458         this.banner = in.readInt();
3459         this.category = in.readInt();
3460         this.classLoaderName = in.readString();
3461         this.className = in.readString();
3462         this.compatibleWidthLimitDp = in.readInt();
3463         this.descriptionRes = in.readInt();
3464         this.fullBackupContent = in.readInt();
3465         this.dataExtractionRules = in.readInt();
3466         this.iconRes = in.readInt();
3467         this.installLocation = in.readInt();
3468         this.labelRes = in.readInt();
3469         this.largestWidthLimitDp = in.readInt();
3470         this.logo = in.readInt();
3471         this.manageSpaceActivityName = in.readString();
3472         this.maxAspectRatio = in.readFloat();
3473         this.minAspectRatio = in.readFloat();
3474         this.minSdkVersion = in.readInt();
3475         this.maxSdkVersion = in.readInt();
3476         this.networkSecurityConfigRes = in.readInt();
3477         this.nonLocalizedLabel = in.readCharSequence();
3478         this.permission = in.readString();
3479         this.processName = in.readString();
3480         this.requiresSmallestWidthDp = in.readInt();
3481         this.roundIconRes = in.readInt();
3482         this.targetSandboxVersion = in.readInt();
3483         this.targetSdkVersion = in.readInt();
3484         this.taskAffinity = in.readString();
3485         this.theme = in.readInt();
3486         this.uiOptions = in.readInt();
3487         this.zygotePreloadName = in.readString();
3488         this.splitClassLoaderNames = in.createStringArray();
3489         this.splitCodePaths = in.createStringArray();
3490         this.splitDependencies = in.readSparseArray(boot);
3491         this.splitFlags = in.createIntArray();
3492         this.splitNames = in.createStringArray();
3493         this.splitRevisionCodes = in.createIntArray();
3494         this.resizeableActivity = sForBoolean.unparcel(in);
3495 
3496         this.autoRevokePermissions = in.readInt();
3497         this.mimeGroups = sForInternedStringSet.unparcel(in);
3498         this.gwpAsanMode = in.readInt();
3499         this.minExtensionVersions = in.readSparseIntArray();
3500         this.mProperties = in.readHashMap(boot);
3501         this.memtagMode = in.readInt();
3502         this.nativeHeapZeroInitialized = in.readInt();
3503         this.requestRawExternalStorageAccess = sForBoolean.unparcel(in);
3504         this.mLocaleConfigRes = in.readInt();
3505         this.mKnownActivityEmbeddingCerts = sForStringSet.unparcel(in);
3506         this.manifestPackageName = sForInternedString.unparcel(in);
3507         this.nativeLibraryDir = in.readString();
3508         this.nativeLibraryRootDir = in.readString();
3509         this.nativeLibraryRootRequiresIsa = in.readBoolean();
3510         this.primaryCpuAbi = sForInternedString.unparcel(in);
3511         this.secondaryCpuAbi = sForInternedString.unparcel(in);
3512         this.secondaryNativeLibraryDir = in.readString();
3513         this.uid = in.readInt();
3514         this.mBooleans = in.readLong();
3515         this.mBooleans2 = in.readLong();
3516         this.mAllowCrossUidActivitySwitchFromBelow = in.readBoolean();
3517         this.mIntentMatchingFlags = in.readInt();
3518         this.mAlternateLauncherIconResIds = in.createIntArray();
3519         this.mAlternateLauncherLabelResIds = in.createIntArray();
3520         this.mPageSizeAppCompatFlags = in.readInt();
3521 
3522         assignDerivedFields();
3523         assignDerivedFields2();
3524 
3525         // Do not call makeImmutable here as cached parsing will need
3526         // to mutate this instance before it's finalized.
3527     }
3528 
3529     private void readFeatureFlagState(@NonNull Parcel in) {
3530         // See comment in writeFeatureFlagState() for encoding of flag state.
3531         String[] featureFlagStateAsArray = in.createStringArray();
3532         for (String s : featureFlagStateAsArray) {
3533             int sepIndex = s.lastIndexOf('=');
3534             if (sepIndex >= 0 && sepIndex == s.length() - 2) {
3535                 String flagPackageAndName = s.substring(0, sepIndex);
3536                 char c = s.charAt(sepIndex + 1);
3537                 Boolean flagValue = null;
3538                 if (c == '1') {
3539                     flagValue = Boolean.TRUE;
3540                 } else if (c == '0') {
3541                     flagValue = Boolean.FALSE;
3542                 } else if (c != '?') {
3543                     continue;
3544                 }
3545                 this.mFeatureFlagState.put(flagPackageAndName, flagValue);
3546             }
3547         }
3548     }
3549 
3550     @NonNull
3551     public static final Creator<PackageImpl> CREATOR = new Creator<PackageImpl>() {
3552         @Override
3553         public PackageImpl createFromParcel(Parcel source) {
3554             return new PackageImpl(source);
3555         }
3556 
3557         @Override
3558         public PackageImpl[] newArray(int size) {
3559             return new PackageImpl[size];
3560         }
3561     };
3562 
3563     @NonNull
3564     @Override
3565     public String getManifestPackageName() {
3566         return manifestPackageName;
3567     }
3568 
3569     public boolean isStub() {
3570         return getBoolean2(Booleans2.STUB);
3571     }
3572 
3573     @Nullable
3574     @Override
3575     public String getNativeLibraryDir() {
3576         return nativeLibraryDir;
3577     }
3578 
3579     @Nullable
3580     @Override
3581     public String getNativeLibraryRootDir() {
3582         return nativeLibraryRootDir;
3583     }
3584 
3585     @Override
3586     public boolean isNativeLibraryRootRequiresIsa() {
3587         return nativeLibraryRootRequiresIsa;
3588     }
3589 
3590     @Nullable
3591     @Override
3592     public String getPrimaryCpuAbi() {
3593         return primaryCpuAbi;
3594     }
3595 
3596     @Nullable
3597     @Override
3598     public String getSecondaryCpuAbi() {
3599         return secondaryCpuAbi;
3600     }
3601 
3602     @Nullable
3603     @Override
3604     public String getSecondaryNativeLibraryDir() {
3605         return secondaryNativeLibraryDir;
3606     }
3607 
3608     @Override
3609     public boolean isCoreApp() {
3610         return getBoolean(Booleans.CORE_APP);
3611     }
3612 
3613     @Override
3614     public boolean isSystem() {
3615         return getBoolean(Booleans.SYSTEM);
3616     }
3617 
3618     @Override
3619     public boolean isUpdatableSystem() {
3620         return getBoolean2(Booleans2.UPDATABLE_SYSTEM);
3621     }
3622 
3623     @Override
3624     public boolean isFactoryTest() {
3625         return getBoolean(Booleans.FACTORY_TEST);
3626     }
3627 
3628     @Override
3629     public boolean isApex() {
3630         return getBoolean2(Booleans2.APEX);
3631     }
3632 
3633     @Override
3634     public boolean isSystemExt() {
3635         return getBoolean(Booleans.SYSTEM_EXT);
3636     }
3637 
3638     @Override
3639     public boolean isPrivileged() {
3640         return getBoolean(Booleans.PRIVILEGED);
3641     }
3642 
3643     @Override
3644     public boolean isOem() {
3645         return getBoolean(Booleans.OEM);
3646     }
3647 
3648     @Override
3649     public boolean isVendor() {
3650         return getBoolean(Booleans.VENDOR);
3651     }
3652 
3653     @Override
3654     public boolean isProduct() {
3655         return getBoolean(Booleans.PRODUCT);
3656     }
3657 
3658     @Override
3659     public boolean isOdm() {
3660         return getBoolean(Booleans.ODM);
3661     }
3662 
3663     @Override
3664     public boolean isSignedWithPlatformKey() {
3665         return getBoolean(Booleans.SIGNED_WITH_PLATFORM_KEY);
3666     }
3667 
3668     /**
3669      * This is an appId, the uid if the userId is == USER_SYSTEM
3670      */
3671     @Override
3672     public int getUid() {
3673         return uid;
3674     }
3675 
3676     @Override
3677     public PackageImpl setStub(boolean value) {
3678         setBoolean2(Booleans2.STUB, value);
3679         return this;
3680     }
3681 
3682     @Override
3683     public PackageImpl setNativeLibraryRootRequiresIsa(boolean value) {
3684         nativeLibraryRootRequiresIsa = value;
3685         return this;
3686     }
3687 
3688     @Override
3689     public PackageImpl setSystem(boolean value) {
3690         setBoolean(Booleans.SYSTEM, value);
3691         return this;
3692     }
3693 
3694     @Override
3695     public PackageImpl setUpdatableSystem(boolean value) {
3696         return setBoolean2(Booleans2.UPDATABLE_SYSTEM, value);
3697     }
3698 
3699     @Override
3700     public PackageImpl setFactoryTest(boolean value) {
3701         setBoolean(Booleans.FACTORY_TEST, value);
3702         return this;
3703     }
3704 
3705     @Override
3706     public PackageImpl setApex(boolean isApex) {
3707         setBoolean2(Booleans2.APEX, isApex);
3708         return this;
3709     }
3710 
3711     @Override
3712     public PackageImpl setSystemExt(boolean value) {
3713         setBoolean(Booleans.SYSTEM_EXT, value);
3714         return this;
3715     }
3716 
3717     @Override
3718     public PackageImpl setPrivileged(boolean value) {
3719         setBoolean(Booleans.PRIVILEGED, value);
3720         return this;
3721     }
3722 
3723     @Override
3724     public PackageImpl setOem(boolean value) {
3725         setBoolean(Booleans.OEM, value);
3726         return this;
3727     }
3728 
3729     @Override
3730     public PackageImpl setVendor(boolean value) {
3731         setBoolean(Booleans.VENDOR, value);
3732         return this;
3733     }
3734 
3735     @Override
3736     public PackageImpl setProduct(boolean value) {
3737         setBoolean(Booleans.PRODUCT, value);
3738         return this;
3739     }
3740 
3741     @Override
3742     public PackageImpl setOdm(boolean value) {
3743         setBoolean(Booleans.ODM, value);
3744         return this;
3745     }
3746 
3747     @Override
3748     public PackageImpl setSignedWithPlatformKey(boolean value) {
3749         setBoolean(Booleans.SIGNED_WITH_PLATFORM_KEY, value);
3750         return this;
3751     }
3752 
3753     @Override
3754     public PackageImpl setUid(int value) {
3755         uid = value;
3756         return this;
3757     }
3758 
3759     @Override
3760     public ParsingPackage setIntentMatchingFlags(int intentMatchingFlags) {
3761         mIntentMatchingFlags = intentMatchingFlags;
3762         return this;
3763     }
3764 
3765     @Override
3766     public int getIntentMatchingFlags() {
3767         return mIntentMatchingFlags;
3768     }
3769 
3770     // The following methods are explicitly not inside any interface. These are hidden under
3771     // PackageImpl which is only accessible to the system server. This is to prevent/discourage
3772     // usage of these fields outside of the utility classes.
3773     public String getBaseAppDataCredentialProtectedDirForSystemUser() {
3774         return mBaseAppDataCredentialProtectedDirForSystemUser;
3775     }
3776 
3777     public String getBaseAppDataDeviceProtectedDirForSystemUser() {
3778         return mBaseAppDataDeviceProtectedDirForSystemUser;
3779     }
3780 
3781     @Override
3782     public PackageImpl addFeatureFlag(
3783             @NonNull String flagPackageAndName,
3784             @Nullable Boolean flagValue) {
3785         mFeatureFlagState.put(flagPackageAndName, flagValue);
3786         return this;
3787     }
3788 
3789     public Map<String, Boolean> getFeatureFlagState() {
3790         return mFeatureFlagState;
3791     }
3792 
3793     /**
3794      * Flags used for a internal bitset. These flags should never be persisted or exposed outside
3795      * of this class. It is expected that PackageCacher explicitly clears itself whenever the
3796      * Parcelable implementation changes such that all these flags can be re-ordered or invalidated.
3797      */
3798     private static class Booleans {
3799         @LongDef({
3800                 EXTERNAL_STORAGE,
3801                 HARDWARE_ACCELERATED,
3802                 ALLOW_BACKUP,
3803                 KILL_AFTER_RESTORE,
3804                 RESTORE_ANY_VERSION,
3805                 FULL_BACKUP_ONLY,
3806                 PERSISTENT,
3807                 DEBUGGABLE,
3808                 VM_SAFE_MODE,
3809                 HAS_CODE,
3810                 ALLOW_TASK_REPARENTING,
3811                 ALLOW_CLEAR_USER_DATA,
3812                 LARGE_HEAP,
3813                 USES_CLEARTEXT_TRAFFIC,
3814                 SUPPORTS_RTL,
3815                 TEST_ONLY,
3816                 MULTI_ARCH,
3817                 EXTRACT_NATIVE_LIBS,
3818                 GAME,
3819                 STATIC_SHARED_LIBRARY,
3820                 OVERLAY,
3821                 ISOLATED_SPLIT_LOADING,
3822                 HAS_DOMAIN_URLS,
3823                 PROFILEABLE_BY_SHELL,
3824                 BACKUP_IN_FOREGROUND,
3825                 USE_EMBEDDED_DEX,
3826                 DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
3827                 DIRECT_BOOT_AWARE,
3828                 PARTIALLY_DIRECT_BOOT_AWARE,
3829                 RESIZEABLE_ACTIVITY_VIA_SDK_VERSION,
3830                 ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE,
3831                 ALLOW_AUDIO_PLAYBACK_CAPTURE,
3832                 REQUEST_LEGACY_EXTERNAL_STORAGE,
3833                 USES_NON_SDK_API,
3834                 HAS_FRAGILE_USER_DATA,
3835                 CANT_SAVE_STATE,
3836                 ALLOW_NATIVE_HEAP_POINTER_TAGGING,
3837                 PRESERVE_LEGACY_EXTERNAL_STORAGE,
3838                 REQUIRED_FOR_ALL_USERS,
3839                 OVERLAY_IS_STATIC,
3840                 USE_32_BIT_ABI,
3841                 VISIBLE_TO_INSTANT_APPS,
3842                 FORCE_QUERYABLE,
3843                 CROSS_PROFILE,
3844                 ENABLED,
3845                 DISALLOW_PROFILING,
3846                 REQUEST_FOREGROUND_SERVICE_EXEMPTION,
3847                 ATTRIBUTIONS_ARE_USER_VISIBLE,
3848                 RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED,
3849                 SDK_LIBRARY,
3850                 CORE_APP,
3851                 SYSTEM,
3852                 FACTORY_TEST,
3853                 SYSTEM_EXT,
3854                 PRIVILEGED,
3855                 OEM,
3856                 VENDOR,
3857                 PRODUCT,
3858                 ODM,
3859                 SIGNED_WITH_PLATFORM_KEY,
3860                 NATIVE_LIBRARY_ROOT_REQUIRES_ISA,
3861         })
3862         public @interface Flags {}
3863 
3864         private static final long EXTERNAL_STORAGE = 1L;
3865         private static final long HARDWARE_ACCELERATED = 1L << 1;
3866         private static final long ALLOW_BACKUP = 1L << 2;
3867         private static final long KILL_AFTER_RESTORE = 1L << 3;
3868         private static final long RESTORE_ANY_VERSION = 1L << 4;
3869         private static final long FULL_BACKUP_ONLY = 1L << 5;
3870         private static final long PERSISTENT = 1L << 6;
3871         private static final long DEBUGGABLE = 1L << 7;
3872         private static final long VM_SAFE_MODE = 1L << 8;
3873         private static final long HAS_CODE = 1L << 9;
3874         private static final long ALLOW_TASK_REPARENTING = 1L << 10;
3875         private static final long ALLOW_CLEAR_USER_DATA = 1L << 11;
3876         private static final long LARGE_HEAP = 1L << 12;
3877         private static final long USES_CLEARTEXT_TRAFFIC = 1L << 13;
3878         private static final long SUPPORTS_RTL = 1L << 14;
3879         private static final long TEST_ONLY = 1L << 15;
3880         private static final long MULTI_ARCH = 1L << 16;
3881         private static final long EXTRACT_NATIVE_LIBS = 1L << 17;
3882         private static final long GAME = 1L << 18;
3883         private static final long STATIC_SHARED_LIBRARY = 1L << 19;
3884         private static final long OVERLAY = 1L << 20;
3885         private static final long ISOLATED_SPLIT_LOADING = 1L << 21;
3886         private static final long HAS_DOMAIN_URLS = 1L << 22;
3887         private static final long PROFILEABLE_BY_SHELL = 1L << 23;
3888         private static final long BACKUP_IN_FOREGROUND = 1L << 24;
3889         private static final long USE_EMBEDDED_DEX = 1L << 25;
3890         private static final long DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1L << 26;
3891         private static final long DIRECT_BOOT_AWARE = 1L << 27;
3892         private static final long PARTIALLY_DIRECT_BOOT_AWARE = 1L << 28;
3893         private static final long RESIZEABLE_ACTIVITY_VIA_SDK_VERSION = 1L << 29;
3894         private static final long ALLOW_CLEAR_USER_DATA_ON_FAILED_RESTORE = 1L << 30;
3895         private static final long ALLOW_AUDIO_PLAYBACK_CAPTURE = 1L << 31;
3896         private static final long REQUEST_LEGACY_EXTERNAL_STORAGE = 1L << 32;
3897         private static final long USES_NON_SDK_API = 1L << 33;
3898         private static final long HAS_FRAGILE_USER_DATA = 1L << 34;
3899         private static final long CANT_SAVE_STATE = 1L << 35;
3900         private static final long ALLOW_NATIVE_HEAP_POINTER_TAGGING = 1L << 36;
3901         private static final long PRESERVE_LEGACY_EXTERNAL_STORAGE = 1L << 37;
3902         private static final long REQUIRED_FOR_ALL_USERS = 1L << 38;
3903         private static final long OVERLAY_IS_STATIC = 1L << 39;
3904         private static final long USE_32_BIT_ABI = 1L << 40;
3905         private static final long VISIBLE_TO_INSTANT_APPS = 1L << 41;
3906         private static final long FORCE_QUERYABLE = 1L << 42;
3907         private static final long CROSS_PROFILE = 1L << 43;
3908         private static final long ENABLED = 1L << 44;
3909         private static final long DISALLOW_PROFILING = 1L << 45;
3910         private static final long REQUEST_FOREGROUND_SERVICE_EXEMPTION = 1L << 46;
3911         private static final long ATTRIBUTIONS_ARE_USER_VISIBLE = 1L << 47;
3912         private static final long RESET_ENABLED_SETTINGS_ON_APP_DATA_CLEARED = 1L << 48;
3913         private static final long SDK_LIBRARY = 1L << 49;
3914         private static final long ENABLE_ON_BACK_INVOKED_CALLBACK = 1L << 50;
3915         private static final long LEAVING_SHARED_UID = 1L << 51;
3916         private static final long CORE_APP = 1L << 52;
3917         private static final long SYSTEM = 1L << 53;
3918         private static final long FACTORY_TEST = 1L << 54;
3919         private static final long SYSTEM_EXT = 1L << 56;
3920         private static final long PRIVILEGED = 1L << 57;
3921         private static final long OEM = 1L << 58;
3922         private static final long VENDOR = 1L << 59;
3923         private static final long PRODUCT = 1L << 60;
3924         private static final long ODM = 1L << 61;
3925         private static final long SIGNED_WITH_PLATFORM_KEY = 1L << 62;
3926         private static final long NATIVE_LIBRARY_ROOT_REQUIRES_ISA = 1L << 63;
3927     }
3928 
3929     private static class Booleans2 {
3930         @LongDef({
3931                 STUB,
3932                 APEX,
3933                 UPDATABLE_SYSTEM,
3934         })
3935         public @interface Flags {}
3936 
3937         private static final long STUB = 1L;
3938         private static final long APEX = 1L << 1;
3939         private static final long UPDATABLE_SYSTEM = 1L << 2;
3940     }
3941 }
3942