diff options
| author | 2022-08-25 16:57:44 +0000 | |
|---|---|---|
| committer | 2022-08-25 16:57:44 +0000 | |
| commit | 19e9cae3fe86460eaac0bcc60da6dbd2b50d2ccf (patch) | |
| tree | 0c0e0dad8ff94acd7456d440c41bf82c110c03e0 | |
| parent | cd80ee168f411333d0dbe8f0ad6529f452350aab (diff) | |
| parent | fccaf824d2c4b12a45d12c80dc6255108e80780e (diff) | |
Merge "Change the package cache to a SparseArrayMap."
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)); } } |