diff options
| author | 2024-08-19 17:34:21 -0700 | |
|---|---|---|
| committer | 2024-08-21 14:54:01 -0700 | |
| commit | ca0bcfee7f46e717914df88192a47b962f9b2ee0 (patch) | |
| tree | e88236ceef77056c929926d9b88c87a04feed7f4 | |
| parent | 3beaa244af57fde2d6ce5d6183df44062a4eca0f (diff) | |
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
3 files changed, 16 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index a0d5ea875abf..2fe551494e13 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -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(), diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index dd2583a0db1d..ae7749b7dfe1 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -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; diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java index 95561f5fe0e3..2da4f396094b 100644 --- a/services/core/java/com/android/server/pm/ScanPackageUtils.java +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -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); |