blob: 03c68d9f64b0ba700debd6532022e6a152e8fb8d [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.pm;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.IPackageInstallObserver2;
import android.content.pm.PackageManager;
import android.content.pm.SigningDetails;
import android.os.UserHandle;
import com.android.internal.util.Preconditions;
import com.android.server.pm.parsing.pkg.ParsedPackage;
import java.util.List;
abstract class InstallArgs {
/** @see InstallParams#mOriginInfo */
final OriginInfo mOriginInfo;
/** @see InstallParams#mMoveInfo */
final MoveInfo mMoveInfo;
final IPackageInstallObserver2 mObserver;
// Always refers to PackageManager flags only
final int mInstallFlags;
@NonNull
final InstallSource mInstallSource;
final String mVolumeUuid;
final UserHandle mUser;
final String mAbiOverride;
final String[] mInstallGrantPermissions;
final List<String> mAllowlistedRestrictedPermissions;
final int mAutoRevokePermissionsMode;
/** If non-null, drop an async trace when the install completes */
final String mTraceMethod;
final int mTraceCookie;
final SigningDetails mSigningDetails;
final int mInstallReason;
final int mInstallScenario;
final boolean mForceQueryableOverride;
final int mDataLoaderType;
final int mPackageSource;
// The list of instruction sets supported by this app. This is currently
// only used during the rmdex() phase to clean up resources. We can get rid of this
// if we move dex files under the common app path.
@Nullable String[] mInstructionSets;
@NonNull final PackageManagerService mPm;
@NonNull final RemovePackageHelper mRemovePackageHelper;
InstallArgs(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
int installFlags, InstallSource installSource, String volumeUuid,
UserHandle user, String[] instructionSets,
String abiOverride, String[] installGrantPermissions,
List<String> allowlistedRestrictedPermissions,
int autoRevokePermissionsMode,
String traceMethod, int traceCookie, SigningDetails signingDetails,
int installReason, int installScenario, boolean forceQueryableOverride,
int dataLoaderType, int packageSource, PackageManagerService pm) {
mOriginInfo = originInfo;
mMoveInfo = moveInfo;
mInstallFlags = installFlags;
mObserver = observer;
mInstallSource = Preconditions.checkNotNull(installSource);
mVolumeUuid = volumeUuid;
mUser = user;
mInstructionSets = instructionSets;
mAbiOverride = abiOverride;
mInstallGrantPermissions = installGrantPermissions;
mAllowlistedRestrictedPermissions = allowlistedRestrictedPermissions;
mAutoRevokePermissionsMode = autoRevokePermissionsMode;
mTraceMethod = traceMethod;
mTraceCookie = traceCookie;
mSigningDetails = signingDetails;
mInstallReason = installReason;
mInstallScenario = installScenario;
mForceQueryableOverride = forceQueryableOverride;
mDataLoaderType = dataLoaderType;
mPackageSource = packageSource;
mPm = pm;
mRemovePackageHelper = new RemovePackageHelper(mPm);
}
/** New install */
InstallArgs(InstallParams params) {
this(params.mOriginInfo, params.mMoveInfo, params.mObserver, params.mInstallFlags,
params.mInstallSource, params.mVolumeUuid,
params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride,
params.mGrantedRuntimePermissions, params.mAllowlistedRestrictedPermissions,
params.mAutoRevokePermissionsMode,
params.mTraceMethod, params.mTraceCookie, params.mSigningDetails,
params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride,
params.mDataLoaderType, params.mPackageSource, params.mPm);
}
abstract int copyApk();
abstract int doPreInstall(int status);
/**
* Rename package into final resting place. All paths on the given
* scanned package should be updated to reflect the rename.
*/
abstract boolean doRename(int status, ParsedPackage parsedPackage);
abstract int doPostInstall(int status, int uid);
/** @see PackageSettingBase#getPath() */
abstract String getCodePath();
// Need installer lock especially for dex file removal.
abstract void cleanUpResourcesLI();
abstract boolean doPostDeleteLI(boolean delete);
/**
* Called before the source arguments are copied. This is used mostly
* for MoveParams when it needs to read the source file to put it in the
* destination.
*/
int doPreCopy() {
return PackageManager.INSTALL_SUCCEEDED;
}
/**
* Called after the source arguments are copied. This is used mostly for
* MoveParams when it needs to read the source file to put it in the
* destination.
*/
int doPostCopy(int uid) {
return PackageManager.INSTALL_SUCCEEDED;
}
protected boolean isEphemeral() {
return (mInstallFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
}
UserHandle getUser() {
return mUser;
}
}