Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ececd87 authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] Split VerificationParams and InstallParams

+ Remove unnecessary layer of abstraction
+ Remove unnecessary message code INIT_COPY
+ Rename VerificationParams -> VerifyingSession
+ Rename InstallParams -> InstallingSession

BUG: 215734888
Test: builds
Change-Id: Ie9ea722344f73faffd8602f2e5117527f0b812c8
parent 724530ce
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -68,7 +68,7 @@ class FileInstallArgs extends InstallArgs {
    // /data/app/com.example/dalvik/arm/base.apk@classes.dex
    // /data/app/com.example/dalvik/arm/base.apk@classes.dex


    /** New install */
    /** New install */
    FileInstallArgs(InstallParams params) {
    FileInstallArgs(InstallingSession params) {
        super(params);
        super(params);
    }
    }


+0 −64
Original line number Original line Diff line number Diff line
/*
 * 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 static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.TAG;

import android.annotation.NonNull;
import android.os.UserHandle;
import android.util.Slog;

abstract class HandlerParams {
    /** User handle for the user requesting the information or installation. */
    private final UserHandle mUser;
    String mTraceMethod;
    int mTraceCookie;
    @NonNull
    final PackageManagerService mPm;
    final InstallPackageHelper mInstallPackageHelper;

    // TODO(b/198166813): remove PMS dependency
    HandlerParams(UserHandle user, PackageManagerService pm) {
        mUser = user;
        mPm = pm;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
    }

    UserHandle getUser() {
        return mUser;
    }

    HandlerParams setTraceMethod(String traceMethod) {
        mTraceMethod = traceMethod;
        return this;
    }

    HandlerParams setTraceCookie(int traceCookie) {
        mTraceCookie = traceCookie;
        return this;
    }

    final void startCopy() {
        if (DEBUG_INSTALL) Slog.i(TAG, "startCopy " + mUser + ": " + this);
        handleStartCopy();
        handleReturnCode();
    }

    abstract void handleStartCopy();
    abstract void handleReturnCode();
}
+3 −21
Original line number Original line Diff line number Diff line
@@ -29,9 +29,9 @@ import com.android.server.pm.parsing.pkg.ParsedPackage;
import java.util.List;
import java.util.List;


abstract class InstallArgs {
abstract class InstallArgs {
    /** @see InstallParams#mOriginInfo */
    /** @see InstallingSession#mOriginInfo */
    final OriginInfo mOriginInfo;
    final OriginInfo mOriginInfo;
    /** @see InstallParams#mMoveInfo */
    /** @see InstallingSession#mMoveInfo */
    final MoveInfo mMoveInfo;
    final MoveInfo mMoveInfo;


    final IPackageInstallObserver2 mObserver;
    final IPackageInstallObserver2 mObserver;
@@ -97,7 +97,7 @@ abstract class InstallArgs {
    }
    }


