Loading services/core/java/com/android/server/pm/PackageInstallerService.java +40 −28 Original line number Diff line number Diff line Loading @@ -286,6 +286,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { readSessionsLocked(); expireSessionsLocked(); reconcileStagesLocked(StorageManager.UUID_PRIVATE_INTERNAL); Loading Loading @@ -462,18 +463,41 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements Slog.e(TAG, "Could not read session", e); continue; } mSessions.put(session.sessionId, session); mAllocatedSessions.put(session.sessionId, true); } } } } catch (FileNotFoundException e) { // Missing sessions are okay, probably first boot } catch (IOException | XmlPullParserException e) { Slog.wtf(TAG, "Failed reading install sessions", e); } finally { IoUtils.closeQuietly(fis); } // After reboot housekeeping. for (int i = 0; i < mSessions.size(); ++i) { PackageInstallerSession session = mSessions.valueAt(i); session.onAfterSessionRead(mSessions); } } @GuardedBy("mSessions") private void expireSessionsLocked() { SparseArray<PackageInstallerSession> tmp = mSessions.clone(); final int n = tmp.size(); for (int i = 0; i < n; ++i) { PackageInstallerSession session = tmp.valueAt(i); if (session.hasParentSessionId()) { // Child sessions will be expired when handling parent sessions continue; } final long age = System.currentTimeMillis() - session.createdMillis; final long timeSinceUpdate = System.currentTimeMillis() - session.getUpdatedMillis(); final long timeSinceUpdate = System.currentTimeMillis() - session.getUpdatedMillis(); final boolean valid; if (session.isStaged()) { if (timeSinceUpdate >= MAX_TIME_SINCE_UPDATE_MILLIS && session.isStagedAndInTerminalState()) { valid = false; } else { valid = true; } valid = !session.isStagedAndInTerminalState() || timeSinceUpdate < MAX_TIME_SINCE_UPDATE_MILLIS; } else if (age >= MAX_AGE_MILLIS) { Slog.w(TAG, "Abandoning old session created at " + session.createdMillis); Loading @@ -481,30 +505,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } else { valid = true; } if (valid) { mSessions.put(session.sessionId, session); } else { if (!valid) { // Remove expired sessions as well as child sessions if any mSessions.remove(session.sessionId); // Since this is early during boot we don't send // any observer events about the session, but we // keep details around for dumpsys. addHistoricalSessionLocked(session); } mAllocatedSessions.put(session.sessionId, true); } for (PackageInstallerSession child : session.getChildSessions()) { mSessions.remove(child.sessionId); addHistoricalSessionLocked(child); } } } catch (FileNotFoundException e) { // Missing sessions are okay, probably first boot } catch (IOException | XmlPullParserException e) { Slog.wtf(TAG, "Failed reading install sessions", e); } finally { IoUtils.closeQuietly(fis); } // After reboot housekeeping. for (int i = 0; i < mSessions.size(); ++i) { PackageInstallerSession session = mSessions.valueAt(i); session.onAfterSessionRead(mSessions); } } Loading Loading
services/core/java/com/android/server/pm/PackageInstallerService.java +40 −28 Original line number Diff line number Diff line Loading @@ -286,6 +286,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { readSessionsLocked(); expireSessionsLocked(); reconcileStagesLocked(StorageManager.UUID_PRIVATE_INTERNAL); Loading Loading @@ -462,18 +463,41 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements Slog.e(TAG, "Could not read session", e); continue; } mSessions.put(session.sessionId, session); mAllocatedSessions.put(session.sessionId, true); } } } } catch (FileNotFoundException e) { // Missing sessions are okay, probably first boot } catch (IOException | XmlPullParserException e) { Slog.wtf(TAG, "Failed reading install sessions", e); } finally { IoUtils.closeQuietly(fis); } // After reboot housekeeping. for (int i = 0; i < mSessions.size(); ++i) { PackageInstallerSession session = mSessions.valueAt(i); session.onAfterSessionRead(mSessions); } } @GuardedBy("mSessions") private void expireSessionsLocked() { SparseArray<PackageInstallerSession> tmp = mSessions.clone(); final int n = tmp.size(); for (int i = 0; i < n; ++i) { PackageInstallerSession session = tmp.valueAt(i); if (session.hasParentSessionId()) { // Child sessions will be expired when handling parent sessions continue; } final long age = System.currentTimeMillis() - session.createdMillis; final long timeSinceUpdate = System.currentTimeMillis() - session.getUpdatedMillis(); final long timeSinceUpdate = System.currentTimeMillis() - session.getUpdatedMillis(); final boolean valid; if (session.isStaged()) { if (timeSinceUpdate >= MAX_TIME_SINCE_UPDATE_MILLIS && session.isStagedAndInTerminalState()) { valid = false; } else { valid = true; } valid = !session.isStagedAndInTerminalState() || timeSinceUpdate < MAX_TIME_SINCE_UPDATE_MILLIS; } else if (age >= MAX_AGE_MILLIS) { Slog.w(TAG, "Abandoning old session created at " + session.createdMillis); Loading @@ -481,30 +505,18 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } else { valid = true; } if (valid) { mSessions.put(session.sessionId, session); } else { if (!valid) { // Remove expired sessions as well as child sessions if any mSessions.remove(session.sessionId); // Since this is early during boot we don't send // any observer events about the session, but we // keep details around for dumpsys. addHistoricalSessionLocked(session); } mAllocatedSessions.put(session.sessionId, true); } for (PackageInstallerSession child : session.getChildSessions()) { mSessions.remove(child.sessionId); addHistoricalSessionLocked(child); } } } catch (FileNotFoundException e) { // Missing sessions are okay, probably first boot } catch (IOException | XmlPullParserException e) { Slog.wtf(TAG, "Failed reading install sessions", e); } finally { IoUtils.closeQuietly(fis); } // After reboot housekeeping. for (int i = 0; i < mSessions.size(); ++i) { PackageInstallerSession session = mSessions.valueAt(i); session.onAfterSessionRead(mSessions); } } Loading