1 /* 2 * Copyright (C) 2021 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; 18 19 import static android.content.pm.PackageInstaller.SessionParams.USER_ACTION_UNSPECIFIED; 20 import static android.content.pm.PackageManager.INSTALL_REASON_UNKNOWN; 21 import static android.content.pm.PackageManager.INSTALL_SCENARIO_DEFAULT; 22 import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; 23 import static android.os.Process.INVALID_UID; 24 25 import static com.android.server.art.model.DexoptResult.DexContainerFileDexoptResult; 26 import static com.android.server.art.model.DexoptResult.PackageDexoptResult; 27 import static com.android.server.pm.PackageManagerService.EMPTY_INT_ARRAY; 28 import static com.android.server.pm.PackageManagerService.SCAN_AS_INSTANT_APP; 29 import static com.android.server.pm.PackageManagerService.TAG; 30 31 import android.annotation.NonNull; 32 import android.annotation.Nullable; 33 import android.apex.ApexInfo; 34 import android.app.AppOpsManager; 35 import android.content.pm.ArchivedPackageParcel; 36 import android.content.pm.DataLoaderType; 37 import android.content.pm.IPackageInstallObserver2; 38 import android.content.pm.PackageInstaller; 39 import android.content.pm.PackageManager; 40 import android.content.pm.SharedLibraryInfo; 41 import android.content.pm.SigningDetails; 42 import android.content.pm.parsing.PackageLite; 43 import android.content.pm.verify.domain.DomainSet; 44 import android.net.Uri; 45 import android.os.Build; 46 import android.os.Process; 47 import android.os.UserHandle; 48 import android.util.ArrayMap; 49 import android.util.ExceptionUtils; 50 import android.util.Slog; 51 import android.util.SparseArray; 52 53 import com.android.internal.pm.parsing.pkg.ParsedPackage; 54 import com.android.internal.pm.pkg.parsing.ParsingPackageUtils; 55 import com.android.internal.util.ArrayUtils; 56 import com.android.server.art.model.DexoptResult; 57 import com.android.server.pm.pkg.AndroidPackage; 58 import com.android.server.pm.pkg.PackageState; 59 import com.android.server.pm.pkg.PackageStateInternal; 60 import com.android.server.pm.pkg.PackageUserStateInternal; 61 62 import java.io.File; 63 import java.util.ArrayList; 64 import java.util.LinkedHashSet; 65 import java.util.List; 66 67 final class InstallRequest { 68 private final int mUserId; 69 @Nullable 70 private final InstallArgs mInstallArgs; 71 @Nullable 72 private Runnable mPostInstallRunnable; 73 @Nullable 74 private PackageRemovedInfo mRemovedInfo; 75 76 @PackageManagerService.ScanFlags 77 private int mScanFlags; 78 @ParsingPackageUtils.ParseFlags 79 private int mParseFlags; 80 private boolean mReplace; 81 82 @Nullable /* The original package's name if it is being replaced, otherwise {@code null} */ 83 private String mExistingPackageName; 84 /** parsed package to be scanned */ 85 @Nullable 86 private ParsedPackage mParsedPackage; 87 @Nullable 88 private ArchivedPackageParcel mArchivedPackage; 89 private boolean mClearCodeCache; 90 private boolean mSystem; 91 @Nullable 92 private PackageSetting mOriginalPs; 93 @Nullable 94 private PackageSetting mDisabledPs; 95 96 /** Package Installed Info */ 97 @Nullable 98 private String mName; 99 private int mAppId = INVALID_UID; 100 // The set of users that originally had this package installed. 101 @Nullable 102 private int[] mOrigUsers; 103 // The set of users that now have this package installed. 104 @Nullable 105 private int[] mNewUsers; 106 @Nullable 107 private AndroidPackage mPkg; 108 @Nullable 109 private PackageLite mPackageLite; 110 private int mReturnCode; 111 private int mInternalErrorCode; 112 @Nullable 113 private String mReturnMsg; 114 // The set of packages consuming this shared library or null if no consumers exist. 115 @Nullable 116 private ArrayList<AndroidPackage> mLibraryConsumers; 117 @Nullable 118 private PackageFreezer mFreezer; 119 /** The package this package replaces */ 120 @Nullable 121 private String mOrigPackage; 122 @Nullable 123 private String mOrigPermission; 124 // The ApexInfo returned by ApexManager#installPackage, used by rebootless APEX install 125 @Nullable 126 private ApexInfo mApexInfo; 127 128 /** 129 * For tracking {@link PackageState#getApexModuleName()}. 130 */ 131 @Nullable 132 private String mApexModuleName; 133 134 /** 135 * The title of the responsible installer for the archive behavior used 136 */ 137 @Nullable 138 private SparseArray<String> mResponsibleInstallerTitles; 139 140 @Nullable 141 private ScanResult mScanResult; 142 143 private boolean mIsInstallInherit; 144 private boolean mIsInstallForUsers; 145 146 @Nullable 147 private final PackageMetrics mPackageMetrics; 148 private final int mSessionId; 149 private final int mRequireUserAction; 150 151 private int mDexoptStatus; 152 153 @NonNull 154 private int[] mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; 155 @NonNull 156 private int[] mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; 157 @NonNull 158 private int[] mUpdateBroadcastUserIds = EMPTY_INT_ARRAY; 159 @NonNull 160 private int[] mUpdateBroadcastInstantUserIds = EMPTY_INT_ARRAY; 161 162 @NonNull 163 private final ArrayList<String> mWarnings = new ArrayList<>(); 164 165 @Nullable 166 private DomainSet mPreVerifiedDomains; 167 168 private int mInstallerUidForInstallExisting = INVALID_UID; 169 170 private final boolean mHasAppMetadataFileFromInstaller; 171 172 private boolean mKeepArtProfile = false; 173 private final boolean mDependencyInstallerEnabled; 174 private final int mMissingSharedLibraryCount; 175 176 // New install InstallRequest(InstallingSession params)177 InstallRequest(InstallingSession params) { 178 mUserId = params.getUser().getIdentifier(); 179 mInstallArgs = new InstallArgs(params.mOriginInfo, params.mMoveInfo, params.mObserver, 180 params.mInstallFlags, params.mDevelopmentInstallFlags, params.mInstallSource, 181 params.mVolumeUuid, params.getUser(), null /*instructionSets*/, 182 params.mPackageAbiOverride, params.mPermissionStates, 183 params.mAllowlistedRestrictedPermissions, params.mAutoRevokePermissionsMode, 184 params.mTraceMethod, params.mTraceCookie, params.mSigningDetails, 185 params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride, 186 params.mDataLoaderType, params.mPackageSource, 187 params.mApplicationEnabledSettingPersistent, params.mDexoptCompilerFilter); 188 mPackageLite = params.mPackageLite; 189 mPackageMetrics = new PackageMetrics(this); 190 mIsInstallInherit = params.mIsInherit; 191 mSessionId = params.mSessionId; 192 mRequireUserAction = params.mRequireUserAction; 193 mPreVerifiedDomains = params.mPreVerifiedDomains; 194 mHasAppMetadataFileFromInstaller = params.mHasAppMetadataFile; 195 mDependencyInstallerEnabled = params.mDependencyInstallerEnabled; 196 mMissingSharedLibraryCount = params.mMissingSharedLibraryCount; 197 } 198 199 // Install existing package as user InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers, Runnable runnable, int appId, int installerUid, boolean isSystem)200 InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers, 201 Runnable runnable, int appId, int installerUid, boolean isSystem) { 202 mUserId = userId; 203 mInstallArgs = null; 204 mReturnCode = returnCode; 205 mPkg = pkg; 206 mNewUsers = newUsers; 207 mPostInstallRunnable = runnable; 208 mPackageMetrics = new PackageMetrics(this); 209 mIsInstallForUsers = true; 210 mSessionId = -1; 211 mRequireUserAction = USER_ACTION_UNSPECIFIED; 212 mAppId = appId; 213 mInstallerUidForInstallExisting = installerUid; 214 mSystem = isSystem; 215 mHasAppMetadataFileFromInstaller = false; 216 mDependencyInstallerEnabled = false; 217 mMissingSharedLibraryCount = 0; 218 } 219 220 // addForInit InstallRequest(ParsedPackage parsedPackage, int parseFlags, int scanFlags, @Nullable UserHandle user, ScanResult scanResult, PackageSetting disabledPs)221 InstallRequest(ParsedPackage parsedPackage, int parseFlags, int scanFlags, 222 @Nullable UserHandle user, ScanResult scanResult, PackageSetting disabledPs) { 223 if (user != null) { 224 mUserId = user.getIdentifier(); 225 } else { 226 // APEX 227 mUserId = UserHandle.USER_SYSTEM; 228 } 229 mInstallArgs = null; 230 mParsedPackage = parsedPackage; 231 mArchivedPackage = null; 232 mParseFlags = parseFlags; 233 mScanFlags = scanFlags; 234 mScanResult = scanResult; 235 mPackageMetrics = null; // No logging from this code path 236 mSessionId = -1; 237 mRequireUserAction = USER_ACTION_UNSPECIFIED; 238 mDisabledPs = disabledPs; 239 mHasAppMetadataFileFromInstaller = false; 240 mDependencyInstallerEnabled = false; 241 mMissingSharedLibraryCount = 0; 242 } 243 244 @Nullable getName()245 public String getName() { 246 return mName; 247 } 248 249 @Nullable getReturnMsg()250 public String getReturnMsg() { 251 return mReturnMsg; 252 } 253 254 @Nullable getOriginInfo()255 public OriginInfo getOriginInfo() { 256 return mInstallArgs == null ? null : mInstallArgs.mOriginInfo; 257 } 258 259 @Nullable getRemovedInfo()260 public PackageRemovedInfo getRemovedInfo() { 261 return mRemovedInfo; 262 } 263 264 @Nullable getOrigPackage()265 public String getOrigPackage() { 266 return mOrigPackage; 267 } 268 269 @Nullable getOrigPermission()270 public String getOrigPermission() { 271 return mOrigPermission; 272 } 273 274 @Nullable getCodeFile()275 public File getCodeFile() { 276 return mInstallArgs == null ? null : mInstallArgs.mCodeFile; 277 } 278 279 @Nullable getCodePath()280 public String getCodePath() { 281 return (mInstallArgs != null && mInstallArgs.mCodeFile != null) 282 ? mInstallArgs.mCodeFile.getAbsolutePath() : null; 283 } 284 285 @Nullable getAbiOverride()286 public String getAbiOverride() { 287 return mInstallArgs == null ? null : mInstallArgs.mAbiOverride; 288 } 289 getReturnCode()290 public int getReturnCode() { 291 return mReturnCode; 292 } 293 getInternalErrorCode()294 public int getInternalErrorCode() { 295 return mInternalErrorCode; 296 } 297 298 @Nullable getObserver()299 public IPackageInstallObserver2 getObserver() { 300 return mInstallArgs == null ? null : mInstallArgs.mObserver; 301 } 302 isInstallMove()303 public boolean isInstallMove() { 304 return mInstallArgs != null && mInstallArgs.mMoveInfo != null; 305 } 306 307 @Nullable getMoveToUuid()308 public String getMoveToUuid() { 309 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 310 ? mInstallArgs.mMoveInfo.mToUuid : null; 311 } 312 313 @Nullable getMovePackageName()314 public String getMovePackageName() { 315 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 316 ? mInstallArgs.mMoveInfo.mPackageName : null; 317 } 318 319 @Nullable getMoveFromCodePath()320 public String getMoveFromCodePath() { 321 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 322 ? mInstallArgs.mMoveInfo.mFromCodePath : null; 323 } 324 325 @Nullable getOldCodeFile()326 public File getOldCodeFile() { 327 return (mRemovedInfo != null && mRemovedInfo.mArgs != null) 328 ? mRemovedInfo.mArgs.getCodeFile() : null; 329 } 330 331 @Nullable getOldInstructionSet()332 public String[] getOldInstructionSet() { 333 return (mRemovedInfo != null && mRemovedInfo.mArgs != null) 334 ? mRemovedInfo.mArgs.getInstructionSets() : null; 335 } 336 getUser()337 public UserHandle getUser() { 338 return new UserHandle(mUserId); 339 } 340 getUserId()341 public int getUserId() { 342 return mUserId; 343 } 344 getInstallFlags()345 public int getInstallFlags() { 346 return mInstallArgs == null ? 0 : mInstallArgs.mInstallFlags; 347 } 348 getDevelopmentInstallFlags()349 public int getDevelopmentInstallFlags() { 350 return mInstallArgs == null ? 0 : mInstallArgs.mDevelopmentInstallFlags; 351 } 352 getInstallReason()353 public int getInstallReason() { 354 return mInstallArgs == null ? INSTALL_REASON_UNKNOWN : mInstallArgs.mInstallReason; 355 } 356 357 @Nullable getVolumeUuid()358 public String getVolumeUuid() { 359 return mInstallArgs == null ? null : mInstallArgs.mVolumeUuid; 360 } 361 362 @Nullable getPkg()363 public AndroidPackage getPkg() { 364 return mPkg; 365 } 366 367 @Nullable getPackageLite()368 public PackageLite getPackageLite() { 369 return mPackageLite; 370 } 371 372 @Nullable getTraceMethod()373 public String getTraceMethod() { 374 return mInstallArgs == null ? null : mInstallArgs.mTraceMethod; 375 } 376 getTraceCookie()377 public int getTraceCookie() { 378 return mInstallArgs == null ? 0 : mInstallArgs.mTraceCookie; 379 } 380 isUpdate()381 public boolean isUpdate() { 382 return mRemovedInfo != null && mRemovedInfo.mRemovedPackage != null; 383 } 384 isArchived()385 public boolean isArchived() { 386 return PackageInstallerSession.isArchivedInstallation(getInstallFlags()); 387 } 388 hasAppMetadataFile()389 public boolean hasAppMetadataFile() { 390 return mHasAppMetadataFileFromInstaller; 391 } 392 393 @Nullable getRemovedPackage()394 public String getRemovedPackage() { 395 return mRemovedInfo != null ? mRemovedInfo.mRemovedPackage : null; 396 } 397 isInstallExistingForUser()398 public boolean isInstallExistingForUser() { 399 return mInstallArgs == null; 400 } 401 402 @Nullable getInstallSource()403 public InstallSource getInstallSource() { 404 return mInstallArgs == null ? null : mInstallArgs.mInstallSource; 405 } 406 407 @Nullable getInstallerPackageName()408 public String getInstallerPackageName() { 409 return (mInstallArgs != null && mInstallArgs.mInstallSource != null) 410 ? mInstallArgs.mInstallSource.mInstallerPackageName : null; 411 } 412 getInstallerPackageUid()413 public int getInstallerPackageUid() { 414 return (mInstallArgs != null && mInstallArgs.mInstallSource != null) 415 ? mInstallArgs.mInstallSource.mInstallerPackageUid 416 : mInstallerUidForInstallExisting; 417 } 418 getDataLoaderType()419 public int getDataLoaderType() { 420 return mInstallArgs == null ? DataLoaderType.NONE : mInstallArgs.mDataLoaderType; 421 } 422 getSignatureSchemeVersion()423 public int getSignatureSchemeVersion() { 424 return mInstallArgs == null ? SigningDetails.SignatureSchemeVersion.UNKNOWN 425 : mInstallArgs.mSigningDetails.getSignatureSchemeVersion(); 426 } 427 428 @NonNull getSigningDetails()429 public SigningDetails getSigningDetails() { 430 return mInstallArgs == null ? SigningDetails.UNKNOWN : mInstallArgs.mSigningDetails; 431 } 432 433 @Nullable getOriginUri()434 public Uri getOriginUri() { 435 return mInstallArgs == null ? null : Uri.fromFile(mInstallArgs.mOriginInfo.mResolvedFile); 436 } 437 438 @Nullable getApexInfo()439 public ApexInfo getApexInfo() { 440 return mApexInfo; 441 } 442 443 @Nullable getApexModuleName()444 public String getApexModuleName() { 445 return mApexModuleName; 446 } 447 448 @Nullable getResponsibleInstallerTitles()449 public SparseArray<String> getResponsibleInstallerTitles() { 450 return mResponsibleInstallerTitles; 451 } 452 isRollback()453 public boolean isRollback() { 454 return mInstallArgs != null 455 && mInstallArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK; 456 } 457 458 @Nullable getNewUsers()459 public int[] getNewUsers() { 460 return mNewUsers; 461 } 462 463 @Nullable getOriginUsers()464 public int[] getOriginUsers() { 465 return mOrigUsers; 466 } 467 getAppId()468 public int getAppId() { 469 return mAppId; 470 } 471 472 @Nullable getPermissionStates()473 public ArrayMap<String, Integer> getPermissionStates() { 474 return mInstallArgs == null ? null : mInstallArgs.mPermissionStates; 475 } 476 477 @Nullable getLibraryConsumers()478 public ArrayList<AndroidPackage> getLibraryConsumers() { 479 return mLibraryConsumers; 480 } 481 482 @Nullable getAllowlistedRestrictedPermissions()483 public List<String> getAllowlistedRestrictedPermissions() { 484 return mInstallArgs == null ? null : mInstallArgs.mAllowlistedRestrictedPermissions; 485 } 486 getAutoRevokePermissionsMode()487 public int getAutoRevokePermissionsMode() { 488 return mInstallArgs == null 489 ? AppOpsManager.MODE_DEFAULT : mInstallArgs.mAutoRevokePermissionsMode; 490 } 491 getPackageSource()492 public int getPackageSource() { 493 return mInstallArgs == null 494 ? PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED : mInstallArgs.mPackageSource; 495 } 496 getInstallScenario()497 public int getInstallScenario() { 498 return mInstallArgs == null ? INSTALL_SCENARIO_DEFAULT : mInstallArgs.mInstallScenario; 499 } 500 501 @Nullable getParsedPackage()502 public ParsedPackage getParsedPackage() { 503 return mParsedPackage; 504 } 505 506 @Nullable getArchivedPackage()507 public ArchivedPackageParcel getArchivedPackage() { return mArchivedPackage; } 508 509 @ParsingPackageUtils.ParseFlags getParseFlags()510 public int getParseFlags() { 511 return mParseFlags; 512 } 513 514 @PackageManagerService.ScanFlags getScanFlags()515 public int getScanFlags() { 516 return mScanFlags; 517 } 518 519 @Nullable getExistingPackageName()520 public String getExistingPackageName() { 521 return mExistingPackageName; 522 } 523 524 @Nullable getScanRequestOldPackage()525 public AndroidPackage getScanRequestOldPackage() { 526 assertScanResultExists(); 527 return mScanResult.mRequest.mOldPkg; 528 } 529 isClearCodeCache()530 public boolean isClearCodeCache() { 531 return mClearCodeCache; 532 } 533 isInstallReplace()534 public boolean isInstallReplace() { 535 return mReplace; 536 } 537 isInstallSystem()538 public boolean isInstallSystem() { 539 return mSystem; 540 } 541 isInstallInherit()542 public boolean isInstallInherit() { 543 return mIsInstallInherit; 544 } 545 isInstallForUsers()546 public boolean isInstallForUsers() { 547 return mIsInstallForUsers; 548 } 549 isInstallFromAdb()550 public boolean isInstallFromAdb() { 551 return mInstallArgs != null 552 && (mInstallArgs.mInstallFlags & PackageManager.INSTALL_FROM_ADB) != 0; 553 } 554 555 @Nullable getOriginalPackageSetting()556 public PackageSetting getOriginalPackageSetting() { 557 return mOriginalPs; 558 } 559 560 @Nullable getDisabledPackageSetting()561 public PackageSetting getDisabledPackageSetting() { 562 return mDisabledPs; 563 } 564 565 @Nullable getScanRequestOldPackageSetting()566 public PackageSetting getScanRequestOldPackageSetting() { 567 assertScanResultExists(); 568 return mScanResult.mRequest.mOldPkgSetting; 569 } 570 571 @Nullable getScanRequestOriginalPackageSetting()572 public PackageSetting getScanRequestOriginalPackageSetting() { 573 assertScanResultExists(); 574 return mScanResult.mRequest.mOriginalPkgSetting; 575 } 576 577 @Nullable getScanRequestPackageSetting()578 public PackageSetting getScanRequestPackageSetting() { 579 assertScanResultExists(); 580 return mScanResult.mRequest.mPkgSetting; 581 } 582 583 @Nullable getScanRequestDisabledPackageSetting()584 public PackageSetting getScanRequestDisabledPackageSetting() { 585 assertScanResultExists(); 586 return mScanResult.mRequest.mDisabledPkgSetting; 587 } 588 589 @Nullable getRealPackageName()590 public String getRealPackageName() { 591 assertScanResultExists(); 592 return mScanResult.mRequest.mRealPkgName; 593 } 594 595 @Nullable getChangedAbiCodePath()596 public List<String> getChangedAbiCodePath() { 597 assertScanResultExists(); 598 return mScanResult.mChangedAbiCodePath; 599 } 600 isApplicationEnabledSettingPersistent()601 public boolean isApplicationEnabledSettingPersistent() { 602 return mInstallArgs == null ? false : mInstallArgs.mApplicationEnabledSettingPersistent; 603 } 604 isForceQueryableOverride()605 public boolean isForceQueryableOverride() { 606 return mInstallArgs != null && mInstallArgs.mForceQueryableOverride; 607 } 608 609 @Nullable getSdkSharedLibraryInfo()610 public SharedLibraryInfo getSdkSharedLibraryInfo() { 611 assertScanResultExists(); 612 return mScanResult.mSdkSharedLibraryInfo; 613 } 614 615 @Nullable getStaticSharedLibraryInfo()616 public SharedLibraryInfo getStaticSharedLibraryInfo() { 617 assertScanResultExists(); 618 return mScanResult.mStaticSharedLibraryInfo; 619 } 620 621 @Nullable getDynamicSharedLibraryInfos()622 public List<SharedLibraryInfo> getDynamicSharedLibraryInfos() { 623 assertScanResultExists(); 624 return mScanResult.mDynamicSharedLibraryInfos; 625 } 626 updateAllCodePaths(List<String> paths)627 public void updateAllCodePaths(List<String> paths) { 628 if (mScanResult.mSdkSharedLibraryInfo != null) { 629 mScanResult.mSdkSharedLibraryInfo.setAllCodePaths(paths); 630 } 631 if (mScanResult.mStaticSharedLibraryInfo != null) { 632 mScanResult.mStaticSharedLibraryInfo.setAllCodePaths(paths); 633 } 634 if (mScanResult.mDynamicSharedLibraryInfos != null) { 635 for (SharedLibraryInfo info : mScanResult.mDynamicSharedLibraryInfos) { 636 info.setAllCodePaths(paths); 637 } 638 } 639 } 640 641 @Nullable getScannedPackageSetting()642 public PackageSetting getScannedPackageSetting() { 643 assertScanResultExists(); 644 return mScanResult.mPkgSetting; 645 } 646 isExistingSettingCopied()647 public boolean isExistingSettingCopied() { 648 assertScanResultExists(); 649 return mScanResult.mExistingSettingCopied; 650 } 651 652 /** 653 * Whether the original PackageSetting needs to be updated with 654 * a new app ID. Useful when leaving a sharedUserId. 655 */ needsNewAppId()656 public boolean needsNewAppId() { 657 assertScanResultExists(); 658 return mScanResult.mPreviousAppId != Process.INVALID_UID; 659 } 660 getPreviousAppId()661 public int getPreviousAppId() { 662 assertScanResultExists(); 663 return mScanResult.mPreviousAppId; 664 } 665 isPlatformPackage()666 public boolean isPlatformPackage() { 667 assertScanResultExists(); 668 return mScanResult.mRequest.mIsPlatformPackage; 669 } 670 isInstantInstall()671 public boolean isInstantInstall() { 672 return (mScanFlags & SCAN_AS_INSTANT_APP) != 0; 673 } 674 assertScanResultExists()675 public void assertScanResultExists() { 676 if (mScanResult == null) { 677 // Should not happen. This indicates a bug in the installation code flow 678 if (Build.IS_USERDEBUG || Build.IS_ENG) { 679 throw new IllegalStateException("ScanResult cannot be null."); 680 } else { 681 Slog.e(TAG, "ScanResult is null and it should not happen"); 682 } 683 } 684 } 685 getSessionId()686 public int getSessionId() { 687 return mSessionId; 688 } 689 getRequireUserAction()690 public int getRequireUserAction() { 691 return mRequireUserAction; 692 } 693 getDexoptStatus()694 public int getDexoptStatus() { 695 return mDexoptStatus; 696 } 697 isAllNewUsers()698 public boolean isAllNewUsers() { 699 return mOrigUsers == null || mOrigUsers.length == 0; 700 } getFirstTimeBroadcastUserIds()701 public int[] getFirstTimeBroadcastUserIds() { 702 return mFirstTimeBroadcastUserIds; 703 } 704 getFirstTimeBroadcastInstantUserIds()705 public int[] getFirstTimeBroadcastInstantUserIds() { 706 return mFirstTimeBroadcastInstantUserIds; 707 } 708 getUpdateBroadcastUserIds()709 public int[] getUpdateBroadcastUserIds() { 710 return mUpdateBroadcastUserIds; 711 } 712 getUpdateBroadcastInstantUserIds()713 public int[] getUpdateBroadcastInstantUserIds() { 714 return mUpdateBroadcastInstantUserIds; 715 } 716 717 @NonNull getWarnings()718 public ArrayList<String> getWarnings() { 719 return mWarnings; 720 } 721 722 @Nullable getDexoptCompilerFilter()723 public String getDexoptCompilerFilter() { 724 return mInstallArgs != null ? mInstallArgs.mDexoptCompilerFilter : null; 725 } 726 setScanFlags(int scanFlags)727 public void setScanFlags(int scanFlags) { 728 mScanFlags = scanFlags; 729 } 730 closeFreezer()731 public void closeFreezer() { 732 if (mFreezer != null) { 733 mFreezer.close(); 734 } 735 } 736 setPostInstallRunnable(Runnable runnable)737 public void setPostInstallRunnable(Runnable runnable) { 738 mPostInstallRunnable = runnable; 739 } 740 hasPostInstallRunnable()741 public boolean hasPostInstallRunnable() { 742 return mPostInstallRunnable != null; 743 } 744 runPostInstallRunnable()745 public void runPostInstallRunnable() { 746 if (mPostInstallRunnable != null) { 747 mPostInstallRunnable.run(); 748 } 749 } 750 setCodeFile(File codeFile)751 public void setCodeFile(File codeFile) { 752 if (mInstallArgs != null) { 753 mInstallArgs.mCodeFile = codeFile; 754 } 755 } 756 setError(int code, String msg)757 public void setError(int code, String msg) { 758 setReturnCode(code); 759 setReturnMessage(msg); 760 Slog.w(TAG, msg); 761 if (mPackageMetrics != null) { 762 mPackageMetrics.onInstallFailed(); 763 } 764 } 765 setError(PackageManagerException e)766 public void setError(PackageManagerException e) { 767 setError(null, e); 768 } 769 setError(String msg, PackageManagerException e)770 public void setError(String msg, PackageManagerException e) { 771 mInternalErrorCode = e.internalErrorCode; 772 mReturnCode = e.error; 773 setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); 774 Slog.w(TAG, msg, e); 775 if (mPackageMetrics != null) { 776 mPackageMetrics.onInstallFailed(); 777 } 778 } 779 setReturnCode(int returnCode)780 public void setReturnCode(int returnCode) { 781 mReturnCode = returnCode; 782 } 783 setReturnMessage(String returnMsg)784 public void setReturnMessage(String returnMsg) { 785 mReturnMsg = returnMsg; 786 } 787 setApexInfo(ApexInfo apexInfo)788 public void setApexInfo(ApexInfo apexInfo) { 789 mApexInfo = apexInfo; 790 } 791 setApexModuleName(@ullable String apexModuleName)792 public void setApexModuleName(@Nullable String apexModuleName) { 793 mApexModuleName = apexModuleName; 794 } 795 setResponsibleInstallerTitles( @onNull SparseArray<String> responsibleInstallerTitles)796 public void setResponsibleInstallerTitles( 797 @NonNull SparseArray<String> responsibleInstallerTitles) { 798 mResponsibleInstallerTitles = responsibleInstallerTitles; 799 } 800 setPkg(AndroidPackage pkg)801 public void setPkg(AndroidPackage pkg) { 802 mPkg = pkg; 803 } 804 setAppId(int appId)805 public void setAppId(int appId) { 806 mAppId = appId; 807 } 808 setNewUsers(int[] newUsers)809 public void setNewUsers(int[] newUsers) { 810 mNewUsers = newUsers; 811 populateBroadcastUsers(); 812 } 813 setOriginPackage(String originPackage)814 public void setOriginPackage(String originPackage) { 815 mOrigPackage = originPackage; 816 } 817 setOriginPermission(String originPermission)818 public void setOriginPermission(String originPermission) { 819 mOrigPermission = originPermission; 820 } 821 setName(String packageName)822 public void setName(String packageName) { 823 mName = packageName; 824 } 825 setOriginUsers(int[] userIds)826 public void setOriginUsers(int[] userIds) { 827 mOrigUsers = userIds; 828 } 829 setFreezer(PackageFreezer freezer)830 public void setFreezer(PackageFreezer freezer) { 831 mFreezer = freezer; 832 } 833 setRemovedInfo(PackageRemovedInfo removedInfo)834 public void setRemovedInfo(PackageRemovedInfo removedInfo) { 835 mRemovedInfo = removedInfo; 836 } 837 setLibraryConsumers(ArrayList<AndroidPackage> libraryConsumers)838 public void setLibraryConsumers(ArrayList<AndroidPackage> libraryConsumers) { 839 mLibraryConsumers = libraryConsumers; 840 } 841 setPrepareResult(boolean replace, int scanFlags, int parseFlags, PackageState existingPackageState, ParsedPackage packageToScan, ArchivedPackageParcel archivedPackage, boolean clearCodeCache, boolean system, PackageSetting originalPs, PackageSetting disabledPs)842 public void setPrepareResult(boolean replace, int scanFlags, 843 int parseFlags, PackageState existingPackageState, 844 ParsedPackage packageToScan, ArchivedPackageParcel archivedPackage, 845 boolean clearCodeCache, boolean system, 846 PackageSetting originalPs, PackageSetting disabledPs) { 847 mReplace = replace; 848 mScanFlags = scanFlags; 849 mParseFlags = parseFlags; 850 mExistingPackageName = 851 existingPackageState != null ? existingPackageState.getPackageName() : null; 852 mParsedPackage = packageToScan; 853 mArchivedPackage = archivedPackage; 854 mClearCodeCache = clearCodeCache; 855 mSystem = system; 856 mOriginalPs = originalPs; 857 mDisabledPs = disabledPs; 858 } 859 setScanResult(@onNull ScanResult scanResult)860 public void setScanResult(@NonNull ScanResult scanResult) { 861 mScanResult = scanResult; 862 } 863 setScannedPackageSettingAppId(int appId)864 public void setScannedPackageSettingAppId(int appId) { 865 assertScanResultExists(); 866 mScanResult.mPkgSetting.setAppId(appId); 867 } 868 setScannedPackageSettingFirstInstallTimeFromReplaced( @ullable PackageStateInternal replacedPkgSetting, int[] userId)869 public void setScannedPackageSettingFirstInstallTimeFromReplaced( 870 @Nullable PackageStateInternal replacedPkgSetting, int[] userId) { 871 assertScanResultExists(); 872 if (replacedPkgSetting == null) { 873 return; 874 } 875 mScanResult.mPkgSetting.setFirstInstallTimeFromReplaced(replacedPkgSetting, userId); 876 } 877 setScannedPackageSettingLastUpdateTime(long lastUpdateTim)878 public void setScannedPackageSettingLastUpdateTime(long lastUpdateTim) { 879 assertScanResultExists(); 880 mScanResult.mPkgSetting.setLastUpdateTime(lastUpdateTim); 881 } 882 setScannedPackageSettingFirstInstallTime(long firstInstallTime)883 public void setScannedPackageSettingFirstInstallTime(long firstInstallTime) { 884 assertScanResultExists(); 885 PackageUserStateInternal userState = mScanResult.mPkgSetting.getUserStates().get(mUserId); 886 if (userState != null && userState.getFirstInstallTimeMillis() == 0) { 887 mScanResult.mPkgSetting.setFirstInstallTime(firstInstallTime, mUserId); 888 } 889 } 890 setRemovedAppId(int appId)891 public void setRemovedAppId(int appId) { 892 if (mRemovedInfo != null) { 893 mRemovedInfo.mUid = appId; 894 mRemovedInfo.mIsAppIdRemoved = true; 895 } 896 } 897 898 /** 899 * Determine the set of users who are adding this package for the first time (aka "new" users) 900 * vs. those who are seeing an update (aka "update" users). The lists can be calculated as soon 901 * as the "new" users are set. 902 */ populateBroadcastUsers()903 private void populateBroadcastUsers() { 904 assertScanResultExists(); 905 mFirstTimeBroadcastUserIds = EMPTY_INT_ARRAY; 906 mFirstTimeBroadcastInstantUserIds = EMPTY_INT_ARRAY; 907 mUpdateBroadcastUserIds = EMPTY_INT_ARRAY; 908 mUpdateBroadcastInstantUserIds = EMPTY_INT_ARRAY; 909 910 final boolean allNewUsers = isAllNewUsers(); 911 if (allNewUsers) { 912 // App was not currently installed on any user 913 for (int newUser : mNewUsers) { 914 final boolean isInstantApp = 915 mScanResult.mPkgSetting.getUserStateOrDefault(newUser).isInstantApp(); 916 if (isInstantApp) { 917 mFirstTimeBroadcastInstantUserIds = 918 ArrayUtils.appendInt(mFirstTimeBroadcastInstantUserIds, newUser); 919 } else { 920 mFirstTimeBroadcastUserIds = 921 ArrayUtils.appendInt(mFirstTimeBroadcastUserIds, newUser); 922 } 923 } 924 return; 925 } 926 // App was already installed on some users, but is new to some other users 927 for (int newUser : mNewUsers) { 928 boolean isFirstTimeUser = !ArrayUtils.contains(mOrigUsers, newUser); 929 final boolean isInstantApp = 930 mScanResult.mPkgSetting.getUserStateOrDefault(newUser).isInstantApp(); 931 if (isFirstTimeUser) { 932 if (isInstantApp) { 933 mFirstTimeBroadcastInstantUserIds = 934 ArrayUtils.appendInt(mFirstTimeBroadcastInstantUserIds, newUser); 935 } else { 936 mFirstTimeBroadcastUserIds = 937 ArrayUtils.appendInt(mFirstTimeBroadcastUserIds, newUser); 938 } 939 } else { 940 if (isInstantApp) { 941 mUpdateBroadcastInstantUserIds = 942 ArrayUtils.appendInt(mUpdateBroadcastInstantUserIds, newUser); 943 } else { 944 mUpdateBroadcastUserIds = 945 ArrayUtils.appendInt(mUpdateBroadcastUserIds, newUser); 946 } 947 } 948 } 949 } 950 951 @Nullable getPreVerifiedDomains()952 public DomainSet getPreVerifiedDomains() { 953 return mPreVerifiedDomains; 954 } 955 addWarning(@onNull String warning)956 public void addWarning(@NonNull String warning) { 957 mWarnings.add(warning); 958 } 959 onPrepareStarted()960 public void onPrepareStarted() { 961 if (mPackageMetrics != null) { 962 mPackageMetrics.onStepStarted(PackageMetrics.STEP_PREPARE); 963 } 964 } 965 onPrepareFinished()966 public void onPrepareFinished() { 967 if (mPackageMetrics != null) { 968 mPackageMetrics.onStepFinished(PackageMetrics.STEP_PREPARE); 969 } 970 } 971 onScanStarted()972 public void onScanStarted() { 973 if (mPackageMetrics != null) { 974 mPackageMetrics.onStepStarted(PackageMetrics.STEP_SCAN); 975 } 976 } 977 onScanFinished()978 public void onScanFinished() { 979 if (mPackageMetrics != null) { 980 mPackageMetrics.onStepFinished(PackageMetrics.STEP_SCAN); 981 } 982 } 983 onReconcileStarted()984 public void onReconcileStarted() { 985 if (mPackageMetrics != null) { 986 mPackageMetrics.onStepStarted(PackageMetrics.STEP_RECONCILE); 987 } 988 } 989 onReconcileFinished()990 public void onReconcileFinished() { 991 if (mPackageMetrics != null) { 992 mPackageMetrics.onStepFinished(PackageMetrics.STEP_RECONCILE); 993 } 994 } 995 onCommitStarted()996 public void onCommitStarted() { 997 if (mPackageMetrics != null) { 998 mPackageMetrics.onStepStarted(PackageMetrics.STEP_COMMIT); 999 } 1000 } 1001 onCommitFinished()1002 public void onCommitFinished() { 1003 if (mPackageMetrics != null) { 1004 mPackageMetrics.onStepFinished(PackageMetrics.STEP_COMMIT); 1005 } 1006 } 1007 onRestoreStarted()1008 public void onRestoreStarted() { 1009 if (mPackageMetrics != null) { 1010 mPackageMetrics.onStepStarted(PackageMetrics.STEP_RESTORE); 1011 } 1012 } 1013 onRestoreFinished()1014 public void onRestoreFinished() { 1015 if (mPackageMetrics != null) { 1016 mPackageMetrics.onStepFinished(PackageMetrics.STEP_RESTORE); 1017 } 1018 } 1019 onWaitDexoptStarted()1020 public void onWaitDexoptStarted() { 1021 if (mPackageMetrics != null) { 1022 mPackageMetrics.onStepStarted(PackageMetrics.STEP_WAIT_DEXOPT); 1023 } 1024 } 1025 onWaitDexoptFinished()1026 public void onWaitDexoptFinished() { 1027 if (mPackageMetrics != null) { 1028 mPackageMetrics.onStepFinished(PackageMetrics.STEP_WAIT_DEXOPT); 1029 } 1030 } 1031 onDexoptFinished(DexoptResult dexoptResult)1032 public void onDexoptFinished(DexoptResult dexoptResult) { 1033 // Only report external profile warnings when installing from adb. The goal is to warn app 1034 // developers if they have provided bad external profiles, so it's not beneficial to report 1035 // those warnings in the normal app install workflow. 1036 if (isInstallFromAdb()) { 1037 var externalProfileErrors = new LinkedHashSet<String>(); 1038 for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { 1039 for (DexContainerFileDexoptResult fileResult : 1040 packageResult.getDexContainerFileDexoptResults()) { 1041 externalProfileErrors.addAll(fileResult.getExternalProfileErrors()); 1042 } 1043 } 1044 if (!externalProfileErrors.isEmpty()) { 1045 addWarning("Error occurred during dexopt when processing external profiles:\n " 1046 + String.join("\n ", externalProfileErrors)); 1047 } 1048 } 1049 1050 // Report dexopt metrics. 1051 if (mPackageMetrics != null) { 1052 mDexoptStatus = dexoptResult.getFinalStatus(); 1053 if (mDexoptStatus == DexoptResult.DEXOPT_PERFORMED) { 1054 long durationMillis = 0; 1055 for (PackageDexoptResult packageResult : dexoptResult.getPackageDexoptResults()) { 1056 for (DexContainerFileDexoptResult fileResult : 1057 packageResult.getDexContainerFileDexoptResults()) { 1058 durationMillis += fileResult.getDex2oatWallTimeMillis(); 1059 } 1060 } 1061 mPackageMetrics.onStepFinished(PackageMetrics.STEP_DEXOPT, durationMillis); 1062 } 1063 } 1064 } 1065 onInstallCompleted()1066 public void onInstallCompleted() { 1067 if (getReturnCode() == INSTALL_SUCCEEDED) { 1068 if (mPackageMetrics != null) { 1069 mPackageMetrics.onInstallSucceed(); 1070 } 1071 } 1072 } 1073 onFreezeStarted()1074 public void onFreezeStarted() { 1075 if (mPackageMetrics != null) { 1076 mPackageMetrics.onStepStarted(PackageMetrics.STEP_FREEZE_INSTALL); 1077 } 1078 } 1079 onFreezeCompleted()1080 public void onFreezeCompleted() { 1081 if (mPackageMetrics != null) { 1082 mPackageMetrics.onStepFinished(PackageMetrics.STEP_FREEZE_INSTALL); 1083 } 1084 } 1085 setKeepArtProfile(boolean keepArtProfile)1086 void setKeepArtProfile(boolean keepArtProfile) { 1087 mKeepArtProfile = keepArtProfile; 1088 } 1089 isKeepArtProfile()1090 boolean isKeepArtProfile() { 1091 return mKeepArtProfile; 1092 } 1093 getMissingSharedLibraryCount()1094 int getMissingSharedLibraryCount() { 1095 return mMissingSharedLibraryCount; 1096 } 1097 isDependencyInstallerEnabled()1098 boolean isDependencyInstallerEnabled() { 1099 return mDependencyInstallerEnabled; 1100 } 1101 } 1102