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