    /** New install */
    /** New install */
    InstallArgs(InstallParams params) {
    InstallArgs(InstallingSession params) {
        this(params.mOriginInfo, params.mMoveInfo, params.mObserver, params.mInstallFlags,
        this(params.mOriginInfo, params.mMoveInfo, params.mObserver, params.mInstallFlags,
                params.mInstallSource, params.mVolumeUuid,
                params.mInstallSource, params.mVolumeUuid,
                params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride,
                params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride,
@@ -125,24 +125,6 @@ abstract class InstallArgs {
    abstract void cleanUpResourcesLI();
    abstract void cleanUpResourcesLI();
    abstract boolean doPostDeleteLI(boolean delete);
    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() {
    protected boolean isEphemeral() {
        return (mInstallFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
        return (mInstallFlags & PackageManager.INSTALL_INSTANT_APP) != 0;
    }
    }
+61 −112
Original line number Original line Diff line number Diff line
@@ -22,8 +22,8 @@ import static android.content.pm.PackageManager.INSTALL_SUCCEEDED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;


import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL;
import static com.android.server.pm.PackageManagerService.DEBUG_INSTANT;
import static com.android.server.pm.PackageManagerService.DEBUG_INSTANT;
import static com.android.server.pm.PackageManagerService.INIT_COPY;
import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.PackageManagerService.TAG;


import android.annotation.NonNull;
import android.annotation.NonNull;
@@ -35,10 +35,8 @@ import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.SigningDetails;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.PackageLite;
import android.content.pm.parsing.PackageLite;
import android.os.Message;
import android.os.Trace;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Pair;
import android.util.Pair;
import android.util.Slog;
import android.util.Slog;


@@ -48,12 +46,10 @@ import com.android.internal.util.Preconditions;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackage;


import java.io.File;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Map;


final class InstallParams extends HandlerParams {
class InstallingSession {
    final OriginInfo mOriginInfo;
    final OriginInfo mOriginInfo;
    final MoveInfo mMoveInfo;
    final MoveInfo mMoveInfo;
    final IPackageInstallObserver2 mObserver;
    final IPackageInstallObserver2 mObserver;
@@ -70,18 +66,27 @@ final class InstallParams extends HandlerParams {
    final int mInstallReason;
    final int mInstallReason;
    final int mInstallScenario;
    final int mInstallScenario;
    @Nullable
    @Nullable
    MultiPackageInstallParams mParentInstallParams;
    MultiPackageInstallingSession mParentInstallingSession;
    final boolean mForceQueryableOverride;
    final boolean mForceQueryableOverride;
    final int mDataLoaderType;
    final int mDataLoaderType;
    final long mRequiredInstalledVersionCode;
    final long mRequiredInstalledVersionCode;
    final int mPackageSource;
    final int mPackageSource;
    final PackageLite mPackageLite;
    final PackageLite mPackageLite;
    String mTraceMethod;
    int mTraceCookie;
    /** User handle for the user requesting the information or installation. */
    private final UserHandle mUser;
    @NonNull
    final PackageManagerService mPm;
    final InstallPackageHelper mInstallPackageHelper;


    InstallParams(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
    InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer,
            int installFlags, InstallSource installSource, String volumeUuid,
            int installFlags, InstallSource installSource, String volumeUuid,
            UserHandle user, String packageAbiOverride, int packageSource,
            UserHandle user, String packageAbiOverride, int packageSource,
            PackageLite packageLite, PackageManagerService pm) {
            PackageLite packageLite, PackageManagerService pm) {
        super(user, pm);
        mPm = pm;
        mUser = user;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
        mOriginInfo = originInfo;
        mOriginInfo = originInfo;
        mMoveInfo = moveInfo;
        mMoveInfo = moveInfo;
        mObserver = observer;
        mObserver = observer;
@@ -103,11 +108,13 @@ final class InstallParams extends HandlerParams {
        mPackageLite = packageLite;
        mPackageLite = packageLite;
    }
    }


    InstallParams(File stagedDir, IPackageInstallObserver2 observer,
    InstallingSession(File stagedDir, IPackageInstallObserver2 observer,
            PackageInstaller.SessionParams sessionParams, InstallSource installSource,
            PackageInstaller.SessionParams sessionParams, InstallSource installSource,
            UserHandle user, SigningDetails signingDetails, int installerUid,
            UserHandle user, SigningDetails signingDetails, int installerUid,
            PackageLite packageLite, PackageManagerService pm) {
            PackageLite packageLite, PackageManagerService pm) {
        super(user, pm);
        mPm = pm;
        mUser = user;
        mInstallPackageHelper = new InstallPackageHelper(mPm);
        mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
        mOriginInfo = OriginInfo.fromStagedFile(stagedDir);
        mMoveInfo = null;
        mMoveInfo = null;
        mInstallReason = fixUpInstallReason(
        mInstallReason = fixUpInstallReason(
@@ -132,7 +139,7 @@ final class InstallParams extends HandlerParams {


    @Override
    @Override
    public String toString() {
    public String toString() {
        return "InstallParams{" + Integer.toHexString(System.identityHashCode(this))
        return "InstallingSession{" + Integer.toHexString(System.identityHashCode(this))
                + " file=" + mOriginInfo.mFile + "}";
                + " file=" + mOriginInfo.mFile + "}";
    }
    }


@@ -225,7 +232,6 @@ final class InstallParams extends HandlerParams {
                pkgLite.installLocation);
                pkgLite.installLocation);
    }
    }


    @Override
    void handleReturnCode() {
    void handleReturnCode() {
        processPendingInstall();
        processPendingInstall();
    }
    }
@@ -239,30 +245,23 @@ final class InstallParams extends HandlerParams {
            F2fsUtils.releaseCompressedBlocks(
            F2fsUtils.releaseCompressedBlocks(
                    mPm.mContext.getContentResolver(), new File(args.getCodePath()));
                    mPm.mContext.getContentResolver(), new File(args.getCodePath()));
        }
        }
        if (mParentInstallParams != null) {
        if (mParentInstallingSession != null) {
            mParentInstallParams.tryProcessInstallRequest(args, mRet);
            mParentInstallingSession.tryProcessInstallRequest(args, mRet);
        } else {
        } else {
            PackageInstalledInfo res = new PackageInstalledInfo(mRet);
            PackageInstalledInfo res = new PackageInstalledInfo(mRet);
            processInstallRequestsAsync(
            // Queue up an async operation since the package installation may take a little while.
                    res.mReturnCode == PackageManager.INSTALL_SUCCEEDED,
            mPm.mHandler.post(() -> mInstallPackageHelper.processInstallRequests(
                    Collections.singletonList(new InstallRequest(args, res)));
                    res.mReturnCode == PackageManager.INSTALL_SUCCEEDED /* success */,
                    Collections.singletonList(new InstallRequest(args, res))));
        }
        }
    }
    }


    private InstallArgs createInstallArgs(InstallParams params) {
    private InstallArgs createInstallArgs(InstallingSession installingSession) {
        if (params.mMoveInfo != null) {
        if (installingSession.mMoveInfo != null) {
            return new MoveInstallArgs(params);
            return new MoveInstallArgs(installingSession);
        } else {
        } else {
            return new FileInstallArgs(params);
            return new FileInstallArgs(installingSession);
        }
        }
        }

    // Queue up an async operation since the package installation may take a little while.
    private void processInstallRequestsAsync(boolean success,
            List<InstallRequest> installRequests) {
        mPm.mHandler.post(() -> {
            mInstallPackageHelper.processInstallRequests(success, installRequests);
        });
    }
    }


    /**
    /**
@@ -316,107 +315,57 @@ final class InstallParams extends HandlerParams {
    }
    }


    public void installStage() {
    public void installStage() {
        final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        setTraceMethod("installStage").setTraceCookie(System.identityHashCode(this));
        setTraceMethod("installStage").setTraceCookie(System.identityHashCode(this));
        msg.obj = this;

        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStage",
                System.identityHashCode(msg.obj));
                System.identityHashCode(this));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));
                System.identityHashCode(this));

        mPm.mHandler.post(this::start);
        mPm.mHandler.sendMessage(msg);
    }
    }


    public void installStage(List<InstallParams> children)
    public void installStage(List<InstallingSession> children)
            throws PackageManagerException {
            throws PackageManagerException {
        final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        final MultiPackageInstallingSession installingSession =
        final MultiPackageInstallParams params =
                new MultiPackageInstallingSession(getUser(), children, mPm);
                new MultiPackageInstallParams(this, children, mPm);
        setTraceMethod("installStageMultiPackage").setTraceCookie(System.identityHashCode(
        params.setTraceMethod("installStageMultiPackage")
                installingSession));
                .setTraceCookie(System.identityHashCode(params));
        msg.obj = params;


        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStageMultiPackage",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "installStageMultiPackage",
                System.identityHashCode(msg.obj));
                System.identityHashCode(installingSession));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));
                System.identityHashCode(installingSession));
        mPm.mHandler.sendMessage(msg);
        mPm.mHandler.post(installingSession::start);
    }
    }


    public void movePackage() {
    public void movePackage() {
        final Message msg = mPm.mHandler.obtainMessage(INIT_COPY);
        setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(this));
        setTraceMethod("movePackage").setTraceCookie(System.identityHashCode(this));
        msg.obj = this;

        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "movePackage",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "movePackage",
                System.identityHashCode(msg.obj));
                System.identityHashCode(this));
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                System.identityHashCode(msg.obj));
                System.identityHashCode(this));
        mPm.mHandler.sendMessage(msg);
        mPm.mHandler.post(this::start);
    }
    }


    /**
    public UserHandle getUser() {
     * Container for a multi-package install which refers to all install sessions and args being
        return mUser;
     * committed together.
     */
    final class MultiPackageInstallParams extends HandlerParams {
        private final List<InstallParams> mChildParams;
        private final Map<InstallArgs, Integer> mCurrentState;

        MultiPackageInstallParams(InstallParams parent, List<InstallParams> childParams,
                PackageManagerService pm)
                throws PackageManagerException {
            super(parent.getUser(), pm);
            if (childParams.size() == 0) {
                throw new PackageManagerException("No child sessions found!");
            }
            mChildParams = childParams;
            for (int i = 0; i < childParams.size(); i++) {
                final InstallParams childParam = childParams.get(i);
                childParam.mParentInstallParams = this;
            }
            this.mCurrentState = new ArrayMap<>(mChildParams.size());
    }
    }


        @Override
    private void start() {
        void handleStartCopy() {
        if (DEBUG_INSTALL) Slog.i(TAG, "start " + mUser + ": " + this);
            for (InstallParams params : mChildParams) {
        Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "queueInstall",
                params.handleStartCopy();
                System.identityHashCode(this));
            }
        Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "startInstall");
        handleStartCopy();
        handleReturnCode();
        Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
    }
    }


        @Override
    private InstallingSession setTraceMethod(String traceMethod) {
        void handleReturnCode() {
        mTraceMethod = traceMethod;
            for (InstallParams params : mChildParams) {
        return this;
                params.handleReturnCode();
            }
    }
    }


        void tryProcessInstallRequest(InstallArgs args, int currentStatus) {
    private void setTraceCookie(int traceCookie) {
            mCurrentState.put(args, currentStatus);
        mTraceCookie = traceCookie;
            if (mCurrentState.size() != mChildParams.size()) {
                return;
            }
            int completeStatus = PackageManager.INSTALL_SUCCEEDED;
            for (Integer status : mCurrentState.values()) {
                if (status == PackageManager.INSTALL_UNKNOWN) {
                    return;
                } else if (status != PackageManager.INSTALL_SUCCEEDED) {
                    completeStatus = status;
                    break;
                }
            }
            final List<InstallRequest> installRequests = new ArrayList<>(mCurrentState.size());
            for (Map.Entry<InstallArgs, Integer> entry : mCurrentState.entrySet()) {
                installRequests.add(new InstallRequest(entry.getKey(),
                        new PackageInstalledInfo(completeStatus)));
            }
            processInstallRequestsAsync(
                    completeStatus == PackageManager.INSTALL_SUCCEEDED,
                    installRequests);
    }
    }
}
}


}
+1 −1
Original line number Original line Diff line number Diff line
@@ -37,7 +37,7 @@ final class MoveInstallArgs extends InstallArgs {
    private File mCodeFile;
    private File mCodeFile;


    /** New install */
    /** New install */
    MoveInstallArgs(InstallParams params) {
    MoveInstallArgs(InstallingSession params) {
        super(params);
        super(params);
    }
    }


Loading