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