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

Commit ca0bcfee authored by William Loh's avatar William Loh
Browse files

Set correct install times for system user

The firstInstallTime and lastUpdateTime for the system user was being
set to the currentTime if the firstInstallTime is 0 when scaning
non-system package during device boot. This resulted in the
firstInstallTime and lastUpdateTime incorrectly to be set to the
currentTime even when the package was already installed earlier for
another user. Fixed this to only set the firstInstallTime and
lastUpdateTime if the earliestFirstInstallTime is 0.

Additionally set the firstInstallTime in commitPackagesLocked when
setting the lastUpdateTime when replacing a packge. This should result
in correctly setting the firstUpdateTime when installing a existing
package for a different user.

Bug: 360751150
Test: atest AppMetadataTest
Flag: EXEMPT bug fix
Change-Id: Ibb809611c8cd63709d1844a94137d628174aaf29
parent 3beaa244
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2194,8 +2194,9 @@ final class InstallPackageHelper {
                //  by apexd to be more accurate.
                installRequest.setScannedPackageSettingFirstInstallTimeFromReplaced(
                        deletedPkgSetting, allUsers);
                installRequest.setScannedPackageSettingLastUpdateTime(
                        System.currentTimeMillis());
                long currentTime = System.currentTimeMillis();
                installRequest.setScannedPackageSettingLastUpdateTime(currentTime);
                installRequest.setScannedPackageSettingFirstInstallTime(currentTime);

                installRequest.getRemovedInfo().mBroadcastAllowList =
                        mPm.mAppsFilter.getVisibilityAllowList(mPm.snapshotComputer(),
+9 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import com.android.server.art.model.DexoptResult;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.PackageUserStateInternal;

import java.io.File;
import java.util.ArrayList;
@@ -867,6 +868,14 @@ final class InstallRequest {
        mScanResult.mPkgSetting.setLastUpdateTime(lastUpdateTim);
    }

    public void setScannedPackageSettingFirstInstallTime(long firstInstallTime) {
        assertScanResultExists();
        PackageUserStateInternal userState = mScanResult.mPkgSetting.getUserStates().get(mUserId);
        if (userState != null && userState.getFirstInstallTimeMillis() == 0) {
            mScanResult.mPkgSetting.setFirstInstallTime(firstInstallTime, mUserId);
        }
    }

    public void setRemovedAppId(int appId) {
        if (mRemovedInfo != null) {
            mRemovedInfo.mUid = appId;
+4 −5
Original line number Diff line number Diff line
@@ -443,17 +443,16 @@ final class ScanPackageUtils {

        // Take care of first install / last update times.
        final long scanFileTime = getLastModifiedTime(parsedPackage);
        final long existingFirstInstallTime = userId == UserHandle.USER_ALL
                ? PackageStateUtils.getEarliestFirstInstallTime(pkgSetting.getUserStates())
                : pkgSetting.readUserState(userId).getFirstInstallTimeMillis();
        final long earliestFirstInstallTime =
                PackageStateUtils.getEarliestFirstInstallTime((pkgSetting.getUserStates()));
        if (currentTime != 0) {
            if (existingFirstInstallTime == 0) {
            if (earliestFirstInstallTime == 0) {
                pkgSetting.setFirstInstallTime(currentTime, userId)
                        .setLastUpdateTime(currentTime);
            } else if ((scanFlags & SCAN_UPDATE_TIME) != 0) {
                pkgSetting.setLastUpdateTime(currentTime);
            }
        } else if (existingFirstInstallTime == 0) {
        } else if (earliestFirstInstallTime == 0) {
            // We need *something*.  Take time stamp of the file.
            pkgSetting.setFirstInstallTime(scanFileTime, userId)
                    .setLastUpdateTime(scanFileTime);