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.pm.PackageManagerService.SCAN_AS_INSTANT_APP; 26 import static com.android.server.pm.PackageManagerService.TAG; 27 28 import android.annotation.NonNull; 29 import android.annotation.Nullable; 30 import android.apex.ApexInfo; 31 import android.app.AppOpsManager; 32 import android.content.pm.DataLoaderType; 33 import android.content.pm.IPackageInstallObserver2; 34 import android.content.pm.PackageInstaller; 35 import android.content.pm.PackageManager; 36 import android.content.pm.SharedLibraryInfo; 37 import android.content.pm.SigningDetails; 38 import android.net.Uri; 39 import android.os.Build; 40 import android.os.Process; 41 import android.os.UserHandle; 42 import android.util.ArrayMap; 43 import android.util.ExceptionUtils; 44 import android.util.Slog; 45 46 import com.android.server.art.model.DexoptResult; 47 import com.android.server.pm.parsing.pkg.ParsedPackage; 48 import com.android.server.pm.pkg.AndroidPackage; 49 import com.android.server.pm.pkg.PackageState; 50 import com.android.server.pm.pkg.PackageStateInternal; 51 import com.android.server.pm.pkg.parsing.ParsingPackageUtils; 52 53 import java.io.File; 54 import java.util.ArrayList; 55 import java.util.List; 56 57 final class InstallRequest { 58 private final int mUserId; 59 @Nullable 60 private final InstallArgs mInstallArgs; 61 @Nullable 62 private Runnable mPostInstallRunnable; 63 @Nullable 64 private PackageRemovedInfo mRemovedInfo; 65 66 @PackageManagerService.ScanFlags 67 private int mScanFlags; 68 @ParsingPackageUtils.ParseFlags 69 private int mParseFlags; 70 private boolean mReplace; 71 72 @Nullable /* The original Package if it is being replaced, otherwise {@code null} */ 73 private AndroidPackage mExistingPackage; 74 /** parsed package to be scanned */ 75 @Nullable 76 private ParsedPackage mParsedPackage; 77 private boolean mClearCodeCache; 78 private boolean mSystem; 79 @Nullable 80 private PackageSetting mOriginalPs; 81 @Nullable 82 private PackageSetting mDisabledPs; 83 84 /** Package Installed Info */ 85 @Nullable 86 private String mName; 87 private int mAppId = INVALID_UID; 88 // The set of users that originally had this package installed. 89 @Nullable 90 private int[] mOrigUsers; 91 // The set of users that now have this package installed. 92 @Nullable 93 private int[] mNewUsers; 94 @Nullable 95 private AndroidPackage mPkg; 96 private int mReturnCode; 97 private int mInternalErrorCode; 98 @Nullable 99 private String mReturnMsg; 100 // The set of packages consuming this shared library or null if no consumers exist. 101 @Nullable 102 private ArrayList<AndroidPackage> mLibraryConsumers; 103 @Nullable 104 private PackageFreezer mFreezer; 105 /** The package this package replaces */ 106 @Nullable 107 private String mOrigPackage; 108 @Nullable 109 private String mOrigPermission; 110 // The ApexInfo returned by ApexManager#installPackage, used by rebootless APEX install 111 @Nullable 112 private ApexInfo mApexInfo; 113 114 /** 115 * For tracking {@link PackageState#getApexModuleName()}. 116 */ 117 @Nullable 118 private String mApexModuleName; 119 120 @Nullable 121 private ScanResult mScanResult; 122 123 private boolean mIsInstallInherit; 124 private boolean mIsInstallForUsers; 125 126 @Nullable 127 private final PackageMetrics mPackageMetrics; 128 private final int mSessionId; 129 private final int mRequireUserAction; 130 131 private int mDexoptStatus; 132 133 // New install InstallRequest(InstallingSession params)134 InstallRequest(InstallingSession params) { 135 mUserId = params.getUser().getIdentifier(); 136 mInstallArgs = new InstallArgs(params.mOriginInfo, params.mMoveInfo, params.mObserver, 137 params.mInstallFlags, params.mInstallSource, params.mVolumeUuid, 138 params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride, 139 params.mPermissionStates, params.mAllowlistedRestrictedPermissions, 140 params.mAutoRevokePermissionsMode, params.mTraceMethod, params.mTraceCookie, 141 params.mSigningDetails, params.mInstallReason, params.mInstallScenario, 142 params.mForceQueryableOverride, params.mDataLoaderType, params.mPackageSource, 143 params.mApplicationEnabledSettingPersistent); 144 mPackageMetrics = new PackageMetrics(this); 145 mIsInstallInherit = params.mIsInherit; 146 mSessionId = params.mSessionId; 147 mRequireUserAction = params.mRequireUserAction; 148 } 149 150 // Install existing package as user InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers, Runnable runnable)151 InstallRequest(int userId, int returnCode, AndroidPackage pkg, int[] newUsers, 152 Runnable runnable) { 153 mUserId = userId; 154 mInstallArgs = null; 155 mReturnCode = returnCode; 156 mPkg = pkg; 157 mNewUsers = newUsers; 158 mPostInstallRunnable = runnable; 159 mPackageMetrics = new PackageMetrics(this); 160 mIsInstallForUsers = true; 161 mSessionId = -1; 162 mRequireUserAction = USER_ACTION_UNSPECIFIED; 163 } 164 165 // addForInit InstallRequest(ParsedPackage parsedPackage, int parseFlags, int scanFlags, @Nullable UserHandle user, ScanResult scanResult)166 InstallRequest(ParsedPackage parsedPackage, int parseFlags, int scanFlags, 167 @Nullable UserHandle user, ScanResult scanResult) { 168 if (user != null) { 169 mUserId = user.getIdentifier(); 170 } else { 171 // APEX 172 mUserId = UserHandle.USER_SYSTEM; 173 } 174 mInstallArgs = null; 175 mParsedPackage = parsedPackage; 176 mParseFlags = parseFlags; 177 mScanFlags = scanFlags; 178 mScanResult = scanResult; 179 mPackageMetrics = null; // No logging from this code path 180 mSessionId = -1; 181 mRequireUserAction = USER_ACTION_UNSPECIFIED; 182 } 183 184 @Nullable getName()185 public String getName() { 186 return mName; 187 } 188 189 @Nullable getReturnMsg()190 public String getReturnMsg() { 191 return mReturnMsg; 192 } 193 194 @Nullable getOriginInfo()195 public OriginInfo getOriginInfo() { 196 return mInstallArgs == null ? null : mInstallArgs.mOriginInfo; 197 } 198 199 @Nullable getRemovedInfo()200 public PackageRemovedInfo getRemovedInfo() { 201 return mRemovedInfo; 202 } 203 204 @Nullable getOrigPackage()205 public String getOrigPackage() { 206 return mOrigPackage; 207 } 208 209 @Nullable getOrigPermission()210 public String getOrigPermission() { 211 return mOrigPermission; 212 } 213 214 @Nullable getCodeFile()215 public File getCodeFile() { 216 return mInstallArgs == null ? null : mInstallArgs.mCodeFile; 217 } 218 219 @Nullable getCodePath()220 public String getCodePath() { 221 return (mInstallArgs != null && mInstallArgs.mCodeFile != null) 222 ? mInstallArgs.mCodeFile.getAbsolutePath() : null; 223 } 224 225 @Nullable getAbiOverride()226 public String getAbiOverride() { 227 return mInstallArgs == null ? null : mInstallArgs.mAbiOverride; 228 } 229 getReturnCode()230 public int getReturnCode() { 231 return mReturnCode; 232 } 233 getInternalErrorCode()234 public int getInternalErrorCode() { 235 return mInternalErrorCode; 236 } 237 238 @Nullable getObserver()239 public IPackageInstallObserver2 getObserver() { 240 return mInstallArgs == null ? null : mInstallArgs.mObserver; 241 } 242 isInstallMove()243 public boolean isInstallMove() { 244 return mInstallArgs != null && mInstallArgs.mMoveInfo != null; 245 } 246 247 @Nullable getMoveToUuid()248 public String getMoveToUuid() { 249 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 250 ? mInstallArgs.mMoveInfo.mToUuid : null; 251 } 252 253 @Nullable getMovePackageName()254 public String getMovePackageName() { 255 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 256 ? mInstallArgs.mMoveInfo.mPackageName : null; 257 } 258 259 @Nullable getMoveFromCodePath()260 public String getMoveFromCodePath() { 261 return (mInstallArgs != null && mInstallArgs.mMoveInfo != null) 262 ? mInstallArgs.mMoveInfo.mFromCodePath : null; 263 } 264 265 @Nullable getOldCodeFile()266 public File getOldCodeFile() { 267 return (mRemovedInfo != null && mRemovedInfo.mArgs != null) 268 ? mRemovedInfo.mArgs.mCodeFile : null; 269 } 270 271 @Nullable getOldInstructionSet()272 public String[] getOldInstructionSet() { 273 return (mRemovedInfo != null && mRemovedInfo.mArgs != null) 274 ? mRemovedInfo.mArgs.mInstructionSets : null; 275 } 276 getUser()277 public UserHandle getUser() { 278 return new UserHandle(mUserId); 279 } 280 getUserId()281 public int getUserId() { 282 return mUserId; 283 } 284 getInstallFlags()285 public int getInstallFlags() { 286 return mInstallArgs == null ? 0 : mInstallArgs.mInstallFlags; 287 } 288 getInstallReason()289 public int getInstallReason() { 290 return mInstallArgs == null ? INSTALL_REASON_UNKNOWN : mInstallArgs.mInstallReason; 291 } 292 293 @Nullable getVolumeUuid()294 public String getVolumeUuid() { 295 return mInstallArgs == null ? null : mInstallArgs.mVolumeUuid; 296 } 297 298 @Nullable getPkg()299 public AndroidPackage getPkg() { 300 return mPkg; 301 } 302 303 @Nullable getTraceMethod()304 public String getTraceMethod() { 305 return mInstallArgs == null ? null : mInstallArgs.mTraceMethod; 306 } 307 getTraceCookie()308 public int getTraceCookie() { 309 return mInstallArgs == null ? 0 : mInstallArgs.mTraceCookie; 310 } 311 isUpdate()312 public boolean isUpdate() { 313 return mRemovedInfo != null && mRemovedInfo.mRemovedPackage != null; 314 } 315 316 @Nullable getRemovedPackage()317 public String getRemovedPackage() { 318 return mRemovedInfo != null ? mRemovedInfo.mRemovedPackage : null; 319 } 320 isInstallExistingForUser()321 public boolean isInstallExistingForUser() { 322 return mInstallArgs == null; 323 } 324 325 @Nullable getInstallSource()326 public InstallSource getInstallSource() { 327 return mInstallArgs == null ? null : mInstallArgs.mInstallSource; 328 } 329 330 @Nullable getInstallerPackageName()331 public String getInstallerPackageName() { 332 return (mInstallArgs != null && mInstallArgs.mInstallSource != null) 333 ? mInstallArgs.mInstallSource.mInstallerPackageName : null; 334 } 335 getInstallerPackageUid()336 public int getInstallerPackageUid() { 337 return (mInstallArgs != null && mInstallArgs.mInstallSource != null) 338 ? mInstallArgs.mInstallSource.mInstallerPackageUid : INVALID_UID; 339 } 340 getDataLoaderType()341 public int getDataLoaderType() { 342 return mInstallArgs == null ? DataLoaderType.NONE : mInstallArgs.mDataLoaderType; 343 } 344 getSignatureSchemeVersion()345 public int getSignatureSchemeVersion() { 346 return mInstallArgs == null ? SigningDetails.SignatureSchemeVersion.UNKNOWN 347 : mInstallArgs.mSigningDetails.getSignatureSchemeVersion(); 348 } 349 350 @NonNull getSigningDetails()351 public SigningDetails getSigningDetails() { 352 return mInstallArgs == null ? SigningDetails.UNKNOWN : mInstallArgs.mSigningDetails; 353 } 354 355 @Nullable getOriginUri()356 public Uri getOriginUri() { 357 return mInstallArgs == null ? null : Uri.fromFile(mInstallArgs.mOriginInfo.mResolvedFile); 358 } 359 360 @Nullable getApexInfo()361 public ApexInfo getApexInfo() { 362 return mApexInfo; 363 } 364 365 @Nullable getApexModuleName()366 public String getApexModuleName() { 367 return mApexModuleName; 368 } isRollback()369 public boolean isRollback() { 370 return mInstallArgs != null 371 && mInstallArgs.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK; 372 } 373 374 @Nullable getNewUsers()375 public int[] getNewUsers() { 376 return mNewUsers; 377 } 378 379 @Nullable getOriginUsers()380 public int[] getOriginUsers() { 381 return mOrigUsers; 382 } 383 getAppId()384 public int getAppId() { 385 return mAppId; 386 } 387 388 @Nullable getPermissionStates()389 public ArrayMap<String, Integer> getPermissionStates() { 390 return mInstallArgs == null ? null : mInstallArgs.mPermissionStates; 391 } 392 393 @Nullable getLibraryConsumers()394 public ArrayList<AndroidPackage> getLibraryConsumers() { 395 return mLibraryConsumers; 396 } 397 398 @Nullable getExistingPackage()399 public AndroidPackage getExistingPackage() { 400 return mExistingPackage; 401 } 402 403 @Nullable getAllowlistedRestrictedPermissions()404 public List<String> getAllowlistedRestrictedPermissions() { 405 return mInstallArgs == null ? null : mInstallArgs.mAllowlistedRestrictedPermissions; 406 } 407 getAutoRevokePermissionsMode()408 public int getAutoRevokePermissionsMode() { 409 return mInstallArgs == null 410 ? AppOpsManager.MODE_DEFAULT : mInstallArgs.mAutoRevokePermissionsMode; 411 } 412 getPackageSource()413 public int getPackageSource() { 414 return mInstallArgs == null 415 ? PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED : mInstallArgs.mPackageSource; 416 } 417 getInstallScenario()418 public int getInstallScenario() { 419 return mInstallArgs == null ? INSTALL_SCENARIO_DEFAULT : mInstallArgs.mInstallScenario; 420 } 421 422 @Nullable getParsedPackage()423 public ParsedPackage getParsedPackage() { 424 return mParsedPackage; 425 } 426 427 @ParsingPackageUtils.ParseFlags getParseFlags()428 public int getParseFlags() { 429 return mParseFlags; 430 } 431 432 @PackageManagerService.ScanFlags getScanFlags()433 public int getScanFlags() { 434 return mScanFlags; 435 } 436 437 @Nullable getExistingPackageName()438 public String getExistingPackageName() { 439 if (mExistingPackage != null) { 440 return mExistingPackage.getPackageName(); 441 } 442 return null; 443 } 444 445 @Nullable getScanRequestOldPackage()446 public AndroidPackage getScanRequestOldPackage() { 447 assertScanResultExists(); 448 return mScanResult.mRequest.mOldPkg; 449 } 450 isClearCodeCache()451 public boolean isClearCodeCache() { 452 return mClearCodeCache; 453 } 454 isInstallReplace()455 public boolean isInstallReplace() { 456 return mReplace; 457 } 458 isInstallSystem()459 public boolean isInstallSystem() { 460 return mSystem; 461 } 462 isInstallInherit()463 public boolean isInstallInherit() { 464 return mIsInstallInherit; 465 } 466 isInstallForUsers()467 public boolean isInstallForUsers() { 468 return mIsInstallForUsers; 469 } 470 isInstallFromAdb()471 public boolean isInstallFromAdb() { 472 return mInstallArgs != null 473 && (mInstallArgs.mInstallFlags & PackageManager.INSTALL_FROM_ADB) != 0; 474 } 475 476 @Nullable getOriginalPackageSetting()477 public PackageSetting getOriginalPackageSetting() { 478 return mOriginalPs; 479 } 480 481 @Nullable getDisabledPackageSetting()482 public PackageSetting getDisabledPackageSetting() { 483 return mDisabledPs; 484 } 485 486 @Nullable getScanRequestOldPackageSetting()487 public PackageSetting getScanRequestOldPackageSetting() { 488 assertScanResultExists(); 489 return mScanResult.mRequest.mOldPkgSetting; 490 } 491 492 @Nullable getScanRequestOriginalPackageSetting()493 public PackageSetting getScanRequestOriginalPackageSetting() { 494 assertScanResultExists(); 495 return mScanResult.mRequest.mOriginalPkgSetting; 496 } 497 498 @Nullable getScanRequestPackageSetting()499 public PackageSetting getScanRequestPackageSetting() { 500 assertScanResultExists(); 501 return mScanResult.mRequest.mPkgSetting; 502 } 503 504 @Nullable getRealPackageName()505 public String getRealPackageName() { 506 assertScanResultExists(); 507 return mScanResult.mRequest.mRealPkgName; 508 } 509 510 @Nullable getChangedAbiCodePath()511 public List<String> getChangedAbiCodePath() { 512 assertScanResultExists(); 513 return mScanResult.mChangedAbiCodePath; 514 } 515 isApplicationEnabledSettingPersistent()516 public boolean isApplicationEnabledSettingPersistent() { 517 return mInstallArgs == null ? false : mInstallArgs.mApplicationEnabledSettingPersistent; 518 } 519 isForceQueryableOverride()520 public boolean isForceQueryableOverride() { 521 return mInstallArgs != null && mInstallArgs.mForceQueryableOverride; 522 } 523 524 @Nullable getSdkSharedLibraryInfo()525 public SharedLibraryInfo getSdkSharedLibraryInfo() { 526 assertScanResultExists(); 527 return mScanResult.mSdkSharedLibraryInfo; 528 } 529 530 @Nullable getStaticSharedLibraryInfo()531 public SharedLibraryInfo getStaticSharedLibraryInfo() { 532 assertScanResultExists(); 533 return mScanResult.mStaticSharedLibraryInfo; 534 } 535 536 @Nullable getDynamicSharedLibraryInfos()537 public List<SharedLibraryInfo> getDynamicSharedLibraryInfos() { 538 assertScanResultExists(); 539 return mScanResult.mDynamicSharedLibraryInfos; 540 } 541 542 @Nullable getScannedPackageSetting()543 public PackageSetting getScannedPackageSetting() { 544 assertScanResultExists(); 545 return mScanResult.mPkgSetting; 546 } 547 548 @Nullable getRealPackageSetting()549 public PackageSetting getRealPackageSetting() { 550 // TODO: Fix this to have 1 mutable PackageSetting for scan/install. If the previous 551 // setting needs to be passed to have a comparison, hide it behind an immutable 552 // interface. There's no good reason to have 3 different ways to access the real 553 // PackageSetting object, only one of which is actually correct. 554 PackageSetting realPkgSetting = isExistingSettingCopied() 555 ? getScanRequestPackageSetting() : getScannedPackageSetting(); 556 if (realPkgSetting == null) { 557 realPkgSetting = getScannedPackageSetting(); 558 } 559 return realPkgSetting; 560 } 561 isExistingSettingCopied()562 public boolean isExistingSettingCopied() { 563 assertScanResultExists(); 564 return mScanResult.mExistingSettingCopied; 565 } 566 567 /** 568 * Whether the original PackageSetting needs to be updated with 569 * a new app ID. Useful when leaving a sharedUserId. 570 */ needsNewAppId()571 public boolean needsNewAppId() { 572 assertScanResultExists(); 573 return mScanResult.mPreviousAppId != Process.INVALID_UID; 574 } 575 getPreviousAppId()576 public int getPreviousAppId() { 577 assertScanResultExists(); 578 return mScanResult.mPreviousAppId; 579 } 580 isPlatformPackage()581 public boolean isPlatformPackage() { 582 assertScanResultExists(); 583 return mScanResult.mRequest.mIsPlatformPackage; 584 } 585 isInstantInstall()586 public boolean isInstantInstall() { 587 return (mScanFlags & SCAN_AS_INSTANT_APP) != 0; 588 } 589 assertScanResultExists()590 public void assertScanResultExists() { 591 if (mScanResult == null) { 592 // Should not happen. This indicates a bug in the installation code flow 593 if (Build.IS_USERDEBUG || Build.IS_ENG) { 594 throw new IllegalStateException("ScanResult cannot be null."); 595 } else { 596 Slog.e(TAG, "ScanResult is null and it should not happen"); 597 } 598 } 599 } 600 getSessionId()601 public int getSessionId() { 602 return mSessionId; 603 } 604 getRequireUserAction()605 public int getRequireUserAction() { 606 return mRequireUserAction; 607 } 608 getDexoptStatus()609 public int getDexoptStatus() { 610 return mDexoptStatus; 611 } 612 setScanFlags(int scanFlags)613 public void setScanFlags(int scanFlags) { 614 mScanFlags = scanFlags; 615 } 616 closeFreezer()617 public void closeFreezer() { 618 if (mFreezer != null) { 619 mFreezer.close(); 620 } 621 } 622 runPostInstallRunnable()623 public void runPostInstallRunnable() { 624 if (mPostInstallRunnable != null) { 625 mPostInstallRunnable.run(); 626 } 627 } 628 setCodeFile(File codeFile)629 public void setCodeFile(File codeFile) { 630 if (mInstallArgs != null) { 631 mInstallArgs.mCodeFile = codeFile; 632 } 633 } 634 setError(int code, String msg)635 public void setError(int code, String msg) { 636 setReturnCode(code); 637 setReturnMessage(msg); 638 Slog.w(TAG, msg); 639 if (mPackageMetrics != null) { 640 mPackageMetrics.onInstallFailed(); 641 } 642 } 643 setError(PackageManagerException e)644 public void setError(PackageManagerException e) { 645 setError(null, e); 646 } 647 setError(String msg, PackageManagerException e)648 public void setError(String msg, PackageManagerException e) { 649 mInternalErrorCode = e.internalErrorCode; 650 mReturnCode = e.error; 651 setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); 652 Slog.w(TAG, msg, e); 653 if (mPackageMetrics != null) { 654 mPackageMetrics.onInstallFailed(); 655 } 656 } 657 setReturnCode(int returnCode)658 public void setReturnCode(int returnCode) { 659 mReturnCode = returnCode; 660 } 661 setReturnMessage(String returnMsg)662 public void setReturnMessage(String returnMsg) { 663 mReturnMsg = returnMsg; 664 } 665 setApexInfo(ApexInfo apexInfo)666 public void setApexInfo(ApexInfo apexInfo) { 667 mApexInfo = apexInfo; 668 } 669 setApexModuleName(@ullable String apexModuleName)670 public void setApexModuleName(@Nullable String apexModuleName) { 671 mApexModuleName = apexModuleName; 672 } 673 setPkg(AndroidPackage pkg)674 public void setPkg(AndroidPackage pkg) { 675 mPkg = pkg; 676 } 677 setAppId(int appId)678 public void setAppId(int appId) { 679 mAppId = appId; 680 } 681 setNewUsers(int[] newUsers)682 public void setNewUsers(int[] newUsers) { 683 mNewUsers = newUsers; 684 } 685 setOriginPackage(String originPackage)686 public void setOriginPackage(String originPackage) { 687 mOrigPackage = originPackage; 688 } 689 setOriginPermission(String originPermission)690 public void setOriginPermission(String originPermission) { 691 mOrigPermission = originPermission; 692 } 693 setName(String packageName)694 public void setName(String packageName) { 695 mName = packageName; 696 } 697 setOriginUsers(int[] userIds)698 public void setOriginUsers(int[] userIds) { 699 mOrigUsers = userIds; 700 } 701 setFreezer(PackageFreezer freezer)702 public void setFreezer(PackageFreezer freezer) { 703 mFreezer = freezer; 704 } 705 setRemovedInfo(PackageRemovedInfo removedInfo)706 public void setRemovedInfo(PackageRemovedInfo removedInfo) { 707 mRemovedInfo = removedInfo; 708 } 709 setLibraryConsumers(ArrayList<AndroidPackage> libraryConsumers)710 public void setLibraryConsumers(ArrayList<AndroidPackage> libraryConsumers) { 711 mLibraryConsumers = libraryConsumers; 712 } 713 setPrepareResult(boolean replace, int scanFlags, int parseFlags, AndroidPackage existingPackage, ParsedPackage packageToScan, boolean clearCodeCache, boolean system, PackageSetting originalPs, PackageSetting disabledPs)714 public void setPrepareResult(boolean replace, int scanFlags, 715 int parseFlags, AndroidPackage existingPackage, 716 ParsedPackage packageToScan, boolean clearCodeCache, boolean system, 717 PackageSetting originalPs, PackageSetting disabledPs) { 718 mReplace = replace; 719 mScanFlags = scanFlags; 720 mParseFlags = parseFlags; 721 mExistingPackage = existingPackage; 722 mParsedPackage = packageToScan; 723 mClearCodeCache = clearCodeCache; 724 mSystem = system; 725 mOriginalPs = originalPs; 726 mDisabledPs = disabledPs; 727 } 728 setScanResult(@onNull ScanResult scanResult)729 public void setScanResult(@NonNull ScanResult scanResult) { 730 mScanResult = scanResult; 731 } 732 setScannedPackageSettingAppId(int appId)733 public void setScannedPackageSettingAppId(int appId) { 734 assertScanResultExists(); 735 mScanResult.mPkgSetting.setAppId(appId); 736 } 737 setScannedPackageSettingFirstInstallTimeFromReplaced( @ullable PackageStateInternal replacedPkgSetting, int[] userId)738 public void setScannedPackageSettingFirstInstallTimeFromReplaced( 739 @Nullable PackageStateInternal replacedPkgSetting, int[] userId) { 740 assertScanResultExists(); 741 mScanResult.mPkgSetting.setFirstInstallTimeFromReplaced(replacedPkgSetting, userId); 742 } 743 setScannedPackageSettingLastUpdateTime(long lastUpdateTim)744 public void setScannedPackageSettingLastUpdateTime(long lastUpdateTim) { 745 assertScanResultExists(); 746 mScanResult.mPkgSetting.setLastUpdateTime(lastUpdateTim); 747 } 748 setRemovedAppId(int appId)749 public void setRemovedAppId(int appId) { 750 if (mRemovedInfo != null) { 751 mRemovedInfo.mRemovedAppId = appId; 752 } 753 } 754 onPrepareStarted()755 public void onPrepareStarted() { 756 if (mPackageMetrics != null) { 757 mPackageMetrics.onStepStarted(PackageMetrics.STEP_PREPARE); 758 } 759 } 760 onPrepareFinished()761 public void onPrepareFinished() { 762 if (mPackageMetrics != null) { 763 mPackageMetrics.onStepFinished(PackageMetrics.STEP_PREPARE); 764 } 765 } 766 onScanStarted()767 public void onScanStarted() { 768 if (mPackageMetrics != null) { 769 mPackageMetrics.onStepStarted(PackageMetrics.STEP_SCAN); 770 } 771 } 772 onScanFinished()773 public void onScanFinished() { 774 if (mPackageMetrics != null) { 775 mPackageMetrics.onStepFinished(PackageMetrics.STEP_SCAN); 776 } 777 } 778 onReconcileStarted()779 public void onReconcileStarted() { 780 if (mPackageMetrics != null) { 781 mPackageMetrics.onStepStarted(PackageMetrics.STEP_RECONCILE); 782 } 783 } 784 onReconcileFinished()785 public void onReconcileFinished() { 786 if (mPackageMetrics != null) { 787 mPackageMetrics.onStepFinished(PackageMetrics.STEP_RECONCILE); 788 } 789 } 790 onCommitStarted()791 public void onCommitStarted() { 792 if (mPackageMetrics != null) { 793 mPackageMetrics.onStepStarted(PackageMetrics.STEP_COMMIT); 794 } 795 } 796 onCommitFinished()797 public void onCommitFinished() { 798 if (mPackageMetrics != null) { 799 mPackageMetrics.onStepFinished(PackageMetrics.STEP_COMMIT); 800 } 801 } 802 onDexoptFinished(DexoptResult dexoptResult)803 public void onDexoptFinished(DexoptResult dexoptResult) { 804 if (mPackageMetrics == null) { 805 return; 806 } 807 mDexoptStatus = dexoptResult.getFinalStatus(); 808 if (mDexoptStatus != DexoptResult.DEXOPT_PERFORMED) { 809 return; 810 } 811 long durationMillis = 0; 812 for (DexoptResult.PackageDexoptResult packageResult : 813 dexoptResult.getPackageDexoptResults()) { 814 for (DexoptResult.DexContainerFileDexoptResult fileResult : 815 packageResult.getDexContainerFileDexoptResults()) { 816 durationMillis += fileResult.getDex2oatWallTimeMillis(); 817 } 818 } 819 mPackageMetrics.onStepFinished(PackageMetrics.STEP_DEXOPT, durationMillis); 820 } 821 onInstallCompleted()822 public void onInstallCompleted() { 823 if (getReturnCode() == INSTALL_SUCCEEDED) { 824 if (mPackageMetrics != null) { 825 mPackageMetrics.onInstallSucceed(); 826 } 827 } 828 } 829 } 830