summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2022-08-25 16:57:44 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-08-25 16:57:44 +0000
commit19e9cae3fe86460eaac0bcc60da6dbd2b50d2ccf (patch)
tree0c0e0dad8ff94acd7456d440c41bf82c110c03e0
parentcd80ee168f411333d0dbe8f0ad6529f452350aab (diff)
parentfccaf824d2c4b12a45d12c80dc6255108e80780e (diff)
Merge "Change the package cache to a SparseArrayMap."
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/Agent.java37
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java44
-rw-r--r--apex/jobscheduler/service/java/com/android/server/tare/Scribe.java24
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java5
4 files changed, 57 insertions, 53 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
index f6219c5e10ab..4fe021a35f98 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
@@ -721,25 +721,28 @@ 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);
- 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);
- final double perc = batteryLevel / 100d;
- // TODO: maybe don't give credits to bankrupt apps until battery level >= 50%
- final long shortfall = minBalance - ledger.getCurrentBalance();
- if (shortfall > 0) {
- recordTransactionLocked(userId, pkgName, ledger,
- new Ledger.Transaction(now, now, REGULATION_BASIC_INCOME,
- null, (long) (perc * shortfall), 0), true);
+ 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 String pkgName = pkgInfo.packageName;
+ final Ledger ledger = mScribe.getLedgerLocked(userId, pkgName);
+ final long minBalance = mIrs.getMinBalanceLocked(userId, pkgName);
+ final double perc = batteryLevel / 100d;
+ // TODO: maybe don't give credits to bankrupt apps until battery level >= 50%
+ final long shortfall = minBalance - ledger.getCurrentBalance();
+ if (shortfall > 0) {
+ recordTransactionLocked(userId, pkgName, ledger,
+ new Ledger.Transaction(now, now, REGULATION_BASIC_INCOME,
+ null, (long) (perc * shortfall), 0), true);
+ }
}
}
}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
index 2b8272208c3e..448a808ff52f 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java
@@ -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")
@@ -343,7 +343,7 @@ public class InternalResourceService extends SystemService {
}
@NonNull
- List<InstalledPackageInfo> getInstalledPackages() {
+ SparseArrayMap<String, InstalledPackageInfo> getInstalledPackages() {
synchronized (mLock) {
return mPkgCache;
}
@@ -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;
@@ -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);
@@ -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);
}
}
@@ -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);
}
@@ -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);
}
}
@@ -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);
}
}
}
@@ -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,
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
index 2cae83f4aad5..29478d05e066 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/Scribe.java
@@ -216,17 +216,21 @@ 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);
- 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<>();
- installedPackagesPerUser.put(userId, pkgsForUser);
+ 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) {
+ ArraySet<String> pkgsForUser = installedPackagesPerUser.get(userId);
+ if (pkgsForUser == null) {
+ pkgsForUser = new ArraySet<>();
+ installedPackagesPerUser.put(userId, pkgsForUser);
+ }
+ pkgsForUser.add(packageInfo.packageName);
}
- pkgsForUser.add(packageInfo.packageName);
}
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
index d90d8b8bfac0..5cf026e64f67 100644
--- a/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/tare/ScribeTest.java
@@ -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
@@ -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));
}
}