Loading apex/jobscheduler/service/java/com/android/server/tare/Agent.java +5 −6 Original line number Original line Diff line number Diff line Loading @@ -286,7 +286,7 @@ class Agent { for (int i = 0; i < pkgNames.size(); ++i) { for (int i = 0; i < pkgNames.size(); ++i) { final String pkgName = pkgNames.valueAt(i); final String pkgName = pkgNames.valueAt(i); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); SparseArrayMap<String, OngoingEvent> ongoingEvents = SparseArrayMap<String, OngoingEvent> ongoingEvents = mCurrentOngoingEvents.get(userId, pkgName); mCurrentOngoingEvents.get(userId, pkgName); if (ongoingEvents != null) { if (ongoingEvents != null) { Loading Loading @@ -321,7 +321,7 @@ class Agent { final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = SystemClock.elapsedRealtime(); final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked(); final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked(); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); SparseArrayMap<String, OngoingEvent> ongoingEvents = SparseArrayMap<String, OngoingEvent> ongoingEvents = mCurrentOngoingEvents.get(userId, pkgName); mCurrentOngoingEvents.get(userId, pkgName); if (ongoingEvents != null) { if (ongoingEvents != null) { Loading Loading @@ -397,7 +397,7 @@ class Agent { if (actionAffordabilityNotes != null) { if (actionAffordabilityNotes != null) { final int size = actionAffordabilityNotes.size(); final int size = actionAffordabilityNotes.size(); final long newBalance = getBalanceLocked(userId, pkgName); final long newBalance = getBalanceLocked(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); for (int n = 0; n < size; ++n) { for (int n = 0; n < size; ++n) { final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n); final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n); note.recalculateCosts(economicPolicy, userId, pkgName); note.recalculateCosts(economicPolicy, userId, pkgName); Loading Loading @@ -503,7 +503,8 @@ class Agent { "Tried to adjust system balance for " + appToString(userId, pkgName)); "Tried to adjust system balance for " + appToString(userId, pkgName)); return; return; } } if (mIrs.isVip(userId, pkgName)) { final boolean isVip = mIrs.isVip(userId, pkgName); if (isVip) { // This could happen if the app was made a VIP after it started performing actions. // This could happen if the app was made a VIP after it started performing actions. // Continue recording the transaction for debugging purposes, but don't let it change // Continue recording the transaction for debugging purposes, but don't let it change // any numbers. // any numbers. Loading Loading @@ -536,7 +537,6 @@ class Agent { mActionAffordabilityNotes.get(userId, pkgName); mActionAffordabilityNotes.get(userId, pkgName); if (actionAffordabilityNotes != null) { if (actionAffordabilityNotes != null) { final long newBalance = ledger.getCurrentBalance(); final long newBalance = ledger.getCurrentBalance(); final boolean isVip = mIrs.isVip(userId, pkgName); for (int i = 0; i < actionAffordabilityNotes.size(); ++i) { for (int i = 0; i < actionAffordabilityNotes.size(); ++i) { final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i); final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i); final boolean isAffordable = isVip final boolean isAffordable = isVip Loading Loading @@ -830,7 +830,6 @@ class Agent { @GuardedBy("mLock") @GuardedBy("mLock") void onUserRemovedLocked(final int userId) { void onUserRemovedLocked(final int userId) { mScribe.discardLedgersLocked(userId); mCurrentOngoingEvents.delete(userId); mCurrentOngoingEvents.delete(userId); mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId); mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId); } } Loading apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java +15 −1 Original line number Original line Diff line number Diff line Loading @@ -16,14 +16,20 @@ package com.android.server.tare; package com.android.server.tare; import android.Manifest; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.AppGlobals; import android.app.AppGlobals; import android.content.Context; import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.RemoteException; import android.os.RemoteException; import com.android.internal.util.ArrayUtils; /** POJO to cache only the information about installed packages that TARE cares about. */ /** POJO to cache only the information about installed packages that TARE cares about. */ class InstalledPackageInfo { class InstalledPackageInfo { static final int NO_UID = -1; static final int NO_UID = -1; Loading @@ -31,14 +37,22 @@ class InstalledPackageInfo { public final int uid; public final int uid; public final String packageName; public final String packageName; public final boolean hasCode; public final boolean hasCode; public final boolean isSystemInstaller; @Nullable @Nullable public final String installerPackageName; public final String installerPackageName; InstalledPackageInfo(@NonNull PackageInfo packageInfo) { InstalledPackageInfo(@NonNull Context context, @NonNull PackageInfo packageInfo) { final ApplicationInfo applicationInfo = packageInfo.applicationInfo; final ApplicationInfo applicationInfo = packageInfo.applicationInfo; uid = applicationInfo == null ? NO_UID : applicationInfo.uid; uid = applicationInfo == null ? NO_UID : applicationInfo.uid; packageName = packageInfo.packageName; packageName = packageInfo.packageName; hasCode = applicationInfo != null && applicationInfo.hasCode(); hasCode = applicationInfo != null && applicationInfo.hasCode(); isSystemInstaller = applicationInfo != null && ArrayUtils.indexOf( packageInfo.requestedPermissions, Manifest.permission.INSTALL_PACKAGES) >= 0 && PackageManager.PERMISSION_GRANTED == PermissionChecker.checkPermissionForPreflight(context, Manifest.permission.INSTALL_PACKAGES, PermissionChecker.PID_UNKNOWN, applicationInfo.uid, packageName); InstallSourceInfo installSourceInfo = null; InstallSourceInfo installSourceInfo = null; try { try { installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName); installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName); Loading apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +160 −4 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; import android.util.SparseArrayMap; import android.util.SparseArrayMap; import android.util.SparseLongArray; import android.util.SparseSetArray; import android.util.SparseSetArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -107,6 +108,16 @@ public class InternalResourceService extends SystemService { private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS; private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS; /** The amount of time to delay reclamation by after boot. */ /** The amount of time to delay reclamation by after boot. */ private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L; private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L; /** * The amount of time after TARE has first been set up that a system installer will be allowed * expanded credit privileges. */ static final long INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS = 7 * DAY_IN_MILLIS; /** * The amount of time to wait after TARE has first been set up before considering adjusting the * stock/consumption limit. */ private static final long STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS = 5 * DAY_IN_MILLIS; /** /** * The battery level above which we may consider quantitative easing (increasing the consumption * The battery level above which we may consider quantitative easing (increasing the consumption * limit). * limit). Loading @@ -127,7 +138,7 @@ public class InternalResourceService extends SystemService { private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS; private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS; private static final int PACKAGE_QUERY_FLAGS = private static final int PACKAGE_QUERY_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_APEX; | PackageManager.MATCH_APEX | PackageManager.GET_PERMISSIONS; /** Global lock for all resource economy state. */ /** Global lock for all resource economy state. */ private final Object mLock = new Object(); private final Object mLock = new Object(); Loading Loading @@ -179,6 +190,13 @@ public class InternalResourceService extends SystemService { @GuardedBy("mLock") @GuardedBy("mLock") private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>(); private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>(); /** * Set of temporary Very Important Packages and when their VIP status ends, in the elapsed * realtime ({@link android.annotation.ElapsedRealtimeLong}) timebase. */ @GuardedBy("mLock") private final SparseArrayMap<String, Long> mTemporaryVips = new SparseArrayMap<>(); /** Set of apps each installer is responsible for installing. */ /** Set of apps each installer is responsible for installing. */ @GuardedBy("mLock") @GuardedBy("mLock") private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>(); private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>(); Loading Loading @@ -308,6 +326,7 @@ public class InternalResourceService extends SystemService { private static final int MSG_PROCESS_USAGE_EVENT = 2; private static final int MSG_PROCESS_USAGE_EVENT = 2; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4; private static final int MSG_CLEAN_UP_TEMP_VIP_LIST = 5; private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*"; private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*"; /** /** Loading Loading @@ -413,6 +432,13 @@ public class InternalResourceService extends SystemService { return userPkgs; return userPkgs; } } @Nullable InstalledPackageInfo getInstalledPackageInfo(final int userId, @NonNull final String pkgName) { synchronized (mLock) { return mPkgCache.get(userId, pkgName); } } @GuardedBy("mLock") @GuardedBy("mLock") long getConsumptionLimitLocked() { long getConsumptionLimitLocked() { return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100; return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100; Loading @@ -429,6 +455,11 @@ public class InternalResourceService extends SystemService { return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit(); return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit(); } } long getRealtimeSinceFirstSetupMs() { return mScribe.getRealtimeSinceFirstSetupMs(SystemClock.elapsedRealtime()); } int getUid(final int userId, @NonNull final String pkgName) { int getUid(final int userId, @NonNull final String pkgName) { synchronized (mPackageToUidCache) { synchronized (mPackageToUidCache) { Integer uid = mPackageToUidCache.get(userId, pkgName); Integer uid = mPackageToUidCache.get(userId, pkgName); Loading Loading @@ -470,6 +501,10 @@ public class InternalResourceService extends SystemService { } } boolean isVip(final int userId, @NonNull String pkgName) { boolean isVip(final int userId, @NonNull String pkgName) { return isVip(userId, pkgName, SystemClock.elapsedRealtime()); } boolean isVip(final int userId, @NonNull String pkgName, final long nowElapsed) { synchronized (mLock) { synchronized (mLock) { final Boolean override = mVipOverrides.get(userId, pkgName); final Boolean override = mVipOverrides.get(userId, pkgName); if (override != null) { if (override != null) { Loading @@ -481,6 +516,12 @@ public class InternalResourceService extends SystemService { // operate. // operate. return true; return true; } } synchronized (mLock) { final Long expirationTimeElapsed = mTemporaryVips.get(userId, pkgName); if (expirationTimeElapsed != null) { return nowElapsed <= expirationTimeElapsed; } } return false; return false; } } Loading Loading @@ -569,7 +610,7 @@ public class InternalResourceService extends SystemService { mPackageToUidCache.add(userId, pkgName, uid); mPackageToUidCache.add(userId, pkgName, uid); } } synchronized (mLock) { synchronized (mLock) { final InstalledPackageInfo ipo = new InstalledPackageInfo(packageInfo); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), packageInfo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); mUidToPackageCache.add(uid, pkgName); mUidToPackageCache.add(uid, pkgName); Loading Loading @@ -626,11 +667,16 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { for (int i = pkgs.size() - 1; i >= 0; --i) { final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), pkgs.get(i)); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); } } mAgent.grantBirthrightsLocked(userId); mAgent.grantBirthrightsLocked(userId); final long nowElapsed = SystemClock.elapsedRealtime(); mScribe.setUserAddedTimeLocked(userId, nowElapsed); grantInstallersTemporaryVipStatusLocked(userId, nowElapsed, INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS); } } } } Loading @@ -647,6 +693,7 @@ public class InternalResourceService extends SystemService { mInstallers.delete(userId); mInstallers.delete(userId); mPkgCache.delete(userId); mPkgCache.delete(userId); mAgent.onUserRemovedLocked(userId); mAgent.onUserRemovedLocked(userId); mScribe.onUserRemovedLocked(userId); } } } } Loading @@ -659,6 +706,10 @@ public class InternalResourceService extends SystemService { maybeAdjustDesiredStockLevelLocked(); maybeAdjustDesiredStockLevelLocked(); return; return; } } if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) { // Things can be very tumultuous soon after first setup. return; } // We don't need to increase the limit if the device runs out of consumable credits // We don't need to increase the limit if the device runs out of consumable credits // when the battery is low. // when the battery is low. final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked(); final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked(); Loading Loading @@ -687,6 +738,10 @@ public class InternalResourceService extends SystemService { if (!mConfigObserver.ENABLE_TIP3) { if (!mConfigObserver.ENABLE_TIP3) { return; return; } } if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) { // Things can be very tumultuous soon after first setup. return; } // Don't adjust the limit too often or while the battery is low. // Don't adjust the limit too often or while the battery is low. final long now = getCurrentTimeMillis(); final long now = getCurrentTimeMillis(); if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS Loading Loading @@ -775,6 +830,28 @@ public class InternalResourceService extends SystemService { mAgent.onCreditSupplyChanged(); mAgent.onCreditSupplyChanged(); } } @GuardedBy("mLock") private void grantInstallersTemporaryVipStatusLocked(int userId, long nowElapsed, long grantDurationMs) { final long grantEndTimeElapsed = nowElapsed + grantDurationMs; final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx < 0) { return; } for (int pIdx = mPkgCache.numElementsForKey(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo ipo = mPkgCache.valueAt(uIdx, pIdx); if (ipo.isSystemInstaller) { final Long currentGrantEndTimeElapsed = mTemporaryVips.get(userId, ipo.packageName); if (currentGrantEndTimeElapsed == null || currentGrantEndTimeElapsed < grantEndTimeElapsed) { mTemporaryVips.add(userId, ipo.packageName, grantEndTimeElapsed); } } } mHandler.sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, grantDurationMs); } @GuardedBy("mLock") @GuardedBy("mLock") private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) { private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) { if (!mIsEnabled) { if (!mIsEnabled) { Loading Loading @@ -870,7 +947,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { for (int i = pkgs.size() - 1; i >= 0; --i) { final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), pkgs.get(i)); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); } } Loading Loading @@ -953,11 +1031,17 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { synchronized (mLock) { mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); loadInstalledPackageListLocked(); loadInstalledPackageListLocked(); final SparseLongArray timeSinceUsersAdded; final boolean isFirstSetup = !mScribe.recordExists(); final boolean isFirstSetup = !mScribe.recordExists(); final long nowElapsed = SystemClock.elapsedRealtime(); if (isFirstSetup) { if (isFirstSetup) { mAgent.grantBirthrightsLocked(); mAgent.grantBirthrightsLocked(); mScribe.setConsumptionLimitLocked( mScribe.setConsumptionLimitLocked( mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()); mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()); // Set the last reclamation time to now so we don't start reclaiming assets // too early. mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis()); timeSinceUsersAdded = new SparseLongArray(); } else { } else { mScribe.loadFromDiskLocked(); mScribe.loadFromDiskLocked(); if (mScribe.getSatiatedConsumptionLimitLocked() if (mScribe.getSatiatedConsumptionLimitLocked() Loading @@ -971,6 +1055,21 @@ public class InternalResourceService extends SystemService { // Adjust the supply in case battery level changed while the device was off. // Adjust the supply in case battery level changed while the device was off. adjustCreditSupplyLocked(true); adjustCreditSupplyLocked(true); } } timeSinceUsersAdded = mScribe.getRealtimeSinceUsersAddedLocked(nowElapsed); } final int[] userIds = LocalServices.getService(UserManagerInternal.class).getUserIds(); for (int userId : userIds) { final long timeSinceUserAddedMs = timeSinceUsersAdded.get(userId, 0); // Temporarily mark installers as VIPs so they aren't subject to credit // limits and policies on first boot. if (timeSinceUserAddedMs < INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS) { final long remainingGraceDurationMs = INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS - timeSinceUserAddedMs; grantInstallersTemporaryVipStatusLocked(userId, nowElapsed, remainingGraceDurationMs); } } } scheduleUnusedWealthReclamationLocked(); scheduleUnusedWealthReclamationLocked(); } } Loading Loading @@ -1079,6 +1178,36 @@ public class InternalResourceService extends SystemService { @Override @Override public void handleMessage(Message msg) { public void handleMessage(Message msg) { switch (msg.what) { switch (msg.what) { case MSG_CLEAN_UP_TEMP_VIP_LIST: { removeMessages(MSG_CLEAN_UP_TEMP_VIP_LIST); synchronized (mLock) { final long nowElapsed = SystemClock.elapsedRealtime(); long earliestExpiration = Long.MAX_VALUE; for (int u = 0; u < mTemporaryVips.numMaps(); ++u) { final int userId = mTemporaryVips.keyAt(u); for (int p = mTemporaryVips.numElementsForKeyAt(u) - 1; p >= 0; --p) { final String pkgName = mTemporaryVips.keyAt(u, p); final Long expiration = mTemporaryVips.valueAt(u, p); if (expiration == null || expiration < nowElapsed) { mTemporaryVips.delete(userId, pkgName); } else { earliestExpiration = Math.min(earliestExpiration, expiration); } } } if (earliestExpiration < Long.MAX_VALUE) { sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, earliestExpiration - nowElapsed); } } } break; case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: { case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: { final SomeArgs args = (SomeArgs) msg.obj; final SomeArgs args = (SomeArgs) msg.obj; final int userId = args.argi1; final int userId = args.argi1; Loading Loading @@ -1558,6 +1687,7 @@ public class InternalResourceService extends SystemService { boolean printedVips = false; boolean printedVips = false; pw.println(); pw.println(); pw.print("VIPs:"); pw.print("VIPs:"); pw.increaseIndent(); for (int u = 0; u < mVipOverrides.numMaps(); ++u) { for (int u = 0; u < mVipOverrides.numMaps(); ++u) { final int userId = mVipOverrides.keyAt(u); final int userId = mVipOverrides.keyAt(u); Loading @@ -1576,6 +1706,32 @@ public class InternalResourceService extends SystemService { } else { } else { pw.print(" None"); pw.print(" None"); } } pw.decreaseIndent(); pw.println(); boolean printedTempVips = false; pw.println(); pw.print("Temp VIPs:"); pw.increaseIndent(); for (int u = 0; u < mTemporaryVips.numMaps(); ++u) { final int userId = mTemporaryVips.keyAt(u); for (int p = 0; p < mTemporaryVips.numElementsForKeyAt(u); ++p) { final String pkgName = mTemporaryVips.keyAt(u, p); printedTempVips = true; pw.println(); pw.print(appToString(userId, pkgName)); pw.print("="); pw.print(mTemporaryVips.valueAt(u, p)); } } if (printedTempVips) { pw.println(); } else { pw.print(" None"); } pw.decreaseIndent(); pw.println(); pw.println(); pw.println(); pw.println(); Loading apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -117,6 +117,7 @@ import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.TareUtils.appToString; import static com.android.server.tare.TareUtils.cakeToString; import static com.android.server.tare.TareUtils.cakeToString; import android.annotation.NonNull; import android.annotation.NonNull; Loading Loading @@ -210,6 +211,22 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { if (mIrs.isPackageRestricted(userId, pkgName)) { if (mIrs.isPackageRestricted(userId, pkgName)) { return 0; return 0; } } final InstalledPackageInfo ipo = mIrs.getInstalledPackageInfo(userId, pkgName); if (ipo == null) { Slog.wtfStack(TAG, "Tried to get max balance of invalid app: " + appToString(userId, pkgName)); } else { // A system installer's max balance is elevated for some time after first boot so // they can use jobs to download and install apps. if (ipo.isSystemInstaller) { final long timeSinceFirstSetupMs = mIrs.getRealtimeSinceFirstSetupMs(); final boolean stillExempted = timeSinceFirstSetupMs < InternalResourceService.INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS; if (stillExempted) { return mMaxSatiatedConsumptionLimit; } } } return mMaxSatiatedBalance; return mMaxSatiatedBalance; } } Loading apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +56 −2 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
apex/jobscheduler/service/java/com/android/server/tare/Agent.java +5 −6 Original line number Original line Diff line number Diff line Loading @@ -286,7 +286,7 @@ class Agent { for (int i = 0; i < pkgNames.size(); ++i) { for (int i = 0; i < pkgNames.size(); ++i) { final String pkgName = pkgNames.valueAt(i); final String pkgName = pkgNames.valueAt(i); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); SparseArrayMap<String, OngoingEvent> ongoingEvents = SparseArrayMap<String, OngoingEvent> ongoingEvents = mCurrentOngoingEvents.get(userId, pkgName); mCurrentOngoingEvents.get(userId, pkgName); if (ongoingEvents != null) { if (ongoingEvents != null) { Loading Loading @@ -321,7 +321,7 @@ class Agent { final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = SystemClock.elapsedRealtime(); final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked(); final CompleteEconomicPolicy economicPolicy = mIrs.getCompleteEconomicPolicyLocked(); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); SparseArrayMap<String, OngoingEvent> ongoingEvents = SparseArrayMap<String, OngoingEvent> ongoingEvents = mCurrentOngoingEvents.get(userId, pkgName); mCurrentOngoingEvents.get(userId, pkgName); if (ongoingEvents != null) { if (ongoingEvents != null) { Loading Loading @@ -397,7 +397,7 @@ class Agent { if (actionAffordabilityNotes != null) { if (actionAffordabilityNotes != null) { final int size = actionAffordabilityNotes.size(); final int size = actionAffordabilityNotes.size(); final long newBalance = getBalanceLocked(userId, pkgName); final long newBalance = getBalanceLocked(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName); final boolean isVip = mIrs.isVip(userId, pkgName, nowElapsed); for (int n = 0; n < size; ++n) { for (int n = 0; n < size; ++n) { final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n); final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(n); note.recalculateCosts(economicPolicy, userId, pkgName); note.recalculateCosts(economicPolicy, userId, pkgName); Loading Loading @@ -503,7 +503,8 @@ class Agent { "Tried to adjust system balance for " + appToString(userId, pkgName)); "Tried to adjust system balance for " + appToString(userId, pkgName)); return; return; } } if (mIrs.isVip(userId, pkgName)) { final boolean isVip = mIrs.isVip(userId, pkgName); if (isVip) { // This could happen if the app was made a VIP after it started performing actions. // This could happen if the app was made a VIP after it started performing actions. // Continue recording the transaction for debugging purposes, but don't let it change // Continue recording the transaction for debugging purposes, but don't let it change // any numbers. // any numbers. Loading Loading @@ -536,7 +537,6 @@ class Agent { mActionAffordabilityNotes.get(userId, pkgName); mActionAffordabilityNotes.get(userId, pkgName); if (actionAffordabilityNotes != null) { if (actionAffordabilityNotes != null) { final long newBalance = ledger.getCurrentBalance(); final long newBalance = ledger.getCurrentBalance(); final boolean isVip = mIrs.isVip(userId, pkgName); for (int i = 0; i < actionAffordabilityNotes.size(); ++i) { for (int i = 0; i < actionAffordabilityNotes.size(); ++i) { final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i); final ActionAffordabilityNote note = actionAffordabilityNotes.valueAt(i); final boolean isAffordable = isVip final boolean isAffordable = isVip Loading Loading @@ -830,7 +830,6 @@ class Agent { @GuardedBy("mLock") @GuardedBy("mLock") void onUserRemovedLocked(final int userId) { void onUserRemovedLocked(final int userId) { mScribe.discardLedgersLocked(userId); mCurrentOngoingEvents.delete(userId); mCurrentOngoingEvents.delete(userId); mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId); mBalanceThresholdAlarmQueue.removeAlarmsForUserId(userId); } } Loading
apex/jobscheduler/service/java/com/android/server/tare/InstalledPackageInfo.java +15 −1 Original line number Original line Diff line number Diff line Loading @@ -16,14 +16,20 @@ package com.android.server.tare; package com.android.server.tare; import android.Manifest; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.AppGlobals; import android.app.AppGlobals; import android.content.Context; import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.RemoteException; import android.os.RemoteException; import com.android.internal.util.ArrayUtils; /** POJO to cache only the information about installed packages that TARE cares about. */ /** POJO to cache only the information about installed packages that TARE cares about. */ class InstalledPackageInfo { class InstalledPackageInfo { static final int NO_UID = -1; static final int NO_UID = -1; Loading @@ -31,14 +37,22 @@ class InstalledPackageInfo { public final int uid; public final int uid; public final String packageName; public final String packageName; public final boolean hasCode; public final boolean hasCode; public final boolean isSystemInstaller; @Nullable @Nullable public final String installerPackageName; public final String installerPackageName; InstalledPackageInfo(@NonNull PackageInfo packageInfo) { InstalledPackageInfo(@NonNull Context context, @NonNull PackageInfo packageInfo) { final ApplicationInfo applicationInfo = packageInfo.applicationInfo; final ApplicationInfo applicationInfo = packageInfo.applicationInfo; uid = applicationInfo == null ? NO_UID : applicationInfo.uid; uid = applicationInfo == null ? NO_UID : applicationInfo.uid; packageName = packageInfo.packageName; packageName = packageInfo.packageName; hasCode = applicationInfo != null && applicationInfo.hasCode(); hasCode = applicationInfo != null && applicationInfo.hasCode(); isSystemInstaller = applicationInfo != null && ArrayUtils.indexOf( packageInfo.requestedPermissions, Manifest.permission.INSTALL_PACKAGES) >= 0 && PackageManager.PERMISSION_GRANTED == PermissionChecker.checkPermissionForPreflight(context, Manifest.permission.INSTALL_PACKAGES, PermissionChecker.PID_UNKNOWN, applicationInfo.uid, packageName); InstallSourceInfo installSourceInfo = null; InstallSourceInfo installSourceInfo = null; try { try { installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName); installSourceInfo = AppGlobals.getPackageManager().getInstallSourceInfo(packageName); Loading
apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +160 −4 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Log; import android.util.Slog; import android.util.Slog; import android.util.SparseArrayMap; import android.util.SparseArrayMap; import android.util.SparseLongArray; import android.util.SparseSetArray; import android.util.SparseSetArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -107,6 +108,16 @@ public class InternalResourceService extends SystemService { private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS; private static final long MIN_UNUSED_TIME_MS = 3 * DAY_IN_MILLIS; /** The amount of time to delay reclamation by after boot. */ /** The amount of time to delay reclamation by after boot. */ private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L; private static final long RECLAMATION_STARTUP_DELAY_MS = 30_000L; /** * The amount of time after TARE has first been set up that a system installer will be allowed * expanded credit privileges. */ static final long INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS = 7 * DAY_IN_MILLIS; /** * The amount of time to wait after TARE has first been set up before considering adjusting the * stock/consumption limit. */ private static final long STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS = 5 * DAY_IN_MILLIS; /** /** * The battery level above which we may consider quantitative easing (increasing the consumption * The battery level above which we may consider quantitative easing (increasing the consumption * limit). * limit). Loading @@ -127,7 +138,7 @@ public class InternalResourceService extends SystemService { private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS; private static final long STOCK_RECALCULATION_MIN_DATA_DURATION_MS = 8 * HOUR_IN_MILLIS; private static final int PACKAGE_QUERY_FLAGS = private static final int PACKAGE_QUERY_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_APEX; | PackageManager.MATCH_APEX | PackageManager.GET_PERMISSIONS; /** Global lock for all resource economy state. */ /** Global lock for all resource economy state. */ private final Object mLock = new Object(); private final Object mLock = new Object(); Loading Loading @@ -179,6 +190,13 @@ public class InternalResourceService extends SystemService { @GuardedBy("mLock") @GuardedBy("mLock") private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>(); private final SparseArrayMap<String, Boolean> mVipOverrides = new SparseArrayMap<>(); /** * Set of temporary Very Important Packages and when their VIP status ends, in the elapsed * realtime ({@link android.annotation.ElapsedRealtimeLong}) timebase. */ @GuardedBy("mLock") private final SparseArrayMap<String, Long> mTemporaryVips = new SparseArrayMap<>(); /** Set of apps each installer is responsible for installing. */ /** Set of apps each installer is responsible for installing. */ @GuardedBy("mLock") @GuardedBy("mLock") private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>(); private final SparseArrayMap<String, ArraySet<String>> mInstallers = new SparseArrayMap<>(); Loading Loading @@ -308,6 +326,7 @@ public class InternalResourceService extends SystemService { private static final int MSG_PROCESS_USAGE_EVENT = 2; private static final int MSG_PROCESS_USAGE_EVENT = 2; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENERS = 3; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4; private static final int MSG_NOTIFY_STATE_CHANGE_LISTENER = 4; private static final int MSG_CLEAN_UP_TEMP_VIP_LIST = 5; private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*"; private static final String ALARM_TAG_WEALTH_RECLAMATION = "*tare.reclamation*"; /** /** Loading Loading @@ -413,6 +432,13 @@ public class InternalResourceService extends SystemService { return userPkgs; return userPkgs; } } @Nullable InstalledPackageInfo getInstalledPackageInfo(final int userId, @NonNull final String pkgName) { synchronized (mLock) { return mPkgCache.get(userId, pkgName); } } @GuardedBy("mLock") @GuardedBy("mLock") long getConsumptionLimitLocked() { long getConsumptionLimitLocked() { return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100; return mCurrentBatteryLevel * mScribe.getSatiatedConsumptionLimitLocked() / 100; Loading @@ -429,6 +455,11 @@ public class InternalResourceService extends SystemService { return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit(); return mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit(); } } long getRealtimeSinceFirstSetupMs() { return mScribe.getRealtimeSinceFirstSetupMs(SystemClock.elapsedRealtime()); } int getUid(final int userId, @NonNull final String pkgName) { int getUid(final int userId, @NonNull final String pkgName) { synchronized (mPackageToUidCache) { synchronized (mPackageToUidCache) { Integer uid = mPackageToUidCache.get(userId, pkgName); Integer uid = mPackageToUidCache.get(userId, pkgName); Loading Loading @@ -470,6 +501,10 @@ public class InternalResourceService extends SystemService { } } boolean isVip(final int userId, @NonNull String pkgName) { boolean isVip(final int userId, @NonNull String pkgName) { return isVip(userId, pkgName, SystemClock.elapsedRealtime()); } boolean isVip(final int userId, @NonNull String pkgName, final long nowElapsed) { synchronized (mLock) { synchronized (mLock) { final Boolean override = mVipOverrides.get(userId, pkgName); final Boolean override = mVipOverrides.get(userId, pkgName); if (override != null) { if (override != null) { Loading @@ -481,6 +516,12 @@ public class InternalResourceService extends SystemService { // operate. // operate. return true; return true; } } synchronized (mLock) { final Long expirationTimeElapsed = mTemporaryVips.get(userId, pkgName); if (expirationTimeElapsed != null) { return nowElapsed <= expirationTimeElapsed; } } return false; return false; } } Loading Loading @@ -569,7 +610,7 @@ public class InternalResourceService extends SystemService { mPackageToUidCache.add(userId, pkgName, uid); mPackageToUidCache.add(userId, pkgName, uid); } } synchronized (mLock) { synchronized (mLock) { final InstalledPackageInfo ipo = new InstalledPackageInfo(packageInfo); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), packageInfo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, pkgName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); mUidToPackageCache.add(uid, pkgName); mUidToPackageCache.add(uid, pkgName); Loading Loading @@ -626,11 +667,16 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { for (int i = pkgs.size() - 1; i >= 0; --i) { final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), pkgs.get(i)); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); } } mAgent.grantBirthrightsLocked(userId); mAgent.grantBirthrightsLocked(userId); final long nowElapsed = SystemClock.elapsedRealtime(); mScribe.setUserAddedTimeLocked(userId, nowElapsed); grantInstallersTemporaryVipStatusLocked(userId, nowElapsed, INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS); } } } } Loading @@ -647,6 +693,7 @@ public class InternalResourceService extends SystemService { mInstallers.delete(userId); mInstallers.delete(userId); mPkgCache.delete(userId); mPkgCache.delete(userId); mAgent.onUserRemovedLocked(userId); mAgent.onUserRemovedLocked(userId); mScribe.onUserRemovedLocked(userId); } } } } Loading @@ -659,6 +706,10 @@ public class InternalResourceService extends SystemService { maybeAdjustDesiredStockLevelLocked(); maybeAdjustDesiredStockLevelLocked(); return; return; } } if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) { // Things can be very tumultuous soon after first setup. return; } // We don't need to increase the limit if the device runs out of consumable credits // We don't need to increase the limit if the device runs out of consumable credits // when the battery is low. // when the battery is low. final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked(); final long remainingConsumableCakes = mScribe.getRemainingConsumableCakesLocked(); Loading Loading @@ -687,6 +738,10 @@ public class InternalResourceService extends SystemService { if (!mConfigObserver.ENABLE_TIP3) { if (!mConfigObserver.ENABLE_TIP3) { return; return; } } if (getRealtimeSinceFirstSetupMs() < STOCK_ADJUSTMENT_FIRST_SETUP_GRACE_PERIOD_MS) { // Things can be very tumultuous soon after first setup. return; } // Don't adjust the limit too often or while the battery is low. // Don't adjust the limit too often or while the battery is low. final long now = getCurrentTimeMillis(); final long now = getCurrentTimeMillis(); if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS if ((now - mScribe.getLastStockRecalculationTimeLocked()) < STOCK_RECALCULATION_DELAY_MS Loading Loading @@ -775,6 +830,28 @@ public class InternalResourceService extends SystemService { mAgent.onCreditSupplyChanged(); mAgent.onCreditSupplyChanged(); } } @GuardedBy("mLock") private void grantInstallersTemporaryVipStatusLocked(int userId, long nowElapsed, long grantDurationMs) { final long grantEndTimeElapsed = nowElapsed + grantDurationMs; final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx < 0) { return; } for (int pIdx = mPkgCache.numElementsForKey(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo ipo = mPkgCache.valueAt(uIdx, pIdx); if (ipo.isSystemInstaller) { final Long currentGrantEndTimeElapsed = mTemporaryVips.get(userId, ipo.packageName); if (currentGrantEndTimeElapsed == null || currentGrantEndTimeElapsed < grantEndTimeElapsed) { mTemporaryVips.add(userId, ipo.packageName, grantEndTimeElapsed); } } } mHandler.sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, grantDurationMs); } @GuardedBy("mLock") @GuardedBy("mLock") private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) { private void processUsageEventLocked(final int userId, @NonNull UsageEvents.Event event) { if (!mIsEnabled) { if (!mIsEnabled) { Loading Loading @@ -870,7 +947,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { for (int i = pkgs.size() - 1; i >= 0; --i) { final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); final InstalledPackageInfo ipo = new InstalledPackageInfo(getContext(), pkgs.get(i)); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); final InstalledPackageInfo oldIpo = mPkgCache.add(userId, ipo.packageName, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); maybeUpdateInstallerStatusLocked(oldIpo, ipo); } } Loading Loading @@ -953,11 +1031,17 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { synchronized (mLock) { mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); loadInstalledPackageListLocked(); loadInstalledPackageListLocked(); final SparseLongArray timeSinceUsersAdded; final boolean isFirstSetup = !mScribe.recordExists(); final boolean isFirstSetup = !mScribe.recordExists(); final long nowElapsed = SystemClock.elapsedRealtime(); if (isFirstSetup) { if (isFirstSetup) { mAgent.grantBirthrightsLocked(); mAgent.grantBirthrightsLocked(); mScribe.setConsumptionLimitLocked( mScribe.setConsumptionLimitLocked( mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()); mCompleteEconomicPolicy.getInitialSatiatedConsumptionLimit()); // Set the last reclamation time to now so we don't start reclaiming assets // too early. mScribe.setLastReclamationTimeLocked(getCurrentTimeMillis()); timeSinceUsersAdded = new SparseLongArray(); } else { } else { mScribe.loadFromDiskLocked(); mScribe.loadFromDiskLocked(); if (mScribe.getSatiatedConsumptionLimitLocked() if (mScribe.getSatiatedConsumptionLimitLocked() Loading @@ -971,6 +1055,21 @@ public class InternalResourceService extends SystemService { // Adjust the supply in case battery level changed while the device was off. // Adjust the supply in case battery level changed while the device was off. adjustCreditSupplyLocked(true); adjustCreditSupplyLocked(true); } } timeSinceUsersAdded = mScribe.getRealtimeSinceUsersAddedLocked(nowElapsed); } final int[] userIds = LocalServices.getService(UserManagerInternal.class).getUserIds(); for (int userId : userIds) { final long timeSinceUserAddedMs = timeSinceUsersAdded.get(userId, 0); // Temporarily mark installers as VIPs so they aren't subject to credit // limits and policies on first boot. if (timeSinceUserAddedMs < INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS) { final long remainingGraceDurationMs = INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS - timeSinceUserAddedMs; grantInstallersTemporaryVipStatusLocked(userId, nowElapsed, remainingGraceDurationMs); } } } scheduleUnusedWealthReclamationLocked(); scheduleUnusedWealthReclamationLocked(); } } Loading Loading @@ -1079,6 +1178,36 @@ public class InternalResourceService extends SystemService { @Override @Override public void handleMessage(Message msg) { public void handleMessage(Message msg) { switch (msg.what) { switch (msg.what) { case MSG_CLEAN_UP_TEMP_VIP_LIST: { removeMessages(MSG_CLEAN_UP_TEMP_VIP_LIST); synchronized (mLock) { final long nowElapsed = SystemClock.elapsedRealtime(); long earliestExpiration = Long.MAX_VALUE; for (int u = 0; u < mTemporaryVips.numMaps(); ++u) { final int userId = mTemporaryVips.keyAt(u); for (int p = mTemporaryVips.numElementsForKeyAt(u) - 1; p >= 0; --p) { final String pkgName = mTemporaryVips.keyAt(u, p); final Long expiration = mTemporaryVips.valueAt(u, p); if (expiration == null || expiration < nowElapsed) { mTemporaryVips.delete(userId, pkgName); } else { earliestExpiration = Math.min(earliestExpiration, expiration); } } } if (earliestExpiration < Long.MAX_VALUE) { sendEmptyMessageDelayed(MSG_CLEAN_UP_TEMP_VIP_LIST, earliestExpiration - nowElapsed); } } } break; case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: { case MSG_NOTIFY_AFFORDABILITY_CHANGE_LISTENER: { final SomeArgs args = (SomeArgs) msg.obj; final SomeArgs args = (SomeArgs) msg.obj; final int userId = args.argi1; final int userId = args.argi1; Loading Loading @@ -1558,6 +1687,7 @@ public class InternalResourceService extends SystemService { boolean printedVips = false; boolean printedVips = false; pw.println(); pw.println(); pw.print("VIPs:"); pw.print("VIPs:"); pw.increaseIndent(); for (int u = 0; u < mVipOverrides.numMaps(); ++u) { for (int u = 0; u < mVipOverrides.numMaps(); ++u) { final int userId = mVipOverrides.keyAt(u); final int userId = mVipOverrides.keyAt(u); Loading @@ -1576,6 +1706,32 @@ public class InternalResourceService extends SystemService { } else { } else { pw.print(" None"); pw.print(" None"); } } pw.decreaseIndent(); pw.println(); boolean printedTempVips = false; pw.println(); pw.print("Temp VIPs:"); pw.increaseIndent(); for (int u = 0; u < mTemporaryVips.numMaps(); ++u) { final int userId = mTemporaryVips.keyAt(u); for (int p = 0; p < mTemporaryVips.numElementsForKeyAt(u); ++p) { final String pkgName = mTemporaryVips.keyAt(u, p); printedTempVips = true; pw.println(); pw.print(appToString(userId, pkgName)); pw.print("="); pw.print(mTemporaryVips.valueAt(u, p)); } } if (printedTempVips) { pw.println(); } else { pw.print(" None"); } pw.decreaseIndent(); pw.println(); pw.println(); pw.println(); pw.println(); Loading
apex/jobscheduler/service/java/com/android/server/tare/JobSchedulerEconomicPolicy.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -117,6 +117,7 @@ import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.TareUtils.appToString; import static com.android.server.tare.TareUtils.cakeToString; import static com.android.server.tare.TareUtils.cakeToString; import android.annotation.NonNull; import android.annotation.NonNull; Loading Loading @@ -210,6 +211,22 @@ public class JobSchedulerEconomicPolicy extends EconomicPolicy { if (mIrs.isPackageRestricted(userId, pkgName)) { if (mIrs.isPackageRestricted(userId, pkgName)) { return 0; return 0; } } final InstalledPackageInfo ipo = mIrs.getInstalledPackageInfo(userId, pkgName); if (ipo == null) { Slog.wtfStack(TAG, "Tried to get max balance of invalid app: " + appToString(userId, pkgName)); } else { // A system installer's max balance is elevated for some time after first boot so // they can use jobs to download and install apps. if (ipo.isSystemInstaller) { final long timeSinceFirstSetupMs = mIrs.getRealtimeSinceFirstSetupMs(); final boolean stillExempted = timeSinceFirstSetupMs < InternalResourceService.INSTALLER_FIRST_SETUP_GRACE_PERIOD_MS; if (stillExempted) { return mMaxSatiatedConsumptionLimit; } } } return mMaxSatiatedBalance; return mMaxSatiatedBalance; } } Loading
apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +56 −2 File changed.Preview size limit exceeded, changes collapsed. Show changes