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