diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java index 3dcf9260f8297..81f1a987c0a4f 100644 --- a/services/core/java/com/android/server/pm/PackageMetrics.java +++ b/services/core/java/com/android/server/pm/PackageMetrics.java @@ -16,6 +16,8 @@ package com.android.server.pm; +import static android.os.Process.INVALID_UID; + import android.annotation.IntDef; import android.content.pm.PackageManager; import android.content.pm.parsing.ApkLiteParseUtils; @@ -209,4 +211,35 @@ final class PackageMetrics { deleteFlags, PackageManager.DELETE_SUCCEEDED, info.mIsRemovedPackageSystemUpdate, !info.mRemovedForAllUsers); } + + public static void onVerificationFailed(VerifyingSession verifyingSession) { + FrameworkStatsLog.write(FrameworkStatsLog.PACKAGE_INSTALLATION_SESSION_REPORTED, + verifyingSession.getSessionId() /* session_id */, + null /* package_name */, + INVALID_UID /* uid */, + null /* user_ids */, + null /* user_types */, + null /* original_user_ids */, + null /* original_user_types */, + verifyingSession.getRet() /* public_return_code */, + 0 /* internal_error_code */, + 0 /* apks_size_bytes */, + 0 /* version_code */, + null /* install_steps */, + null /* step_duration_millis */, + 0 /* total_duration_millis */, + 0 /* install_flags */, + verifyingSession.getInstallerPackageUid() /* installer_package_uid */, + INVALID_UID /* original_installer_package_uid */, + verifyingSession.getDataLoaderType() /* data_loader_type */, + verifyingSession.getUserActionRequiredType() /* user_action_required_type */, + verifyingSession.isInstant() /* is_instant */, + false /* is_replace */, + false /* is_system */, + verifyingSession.isInherit() /* is_inherit */, + false /* is_installing_existing_as_user */, + false /* is_move_install */, + verifyingSession.isStaged() /* is_staged */ + ); + } } diff --git a/services/core/java/com/android/server/pm/VerificationUtils.java b/services/core/java/com/android/server/pm/VerificationUtils.java index e1026b419ff04..30f2132ce1f12 100644 --- a/services/core/java/com/android/server/pm/VerificationUtils.java +++ b/services/core/java/com/android/server/pm/VerificationUtils.java @@ -112,7 +112,7 @@ final class VerificationUtils { VerificationUtils.broadcastPackageVerified(verificationId, originUri, verificationCode, null, - verifyingSession.mDataLoaderType, verifyingSession.getUser(), + verifyingSession.getDataLoaderType(), verifyingSession.getUser(), pms.mContext); if (state.isInstallAllowed()) { diff --git a/services/core/java/com/android/server/pm/VerifyingSession.java b/services/core/java/com/android/server/pm/VerifyingSession.java index 6160519f4e777..a54f52619f357 100644 --- a/services/core/java/com/android/server/pm/VerifyingSession.java +++ b/services/core/java/com/android/server/pm/VerifyingSession.java @@ -19,6 +19,7 @@ package com.android.server.pm; import static android.content.Intent.EXTRA_LONG_VERSION_CODE; import static android.content.Intent.EXTRA_PACKAGE_NAME; import static android.content.Intent.EXTRA_VERSION_CODE; +import static android.content.pm.PackageInstaller.SessionParams.MODE_INHERIT_EXISTING; import static android.content.pm.PackageManager.EXTRA_VERIFICATION_ID; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; @@ -114,30 +115,32 @@ final class VerifyingSession { final OriginInfo mOriginInfo; final IPackageInstallObserver2 mObserver; - final int mInstallFlags; + private final int mInstallFlags; @NonNull - final InstallSource mInstallSource; - final String mPackageAbiOverride; - final VerificationInfo mVerificationInfo; - final SigningDetails mSigningDetails; + private final InstallSource mInstallSource; + private final String mPackageAbiOverride; + private final VerificationInfo mVerificationInfo; + private final SigningDetails mSigningDetails; @Nullable MultiPackageVerifyingSession mParentVerifyingSession; - final long mRequiredInstalledVersionCode; - final int mDataLoaderType; - final int mSessionId; - final boolean mUserActionRequired; - + private final long mRequiredInstalledVersionCode; + private final int mDataLoaderType; + private final int mSessionId; + private final boolean mUserActionRequired; + private final int mUserActionRequiredType; private boolean mWaitForVerificationToComplete; private boolean mWaitForIntegrityVerificationToComplete; private boolean mWaitForEnableRollbackToComplete; private int mRet = PackageManager.INSTALL_SUCCEEDED; private String mErrorMessage = null; + private final boolean mIsInherit; + private final boolean mIsStaged; - final PackageLite mPackageLite; + private final PackageLite mPackageLite; private final UserHandle mUser; @NonNull - final PackageManagerService mPm; - final InstallPackageHelper mInstallPackageHelper; + private final PackageManagerService mPm; + private final InstallPackageHelper mInstallPackageHelper; VerifyingSession(UserHandle user, File stagedDir, IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams, InstallSource installSource, @@ -164,6 +167,9 @@ final class VerifyingSession { mSessionId = sessionId; mPackageLite = lite; mUserActionRequired = userActionRequired; + mUserActionRequiredType = sessionParams.requireUserAction; + mIsInherit = sessionParams.mode == MODE_INHERIT_EXISTING; + mIsStaged = sessionParams.isStaged; } @Override @@ -186,7 +192,7 @@ final class VerifyingSession { // Perform package verification and enable rollback (unless we are simply moving the // package). if (!mOriginInfo.mExisting) { - if ((mInstallFlags & PackageManager.INSTALL_APEX) == 0) { + if (!isApex()) { // TODO(b/182426975): treat APEX as APK when APK verification is concerned sendApkVerificationRequest(pkgLite); } @@ -674,10 +680,9 @@ final class VerifyingSession { } final int installerUid = mVerificationInfo == null ? -1 : mVerificationInfo.mInstallerUid; - final int installFlags = mInstallFlags; // Check if installing from ADB - if ((installFlags & PackageManager.INSTALL_FROM_ADB) != 0) { + if ((mInstallFlags & PackageManager.INSTALL_FROM_ADB) != 0) { boolean requestedDisableVerification = (mInstallFlags & PackageManager.INSTALL_DISABLE_VERIFICATION) != 0; return isAdbVerificationEnabled(pkgInfoLite, userId, requestedDisableVerification); @@ -685,8 +690,7 @@ final class VerifyingSession { // only when not installed from ADB, skip verification for instant apps when // the installer and verifier are the same. - if ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 - && mPm.mInstantAppInstallerActivity != null) { + if (isInstant() && mPm.mInstantAppInstallerActivity != null) { String installerPackage = mPm.mInstantAppInstallerActivity.packageName; for (String requiredVerifierPackage : requiredVerifierPackages) { if (installerPackage.equals(requiredVerifierPackage)) { @@ -818,6 +822,9 @@ final class VerifyingSession { return; } sendVerificationCompleteNotification(); + if (mRet != INSTALL_SUCCEEDED) { + PackageMetrics.onVerificationFailed(this); + } } private void sendVerificationCompleteNotification() { @@ -865,4 +872,28 @@ final class VerifyingSession { public UserHandle getUser() { return mUser; } + public int getSessionId() { + return mSessionId; + } + public int getDataLoaderType() { + return mDataLoaderType; + } + public int getUserActionRequiredType() { + return mUserActionRequiredType; + } + public boolean isInstant() { + return (mInstallFlags & PackageManager.INSTALL_INSTANT_APP) != 0; + } + public boolean isInherit() { + return mIsInherit; + } + public int getInstallerPackageUid() { + return mInstallSource.mInstallerPackageUid; + } + public boolean isApex() { + return (mInstallFlags & PackageManager.INSTALL_APEX) != 0; + } + public boolean isStaged() { + return mIsStaged; + } }