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