Loading core/java/android/content/pm/IPackageInstaller.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -63,4 +63,5 @@ interface IPackageInstaller { void bypassNextStagedInstallerCheck(boolean value); void setAllowUnlimitedSilentUpdates(String installerPackageName); void setSilentUpdatesThrottleTime(long throttleTimeInSeconds); } services/core/java/com/android/server/pm/PackageInstallerService.java +11 −0 Original line number Diff line number Diff line Loading @@ -1117,6 +1117,17 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mSilentUpdatePolicy.setAllowUnlimitedSilentUpdates(installerPackageName); } /** * Set the silent updates throttle time in seconds. */ @Override public void setSilentUpdatesThrottleTime(long throttleTimeInSeconds) { if (!isCalledBySystemOrShell(Binder.getCallingUid())) { throw new SecurityException("Caller not allowed to set silent updates throttle time"); } mSilentUpdatePolicy.setSilentUpdatesThrottleTime(throttleTimeInSeconds); } private static int getSessionCount(SparseArray<PackageInstallerSession> sessions, int installerUid) { int count = 0; Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +35 −10 Original line number Diff line number Diff line Loading @@ -307,8 +307,8 @@ class PackageManagerShellCommand extends ShellCommand { return runLogVisibility(); case "bypass-staged-installer-check": return runBypassStagedInstallerCheck(); case "allow-unlimited-silent-updates": return runAllowUnlimitedSilentUpdates(); case "set-silent-updates-policy": return runSetSilentUpdatesPolicy(); default: { Boolean domainVerificationResult = mDomainVerificationShell.runCommand(this, cmd); Loading Loading @@ -3041,12 +3041,20 @@ class PackageManagerShellCommand extends ShellCommand { } } private int runAllowUnlimitedSilentUpdates() { private int runSetSilentUpdatesPolicy() { final PrintWriter pw = getOutPrintWriter(); String opt; String installerPackageName = null; Long throttleTimeInSeconds = null; boolean reset = false; while ((opt = getNextOption()) != null) { switch (opt) { case "--allow-unlimited-silent-updates": installerPackageName = getNextArgRequired(); break; case "--throttle-time": throttleTimeInSeconds = Long.parseLong(getNextArgRequired()); break; case "--reset": reset = true; break; Loading @@ -3055,10 +3063,24 @@ class PackageManagerShellCommand extends ShellCommand { return -1; } } if (throttleTimeInSeconds != null && throttleTimeInSeconds < 0) { pw.println("Error: Invalid value for \"--throttle-time\":" + throttleTimeInSeconds); return -1; } final String installerPackageName = reset ? null : getNextArgRequired(); try { mInterface.getPackageInstaller().setAllowUnlimitedSilentUpdates(installerPackageName); final IPackageInstaller installer = mInterface.getPackageInstaller(); if (reset) { installer.setAllowUnlimitedSilentUpdates(null /* installerPackageName */); installer.setSilentUpdatesThrottleTime(-1 /* restore to the default */); } else { if (installerPackageName != null) { installer.setAllowUnlimitedSilentUpdates(installerPackageName); } if (throttleTimeInSeconds != null) { installer.setSilentUpdatesThrottleTime(throttleTimeInSeconds); } } } catch (RemoteException e) { pw.println("Failure [" + e.getClass().getName() + " - " Loading Loading @@ -3889,11 +3911,14 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" --enable: turn on debug logging (default)"); pw.println(" --disable: turn off debug logging"); pw.println(""); pw.println(" allow-unlimited-silent-updates (--reset | <INSTALLER>)"); pw.println(" Allows unlimited silent updated installation requests from the installer"); pw.println(" without the throttle time."); pw.println(" --reset: clear the allowed installer and tracks of silent updates in"); pw.println(" the system."); pw.println(" set-silent-updates-policy [--allow-unlimited-silent-updates <INSTALLER>]"); pw.println(" [--throttle-time <SECONDS>] [--reset]"); pw.println(" Sets the policies of the silent updates."); pw.println(" --allow-unlimited-silent-updates: allows unlimited silent updated"); pw.println(" installation requests from the installer without the throttle time."); pw.println(" --throttle-time: update the silent updates throttle time in seconds."); pw.println(" --reset: restore the installer and throttle time to the default, and"); pw.println(" clear tracks of silent updates in the system."); pw.println(""); mDomainVerificationShell.printHelp(pw); pw.println(""); Loading services/core/java/com/android/server/pm/SilentUpdatePolicy.java +25 −3 Original line number Diff line number Diff line Loading @@ -33,7 +33,8 @@ import java.util.concurrent.TimeUnit; * in the {@link PackageInstallerSession}. */ public class SilentUpdatePolicy { // A throttle time to prevent the installer from silently updating the same app repeatedly. // The default throttle time to prevent the installer from silently updating the same app // repeatedly. private static final long SILENT_UPDATE_THROTTLE_TIME_MS = TimeUnit.SECONDS.toMillis(30); // Map to the uptime timestamp for each installer and app of the silent update. Loading @@ -44,6 +45,9 @@ public class SilentUpdatePolicy { @GuardedBy("mSilentUpdateInfos") private String mAllowUnlimitedSilentUpdatesInstaller; @GuardedBy("mSilentUpdateInfos") private long mSilentUpdateThrottleTimeMs = SILENT_UPDATE_THROTTLE_TIME_MS; /** * Checks if the silent update is allowed by the given installer and app package name. * Loading @@ -58,7 +62,11 @@ public class SilentUpdatePolicy { return true; } final long lastSilentUpdatedMs = getTimestampMs(installerPackageName, packageName); return SystemClock.uptimeMillis() - lastSilentUpdatedMs > SILENT_UPDATE_THROTTLE_TIME_MS; final long throttleTimeMs; synchronized (mSilentUpdateInfos) { throttleTimeMs = mSilentUpdateThrottleTimeMs; } return SystemClock.uptimeMillis() - lastSilentUpdatedMs > throttleTimeMs; } /** Loading Loading @@ -99,11 +107,25 @@ public class SilentUpdatePolicy { } } /** * Set the silent updates throttle time in seconds. * * @param throttleTimeInSeconds The throttle time to set, or <code>-1</code> to restore the * value to the default. */ void setSilentUpdatesThrottleTime(long throttleTimeInSeconds) { synchronized (mSilentUpdateInfos) { mSilentUpdateThrottleTimeMs = throttleTimeInSeconds >= 0 ? TimeUnit.SECONDS.toMillis(throttleTimeInSeconds) : SILENT_UPDATE_THROTTLE_TIME_MS; } } private void pruneLocked(long uptime) { final int size = mSilentUpdateInfos.size(); for (int i = size - 1; i >= 0; i--) { final long lastSilentUpdatedMs = mSilentUpdateInfos.valueAt(i); if (uptime - lastSilentUpdatedMs > SILENT_UPDATE_THROTTLE_TIME_MS) { if (uptime - lastSilentUpdatedMs > mSilentUpdateThrottleTimeMs) { mSilentUpdateInfos.removeAt(i); } } Loading Loading
core/java/android/content/pm/IPackageInstaller.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -63,4 +63,5 @@ interface IPackageInstaller { void bypassNextStagedInstallerCheck(boolean value); void setAllowUnlimitedSilentUpdates(String installerPackageName); void setSilentUpdatesThrottleTime(long throttleTimeInSeconds); }
services/core/java/com/android/server/pm/PackageInstallerService.java +11 −0 Original line number Diff line number Diff line Loading @@ -1117,6 +1117,17 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mSilentUpdatePolicy.setAllowUnlimitedSilentUpdates(installerPackageName); } /** * Set the silent updates throttle time in seconds. */ @Override public void setSilentUpdatesThrottleTime(long throttleTimeInSeconds) { if (!isCalledBySystemOrShell(Binder.getCallingUid())) { throw new SecurityException("Caller not allowed to set silent updates throttle time"); } mSilentUpdatePolicy.setSilentUpdatesThrottleTime(throttleTimeInSeconds); } private static int getSessionCount(SparseArray<PackageInstallerSession> sessions, int installerUid) { int count = 0; Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +35 −10 Original line number Diff line number Diff line Loading @@ -307,8 +307,8 @@ class PackageManagerShellCommand extends ShellCommand { return runLogVisibility(); case "bypass-staged-installer-check": return runBypassStagedInstallerCheck(); case "allow-unlimited-silent-updates": return runAllowUnlimitedSilentUpdates(); case "set-silent-updates-policy": return runSetSilentUpdatesPolicy(); default: { Boolean domainVerificationResult = mDomainVerificationShell.runCommand(this, cmd); Loading Loading @@ -3041,12 +3041,20 @@ class PackageManagerShellCommand extends ShellCommand { } } private int runAllowUnlimitedSilentUpdates() { private int runSetSilentUpdatesPolicy() { final PrintWriter pw = getOutPrintWriter(); String opt; String installerPackageName = null; Long throttleTimeInSeconds = null; boolean reset = false; while ((opt = getNextOption()) != null) { switch (opt) { case "--allow-unlimited-silent-updates": installerPackageName = getNextArgRequired(); break; case "--throttle-time": throttleTimeInSeconds = Long.parseLong(getNextArgRequired()); break; case "--reset": reset = true; break; Loading @@ -3055,10 +3063,24 @@ class PackageManagerShellCommand extends ShellCommand { return -1; } } if (throttleTimeInSeconds != null && throttleTimeInSeconds < 0) { pw.println("Error: Invalid value for \"--throttle-time\":" + throttleTimeInSeconds); return -1; } final String installerPackageName = reset ? null : getNextArgRequired(); try { mInterface.getPackageInstaller().setAllowUnlimitedSilentUpdates(installerPackageName); final IPackageInstaller installer = mInterface.getPackageInstaller(); if (reset) { installer.setAllowUnlimitedSilentUpdates(null /* installerPackageName */); installer.setSilentUpdatesThrottleTime(-1 /* restore to the default */); } else { if (installerPackageName != null) { installer.setAllowUnlimitedSilentUpdates(installerPackageName); } if (throttleTimeInSeconds != null) { installer.setSilentUpdatesThrottleTime(throttleTimeInSeconds); } } } catch (RemoteException e) { pw.println("Failure [" + e.getClass().getName() + " - " Loading Loading @@ -3889,11 +3911,14 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" --enable: turn on debug logging (default)"); pw.println(" --disable: turn off debug logging"); pw.println(""); pw.println(" allow-unlimited-silent-updates (--reset | <INSTALLER>)"); pw.println(" Allows unlimited silent updated installation requests from the installer"); pw.println(" without the throttle time."); pw.println(" --reset: clear the allowed installer and tracks of silent updates in"); pw.println(" the system."); pw.println(" set-silent-updates-policy [--allow-unlimited-silent-updates <INSTALLER>]"); pw.println(" [--throttle-time <SECONDS>] [--reset]"); pw.println(" Sets the policies of the silent updates."); pw.println(" --allow-unlimited-silent-updates: allows unlimited silent updated"); pw.println(" installation requests from the installer without the throttle time."); pw.println(" --throttle-time: update the silent updates throttle time in seconds."); pw.println(" --reset: restore the installer and throttle time to the default, and"); pw.println(" clear tracks of silent updates in the system."); pw.println(""); mDomainVerificationShell.printHelp(pw); pw.println(""); Loading
services/core/java/com/android/server/pm/SilentUpdatePolicy.java +25 −3 Original line number Diff line number Diff line Loading @@ -33,7 +33,8 @@ import java.util.concurrent.TimeUnit; * in the {@link PackageInstallerSession}. */ public class SilentUpdatePolicy { // A throttle time to prevent the installer from silently updating the same app repeatedly. // The default throttle time to prevent the installer from silently updating the same app // repeatedly. private static final long SILENT_UPDATE_THROTTLE_TIME_MS = TimeUnit.SECONDS.toMillis(30); // Map to the uptime timestamp for each installer and app of the silent update. Loading @@ -44,6 +45,9 @@ public class SilentUpdatePolicy { @GuardedBy("mSilentUpdateInfos") private String mAllowUnlimitedSilentUpdatesInstaller; @GuardedBy("mSilentUpdateInfos") private long mSilentUpdateThrottleTimeMs = SILENT_UPDATE_THROTTLE_TIME_MS; /** * Checks if the silent update is allowed by the given installer and app package name. * Loading @@ -58,7 +62,11 @@ public class SilentUpdatePolicy { return true; } final long lastSilentUpdatedMs = getTimestampMs(installerPackageName, packageName); return SystemClock.uptimeMillis() - lastSilentUpdatedMs > SILENT_UPDATE_THROTTLE_TIME_MS; final long throttleTimeMs; synchronized (mSilentUpdateInfos) { throttleTimeMs = mSilentUpdateThrottleTimeMs; } return SystemClock.uptimeMillis() - lastSilentUpdatedMs > throttleTimeMs; } /** Loading Loading @@ -99,11 +107,25 @@ public class SilentUpdatePolicy { } } /** * Set the silent updates throttle time in seconds. * * @param throttleTimeInSeconds The throttle time to set, or <code>-1</code> to restore the * value to the default. */ void setSilentUpdatesThrottleTime(long throttleTimeInSeconds) { synchronized (mSilentUpdateInfos) { mSilentUpdateThrottleTimeMs = throttleTimeInSeconds >= 0 ? TimeUnit.SECONDS.toMillis(throttleTimeInSeconds) : SILENT_UPDATE_THROTTLE_TIME_MS; } } private void pruneLocked(long uptime) { final int size = mSilentUpdateInfos.size(); for (int i = size - 1; i >= 0; i--) { final long lastSilentUpdatedMs = mSilentUpdateInfos.valueAt(i); if (uptime - lastSilentUpdatedMs > SILENT_UPDATE_THROTTLE_TIME_MS) { if (uptime - lastSilentUpdatedMs > mSilentUpdateThrottleTimeMs) { mSilentUpdateInfos.removeAt(i); } } Loading