Loading apex/jobscheduler/service/java/com/android/server/tare/Agent.java +20 −17 Original line number Diff line number Diff line Loading @@ -721,15 +721,17 @@ class Agent { @GuardedBy("mLock") void distributeBasicIncomeLocked(int batteryLevel) { final List<InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(); final SparseArrayMap<String, InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(); final long now = getCurrentTimeMillis(); for (int i = 0; i < pkgs.size(); ++i) { final InstalledPackageInfo pkgInfo = pkgs.get(i); for (int uIdx = pkgs.numMaps() - 1; uIdx >= 0; --uIdx) { final int userId = pkgs.keyAt(uIdx); for (int pIdx = pkgs.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo pkgInfo = pkgs.valueAt(uIdx, pIdx); if (!shouldGiveCredits(pkgInfo)) { continue; } final int userId = UserHandle.getUserId(pkgInfo.uid); final String pkgName = pkgInfo.packageName; final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName); Loading @@ -743,6 +745,7 @@ class Agent { } } } } /** Give each app an initial balance. */ @GuardedBy("mLock") Loading apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +20 −24 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ public class InternalResourceService extends SystemService { @NonNull @GuardedBy("mLock") private final List<InstalledPackageInfo> mPkgCache = new ArrayList<>(); private final SparseArrayMap<String, InstalledPackageInfo> mPkgCache = new SparseArrayMap<>(); /** Cached mapping of UIDs (for all users) to a list of packages in the UID. */ @GuardedBy("mLock") Loading Loading @@ -343,7 +343,7 @@ public class InternalResourceService extends SystemService { } @NonNull List<InstalledPackageInfo> getInstalledPackages() { SparseArrayMap<String, InstalledPackageInfo> getInstalledPackages() { synchronized (mLock) { return mPkgCache; } Loading @@ -354,11 +354,13 @@ public class InternalResourceService extends SystemService { List<InstalledPackageInfo> getInstalledPackages(final int userId) { final List<InstalledPackageInfo> userPkgs = new ArrayList<>(); synchronized (mLock) { for (int i = 0; i < mPkgCache.size(); ++i) { final InstalledPackageInfo packageInfo = mPkgCache.get(i); if (UserHandle.getUserId(packageInfo.uid) == userId) { userPkgs.add(packageInfo); final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx < 0) { return userPkgs; } for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) { final InstalledPackageInfo packageInfo = mPkgCache.valueAt(uIdx, p); userPkgs.add(packageInfo); } } return userPkgs; Loading Loading @@ -511,7 +513,7 @@ public class InternalResourceService extends SystemService { mPackageToUidCache.add(userId, pkgName, uid); } synchronized (mLock) { mPkgCache.add(new InstalledPackageInfo(packageInfo)); mPkgCache.add(userId, pkgName, new InstalledPackageInfo(packageInfo)); mUidToPackageCache.add(uid, pkgName); // TODO: only do this when the user first launches the app (app leaves stopped state) mAgent.grantBirthrightLocked(userId, pkgName); Loading @@ -532,14 +534,7 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { mUidToPackageCache.remove(uid, pkgName); mVipOverrides.delete(userId, pkgName); for (int i = 0; i < mPkgCache.size(); ++i) { final InstalledPackageInfo pkgInfo = mPkgCache.get(i); if (UserHandle.getUserId(pkgInfo.uid) == userId && pkgName.equals(pkgInfo.packageName)) { mPkgCache.remove(i); break; } } mPkgCache.delete(userId, pkgName); mAgent.onPackageRemovedLocked(userId, pkgName); } } Loading @@ -560,7 +555,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { mPkgCache.add(new InstalledPackageInfo(pkgs.get(i))); final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); mPkgCache.add(userId, ipo.packageName, ipo); } mAgent.grantBirthrightsLocked(userId); } Loading @@ -570,15 +566,15 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { mVipOverrides.delete(userId); ArrayList<String> removedPkgs = new ArrayList<>(); for (int i = mPkgCache.size() - 1; i >= 0; --i) { final InstalledPackageInfo pkgInfo = mPkgCache.get(i); if (UserHandle.getUserId(pkgInfo.uid) == userId) { final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx >= 0) { for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) { final InstalledPackageInfo pkgInfo = mPkgCache.valueAt(uIdx, p); removedPkgs.add(pkgInfo.packageName); mUidToPackageCache.remove(pkgInfo.uid); mPkgCache.remove(i); break; } } mPkgCache.delete(userId); mAgent.onUserRemovedLocked(userId, removedPkgs); } } Loading Loading @@ -727,7 +723,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { mPkgCache.add(new InstalledPackageInfo(pkgs.get(i))); final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); mPkgCache.add(userId, ipo.packageName, ipo); } } } Loading Loading @@ -1185,7 +1182,6 @@ public class InternalResourceService extends SystemService { // User setting should override DeviceConfig setting. // NOTE: There's currently no way for a user to reset the value (via UI), so if a user // manually toggles TARE via UI, we'll always defer to the user's current setting // TODO: add a "reset" value if the user toggle is an issue final boolean isTareEnabledDC = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TARE, KEY_DC_ENABLE_TARE, Settings.Global.DEFAULT_ENABLE_TARE == 1); final boolean isTareEnabled = Settings.Global.getInt(mContentResolver, Loading apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +14 −10 Original line number Diff line number Diff line Loading @@ -216,11 +216,14 @@ public class Scribe { mRemainingConsumableCakes = 0; final SparseArray<ArraySet<String>> installedPackagesPerUser = new SparseArray<>(); final List<InstalledPackageInfo> installedPackages = mIrs.getInstalledPackages(); for (int i = 0; i < installedPackages.size(); ++i) { final InstalledPackageInfo packageInfo = installedPackages.get(i); final SparseArrayMap<String, InstalledPackageInfo> installedPackages = mIrs.getInstalledPackages(); for (int uIdx = installedPackages.numMaps() - 1; uIdx >= 0; --uIdx) { final int userId = installedPackages.keyAt(uIdx); for (int pIdx = installedPackages.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo packageInfo = installedPackages.valueAt(uIdx, pIdx); if (packageInfo.uid != InstalledPackageInfo.NO_UID) { final int userId = UserHandle.getUserId(packageInfo.uid); ArraySet<String> pkgsForUser = installedPackagesPerUser.get(userId); if (pkgsForUser == null) { pkgsForUser = new ArraySet<>(); Loading @@ -229,6 +232,7 @@ public class Scribe { pkgsForUser.add(packageInfo.packageName); } } } final List<Analyst.Report> reports = new ArrayList<>(); try (FileInputStream fis = mStateFile.openRead()) { Loading services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public class ScribeTest { private MockitoSession mMockingSession; private Scribe mScribeUnderTest; private File mTestFileDir; private final List<InstalledPackageInfo> mInstalledPackages = new ArrayList<>(); private final SparseArrayMap<String, InstalledPackageInfo> mInstalledPackages = new SparseArrayMap<>(); private final List<Analyst.Report> mReports = new ArrayList<>(); @Mock Loading Loading @@ -455,6 +456,6 @@ public class ScribeTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = UserHandle.getUid(userId, Math.abs(pkgName.hashCode())); pkgInfo.applicationInfo = applicationInfo; mInstalledPackages.add(new InstalledPackageInfo(pkgInfo)); mInstalledPackages.add(userId, pkgName, new InstalledPackageInfo(pkgInfo)); } } Loading
apex/jobscheduler/service/java/com/android/server/tare/Agent.java +20 −17 Original line number Diff line number Diff line Loading @@ -721,15 +721,17 @@ class Agent { @GuardedBy("mLock") void distributeBasicIncomeLocked(int batteryLevel) { final List<InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(); final SparseArrayMap<String, InstalledPackageInfo> pkgs = mIrs.getInstalledPackages(); final long now = getCurrentTimeMillis(); for (int i = 0; i < pkgs.size(); ++i) { final InstalledPackageInfo pkgInfo = pkgs.get(i); for (int uIdx = pkgs.numMaps() - 1; uIdx >= 0; --uIdx) { final int userId = pkgs.keyAt(uIdx); for (int pIdx = pkgs.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo pkgInfo = pkgs.valueAt(uIdx, pIdx); if (!shouldGiveCredits(pkgInfo)) { continue; } final int userId = UserHandle.getUserId(pkgInfo.uid); final String pkgName = pkgInfo.packageName; final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName); final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName); Loading @@ -743,6 +745,7 @@ class Agent { } } } } /** Give each app an initial balance. */ @GuardedBy("mLock") Loading
apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +20 −24 Original line number Diff line number Diff line Loading @@ -136,7 +136,7 @@ public class InternalResourceService extends SystemService { @NonNull @GuardedBy("mLock") private final List<InstalledPackageInfo> mPkgCache = new ArrayList<>(); private final SparseArrayMap<String, InstalledPackageInfo> mPkgCache = new SparseArrayMap<>(); /** Cached mapping of UIDs (for all users) to a list of packages in the UID. */ @GuardedBy("mLock") Loading Loading @@ -343,7 +343,7 @@ public class InternalResourceService extends SystemService { } @NonNull List<InstalledPackageInfo> getInstalledPackages() { SparseArrayMap<String, InstalledPackageInfo> getInstalledPackages() { synchronized (mLock) { return mPkgCache; } Loading @@ -354,11 +354,13 @@ public class InternalResourceService extends SystemService { List<InstalledPackageInfo> getInstalledPackages(final int userId) { final List<InstalledPackageInfo> userPkgs = new ArrayList<>(); synchronized (mLock) { for (int i = 0; i < mPkgCache.size(); ++i) { final InstalledPackageInfo packageInfo = mPkgCache.get(i); if (UserHandle.getUserId(packageInfo.uid) == userId) { userPkgs.add(packageInfo); final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx < 0) { return userPkgs; } for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) { final InstalledPackageInfo packageInfo = mPkgCache.valueAt(uIdx, p); userPkgs.add(packageInfo); } } return userPkgs; Loading Loading @@ -511,7 +513,7 @@ public class InternalResourceService extends SystemService { mPackageToUidCache.add(userId, pkgName, uid); } synchronized (mLock) { mPkgCache.add(new InstalledPackageInfo(packageInfo)); mPkgCache.add(userId, pkgName, new InstalledPackageInfo(packageInfo)); mUidToPackageCache.add(uid, pkgName); // TODO: only do this when the user first launches the app (app leaves stopped state) mAgent.grantBirthrightLocked(userId, pkgName); Loading @@ -532,14 +534,7 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { mUidToPackageCache.remove(uid, pkgName); mVipOverrides.delete(userId, pkgName); for (int i = 0; i < mPkgCache.size(); ++i) { final InstalledPackageInfo pkgInfo = mPkgCache.get(i); if (UserHandle.getUserId(pkgInfo.uid) == userId && pkgName.equals(pkgInfo.packageName)) { mPkgCache.remove(i); break; } } mPkgCache.delete(userId, pkgName); mAgent.onPackageRemovedLocked(userId, pkgName); } } Loading @@ -560,7 +555,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { mPkgCache.add(new InstalledPackageInfo(pkgs.get(i))); final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); mPkgCache.add(userId, ipo.packageName, ipo); } mAgent.grantBirthrightsLocked(userId); } Loading @@ -570,15 +566,15 @@ public class InternalResourceService extends SystemService { synchronized (mLock) { mVipOverrides.delete(userId); ArrayList<String> removedPkgs = new ArrayList<>(); for (int i = mPkgCache.size() - 1; i >= 0; --i) { final InstalledPackageInfo pkgInfo = mPkgCache.get(i); if (UserHandle.getUserId(pkgInfo.uid) == userId) { final int uIdx = mPkgCache.indexOfKey(userId); if (uIdx >= 0) { for (int p = mPkgCache.numElementsForKeyAt(uIdx) - 1; p >= 0; --p) { final InstalledPackageInfo pkgInfo = mPkgCache.valueAt(uIdx, p); removedPkgs.add(pkgInfo.packageName); mUidToPackageCache.remove(pkgInfo.uid); mPkgCache.remove(i); break; } } mPkgCache.delete(userId); mAgent.onUserRemovedLocked(userId, removedPkgs); } } Loading Loading @@ -727,7 +723,8 @@ public class InternalResourceService extends SystemService { final List<PackageInfo> pkgs = mPackageManager.getInstalledPackagesAsUser(PACKAGE_QUERY_FLAGS, userId); for (int i = pkgs.size() - 1; i >= 0; --i) { mPkgCache.add(new InstalledPackageInfo(pkgs.get(i))); final InstalledPackageInfo ipo = new InstalledPackageInfo(pkgs.get(i)); mPkgCache.add(userId, ipo.packageName, ipo); } } } Loading Loading @@ -1185,7 +1182,6 @@ public class InternalResourceService extends SystemService { // User setting should override DeviceConfig setting. // NOTE: There's currently no way for a user to reset the value (via UI), so if a user // manually toggles TARE via UI, we'll always defer to the user's current setting // TODO: add a "reset" value if the user toggle is an issue final boolean isTareEnabledDC = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TARE, KEY_DC_ENABLE_TARE, Settings.Global.DEFAULT_ENABLE_TARE == 1); final boolean isTareEnabled = Settings.Global.getInt(mContentResolver, Loading
apex/jobscheduler/service/java/com/android/server/tare/Scribe.java +14 −10 Original line number Diff line number Diff line Loading @@ -216,11 +216,14 @@ public class Scribe { mRemainingConsumableCakes = 0; final SparseArray<ArraySet<String>> installedPackagesPerUser = new SparseArray<>(); final List<InstalledPackageInfo> installedPackages = mIrs.getInstalledPackages(); for (int i = 0; i < installedPackages.size(); ++i) { final InstalledPackageInfo packageInfo = installedPackages.get(i); final SparseArrayMap<String, InstalledPackageInfo> installedPackages = mIrs.getInstalledPackages(); for (int uIdx = installedPackages.numMaps() - 1; uIdx >= 0; --uIdx) { final int userId = installedPackages.keyAt(uIdx); for (int pIdx = installedPackages.numElementsForKeyAt(uIdx) - 1; pIdx >= 0; --pIdx) { final InstalledPackageInfo packageInfo = installedPackages.valueAt(uIdx, pIdx); if (packageInfo.uid != InstalledPackageInfo.NO_UID) { final int userId = UserHandle.getUserId(packageInfo.uid); ArraySet<String> pkgsForUser = installedPackagesPerUser.get(userId); if (pkgsForUser == null) { pkgsForUser = new ArraySet<>(); Loading @@ -229,6 +232,7 @@ public class Scribe { pkgsForUser.add(packageInfo.packageName); } } } final List<Analyst.Report> reports = new ArrayList<>(); try (FileInputStream fis = mStateFile.openRead()) { Loading
services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java +3 −2 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public class ScribeTest { private MockitoSession mMockingSession; private Scribe mScribeUnderTest; private File mTestFileDir; private final List<InstalledPackageInfo> mInstalledPackages = new ArrayList<>(); private final SparseArrayMap<String, InstalledPackageInfo> mInstalledPackages = new SparseArrayMap<>(); private final List<Analyst.Report> mReports = new ArrayList<>(); @Mock Loading Loading @@ -455,6 +456,6 @@ public class ScribeTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = UserHandle.getUid(userId, Math.abs(pkgName.hashCode())); pkgInfo.applicationInfo = applicationInfo; mInstalledPackages.add(new InstalledPackageInfo(pkgInfo)); mInstalledPackages.add(userId, pkgName, new InstalledPackageInfo(pkgInfo)); } }