• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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