Loading AconfigFlags.bp +23 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,7 @@ java_aconfig_library { // DeviceStateManager aconfig_declarations { name: "android.hardware.devicestate.feature.flags-aconfig", exportable: true, package: "android.hardware.devicestate.feature.flags", srcs: ["core/java/android/hardware/devicestate/feature/*.aconfig"], } Loading @@ -184,6 +185,7 @@ java_aconfig_library { // Input aconfig_declarations { name: "com.android.hardware.input.input-aconfig", exportable: true, package: "com.android.hardware.input", srcs: ["core/java/android/hardware/input/*.aconfig"], } Loading Loading @@ -456,6 +458,7 @@ cc_aconfig_library { // Hardware aconfig_declarations { name: "android.hardware.flags-aconfig", exportable: true, package: "android.hardware.flags", srcs: ["core/java/android/hardware/flags/*.aconfig"], } Loading Loading @@ -548,6 +551,7 @@ java_aconfig_library { // Media Editing aconfig_declarations { name: "com.android.media.flags.editing-aconfig", exportable: true, package: "com.android.media.editing.flags", srcs: [ "media/java/android/media/flags/editing.aconfig", Loading Loading @@ -593,6 +597,7 @@ java_aconfig_library { // Media TV aconfig_declarations { name: "android.media.tv.flags-aconfig", exportable: true, package: "android.media.tv.flags", srcs: ["media/java/android/media/tv/flags/media_tv.aconfig"], } Loading @@ -606,6 +611,7 @@ java_aconfig_library { // OnDeviceIntelligence aconfig_declarations { name: "android.app.ondeviceintelligence-aconfig", exportable: true, package: "android.app.ondeviceintelligence.flags", srcs: ["core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig"], } Loading Loading @@ -657,6 +663,7 @@ cc_aconfig_library { // Biometrics aconfig_declarations { name: "android.hardware.biometrics.flags-aconfig", exportable: true, package: "android.hardware.biometrics", srcs: ["core/java/android/hardware/biometrics/flags.aconfig"], } Loading Loading @@ -734,6 +741,7 @@ java_aconfig_library { // Broadcast Radio aconfig_declarations { name: "android.hardware.radio.flags-aconfig", exportable: true, package: "android.hardware.radio", srcs: ["core/java/android/hardware/radio/*.aconfig"], } Loading Loading @@ -768,6 +776,7 @@ java_aconfig_library { // Content Protection aconfig_declarations { name: "android.view.contentprotection.flags-aconfig", exportable: true, package: "android.view.contentprotection.flags", srcs: ["core/java/android/view/contentprotection/flags/*.aconfig"], } Loading @@ -794,6 +803,7 @@ java_aconfig_library { // App prediction aconfig_declarations { name: "android.service.appprediction.flags-aconfig", exportable: true, package: "android.service.appprediction.flags", srcs: ["core/java/android/service/appprediction/flags/*.aconfig"], } Loading @@ -807,6 +817,7 @@ java_aconfig_library { // Controls aconfig_declarations { name: "android.service.controls.flags-aconfig", exportable: true, package: "android.service.controls.flags", srcs: ["core/java/android/service/controls/flags/*.aconfig"], } Loading @@ -820,6 +831,7 @@ java_aconfig_library { // Voice aconfig_declarations { name: "android.service.voice.flags-aconfig", exportable: true, package: "android.service.voice.flags", srcs: ["core/java/android/service/voice/flags/*.aconfig"], } Loading Loading @@ -849,6 +861,7 @@ java_aconfig_library { // Companion aconfig_declarations { name: "android.companion.flags-aconfig", exportable: true, package: "android.companion", srcs: ["core/java/android/companion/*.aconfig"], } Loading @@ -862,6 +875,7 @@ java_aconfig_library { // Networking aconfig_declarations { name: "android.net.platform.flags-aconfig", exportable: true, package: "android.net.platform.flags", srcs: ["core/java/android/net/flags.aconfig"], visibility: [":__subpackages__"], Loading @@ -870,6 +884,7 @@ aconfig_declarations { // Thread network aconfig_declarations { name: "com.android.net.thread.platform.flags-aconfig", exportable: true, package: "com.android.net.thread.platform.flags", srcs: ["core/java/android/net/thread/flags.aconfig"], } Loading Loading @@ -967,6 +982,7 @@ java_aconfig_library { aconfig_declarations { name: "framework-jobscheduler-job.flags-aconfig", package: "android.app.job", exportable: true, srcs: ["apex/jobscheduler/framework/aconfig/job.aconfig"], } Loading Loading @@ -1032,6 +1048,7 @@ java_aconfig_library { // Smartspace aconfig_declarations { name: "android.app.smartspace.flags-aconfig", exportable: true, package: "android.app.smartspace.flags", srcs: ["core/java/android/app/smartspace/flags.aconfig"], } Loading Loading @@ -1065,6 +1082,7 @@ java_aconfig_library { // USB aconfig_declarations { name: "android.hardware.usb.flags-aconfig", exportable: true, package: "android.hardware.usb.flags", srcs: ["core/java/android/hardware/usb/flags/*.aconfig"], } Loading Loading @@ -1145,6 +1163,7 @@ java_aconfig_library { // Provider aconfig_declarations { name: "android.provider.flags-aconfig", exportable: true, package: "android.provider", srcs: ["core/java/android/provider/*.aconfig"], } Loading @@ -1165,6 +1184,7 @@ java_aconfig_library { // Speech aconfig_declarations { name: "android.speech.flags-aconfig", exportable: true, package: "android.speech.flags", srcs: ["core/java/android/speech/flags/*.aconfig"], } Loading @@ -1185,6 +1205,7 @@ java_aconfig_library { // Content aconfig_declarations { name: "android.content.flags-aconfig", exportable: true, package: "android.content.flags", srcs: ["core/java/android/content/flags/flags.aconfig"], } Loading @@ -1211,6 +1232,7 @@ java_aconfig_library { // CrashRecovery Module aconfig_declarations { name: "android.crashrecovery.flags-aconfig", exportable: true, package: "android.crashrecovery.flags", srcs: ["packages/CrashRecovery/aconfig/flags.aconfig"], } Loading Loading @@ -1249,6 +1271,7 @@ java_aconfig_library { // Wearable Sensing aconfig_declarations { name: "android.app.wearable.flags-aconfig", exportable: true, package: "android.app.wearable", srcs: ["core/java/android/app/wearable/*.aconfig"], } Loading apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java +0 −11 Original line number Diff line number Diff line Loading @@ -1737,17 +1737,6 @@ class JobConcurrencyManager { continue; } if (!nextPending.isReady()) { // This could happen when the job count reached its quota, the constrains // for the job has been updated but hasn't been removed from the pending // queue yet. if (DEBUG) { Slog.w(TAG, "Pending+not ready job: " + nextPending); } pendingJobQueue.remove(nextPending); continue; } if (DEBUG && isSimilarJobRunningLocked(nextPending)) { Slog.w(TAG, "Already running similar job to: " + nextPending); } Loading apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +25 −66 Original line number Diff line number Diff line Loading @@ -512,7 +512,7 @@ public final class QuotaController extends StateController { /** An app has reached its quota. The message should contain a {@link UserPackage} object. */ @VisibleForTesting static final int MSG_REACHED_TIME_QUOTA = 0; static final int MSG_REACHED_QUOTA = 0; /** Drop any old timing sessions. */ private static final int MSG_CLEAN_UP_SESSIONS = 1; /** Check if a package is now within its quota. */ Loading @@ -524,7 +524,7 @@ public final class QuotaController extends StateController { * object. */ @VisibleForTesting static final int MSG_REACHED_EJ_TIME_QUOTA = 4; static final int MSG_REACHED_EJ_QUOTA = 4; /** * Process a new {@link UsageEvents.Event}. The event will be the message's object and the * userId will the first arg. Loading @@ -533,11 +533,6 @@ public final class QuotaController extends StateController { /** A UID's free quota grace period has ended. */ @VisibleForTesting static final int MSG_END_GRACE_PERIOD = 6; /** * An app has reached its job count quota. The message should contain a {@link UserPackage} * object. */ static final int MSG_REACHED_COUNT_QUOTA = 7; public QuotaController(@NonNull JobSchedulerService service, @NonNull BackgroundJobsController backgroundJobsController, Loading Loading @@ -879,37 +874,17 @@ public final class QuotaController extends StateController { } @VisibleForTesting @GuardedBy("mLock") boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) { final int standbyBucket = jobStatus.getEffectiveStandbyBucket(); // A job is within quota if one of the following is true: // 1. it was started while the app was in the TOP state // 2. the app is currently in the foreground // 3. the app overall is within its quota if (jobStatus.shouldTreatAsUserInitiatedJob() return jobStatus.shouldTreatAsUserInitiatedJob() || isTopStartedJobLocked(jobStatus) || isUidInForeground(jobStatus.getSourceUid())) { return true; } if (standbyBucket == NEVER_INDEX) return false; if (isQuotaFreeLocked(standbyBucket)) return true; final ExecutionStats stats = getExecutionStatsLocked(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket); if (!(getRemainingExecutionTimeLocked(stats) > 0)) { // Out of execution time quota. return false; } if (mService.isCurrentlyRunningLocked(jobStatus)) { // if job is running, considered as in quota so it can keep running. return true; } // Check if the app is within job count quota. return isUnderJobCountQuotaLocked(stats) && isUnderSessionCountQuotaLocked(stats); || isUidInForeground(jobStatus.getSourceUid()) || isWithinQuotaLocked( jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket); } @GuardedBy("mLock") Loading @@ -934,11 +909,12 @@ public final class QuotaController extends StateController { ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket); // TODO: use a higher minimum remaining time for jobs with MINIMUM priority return getRemainingExecutionTimeLocked(stats) > 0 && isUnderJobCountQuotaLocked(stats) && isUnderSessionCountQuotaLocked(stats); && isUnderJobCountQuotaLocked(stats, standbyBucket) && isUnderSessionCountQuotaLocked(stats, standbyBucket); } private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats) { private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats, final int standbyBucket) { final long now = sElapsedRealtimeClock.millis(); final boolean isUnderAllowedTimeQuota = (stats.jobRateLimitExpirationTimeElapsed <= now Loading @@ -947,7 +923,8 @@ public final class QuotaController extends StateController { && stats.bgJobCountInWindow < stats.jobCountLimit; } private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats) { private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats, final int standbyBucket) { final long now = sElapsedRealtimeClock.millis(); final boolean isUnderAllowedTimeQuota = (stats.sessionRateLimitExpirationTimeElapsed <= now || stats.sessionCountInRateLimitingWindow < mMaxSessionCountPerRateLimitingWindow); Loading Loading @@ -1472,7 +1449,6 @@ public final class QuotaController extends StateController { stats.jobCountInRateLimitingWindow = 0; } stats.jobCountInRateLimitingWindow += count; stats.bgJobCountInWindow += count; } } Loading Loading @@ -1707,11 +1683,10 @@ public final class QuotaController extends StateController { changedJobs.add(js); } } else if (realStandbyBucket != EXEMPTED_INDEX && realStandbyBucket != ACTIVE_INDEX && realStandbyBucket == js.getEffectiveStandbyBucket() && !mService.isCurrentlyRunningLocked(js)) { && realStandbyBucket == js.getEffectiveStandbyBucket()) { // An app in the ACTIVE bucket may be out of quota while the job could be in quota // for some reason. Therefore, avoid setting the real value here and check each job // individually. Running job need to determine its own quota status as well. // individually. if (setConstraintSatisfied(js, nowElapsed, realInQuota, isWithinEJQuota)) { changedJobs.add(js); } Loading Loading @@ -1830,8 +1805,9 @@ public final class QuotaController extends StateController { } ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket); final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats); final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats); final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats, standbyBucket); final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats, standbyBucket); final long remainingEJQuota = getRemainingEJExecutionTimeLocked(userId, packageName); final boolean inRegularQuota = Loading Loading @@ -2150,11 +2126,6 @@ public final class QuotaController extends StateController { mBgJobCount++; if (mRegularJobTimer) { incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1); final ExecutionStats stats = getExecutionStatsLocked(mPkg.userId, mPkg.packageName, jobStatus.getEffectiveStandbyBucket(), false); if (stats.bgJobCountInWindow >= stats.jobCountLimit) { mHandler.obtainMessage(MSG_REACHED_COUNT_QUOTA, mPkg).sendToTarget(); } } if (mRunningBgJobs.size() == 1) { // Started tracking the first job. Loading Loading @@ -2286,6 +2257,7 @@ public final class QuotaController extends StateController { // repeatedly plugged in and unplugged, or an app changes foreground state // very frequently, the job count for a package may be artificially high. mBgJobCount = mRunningBgJobs.size(); if (mRegularJobTimer) { incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount); // Starting the timer means that all cached execution stats are now Loading @@ -2312,8 +2284,7 @@ public final class QuotaController extends StateController { return; } Message msg = mHandler.obtainMessage( mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA, mPkg); mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg); final long timeRemainingMs = mRegularJobTimer ? getTimeUntilQuotaConsumedLocked(mPkg.userId, mPkg.packageName) : getTimeUntilEJQuotaConsumedLocked(mPkg.userId, mPkg.packageName); Loading @@ -2330,7 +2301,7 @@ public final class QuotaController extends StateController { private void cancelCutoff() { mHandler.removeMessages( mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA, mPkg); mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg); } public void dump(IndentingPrintWriter pw, Predicate<JobStatus> predicate) { Loading Loading @@ -2586,7 +2557,7 @@ public final class QuotaController extends StateController { break; default: if (DEBUG) { Slog.d(TAG, "Dropping usage event " + event.getEventType()); Slog.d(TAG, "Dropping event " + event.getEventType()); } break; } Loading Loading @@ -2695,7 +2666,7 @@ public final class QuotaController extends StateController { public void handleMessage(Message msg) { synchronized (mLock) { switch (msg.what) { case MSG_REACHED_TIME_QUOTA: { case MSG_REACHED_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, "Checking if " + pkg + " has reached its quota."); Loading @@ -2714,7 +2685,7 @@ public final class QuotaController extends StateController { // This could potentially happen if an old session phases out while a // job is currently running. // Reschedule message Message rescheduleMsg = obtainMessage(MSG_REACHED_TIME_QUOTA, pkg); Message rescheduleMsg = obtainMessage(MSG_REACHED_QUOTA, pkg); timeRemainingMs = getTimeUntilQuotaConsumedLocked(pkg.userId, pkg.packageName); if (DEBUG) { Loading @@ -2724,7 +2695,7 @@ public final class QuotaController extends StateController { } break; } case MSG_REACHED_EJ_TIME_QUOTA: { case MSG_REACHED_EJ_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, "Checking if " + pkg + " has reached its EJ quota."); Loading @@ -2742,7 +2713,7 @@ public final class QuotaController extends StateController { // This could potentially happen if an old session phases out while a // job is currently running. // Reschedule message Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_TIME_QUOTA, pkg); Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_QUOTA, pkg); timeRemainingMs = getTimeUntilEJQuotaConsumedLocked( pkg.userId, pkg.packageName); if (DEBUG) { Loading @@ -2752,18 +2723,6 @@ public final class QuotaController extends StateController { } break; } case MSG_REACHED_COUNT_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, pkg + " has reached its count quota."); } mStateChangedListener.onControllerStateChanged( maybeUpdateConstraintForPkgLocked( sElapsedRealtimeClock.millis(), pkg.userId, pkg.packageName)); break; } case MSG_CLEAN_UP_SESSIONS: if (DEBUG) { Slog.d(TAG, "Cleaning up timing sessions."); Loading api/coverage/tools/Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -30,3 +30,24 @@ java_library_host { type: "full", }, } java_test_host { name: "extract-flagged-apis-test", srcs: ["ExtractFlaggedApisTest.kt"], libs: [ "extract_flagged_apis_proto", "junit", "libprotobuf-java-full", ], static_libs: [ "truth", "truth-liteproto-extension", "truth-proto-extension", ], data: [ ":extract-flagged-apis", ], test_options: { unit_test: true, }, } api/coverage/tools/ExtractFlaggedApis.kt +5 −6 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ fun main(args: Array<String>) { val builder = FlagApiMap.newBuilder() for (pkg in cb.getPackages().packages) { val packageName = pkg.qualifiedName() pkg.allClasses() .filter { it.methods().size > 0 } .forEach { pkg.allClasses().forEach { extractFlaggedApisFromClass(it, it.methods(), packageName, builder) extractFlaggedApisFromClass(it, it.constructors(), packageName, builder) } Loading @@ -45,6 +43,7 @@ fun extractFlaggedApisFromClass( packageName: String, builder: FlagApiMap.Builder ) { if (methods.isEmpty()) return val classFlag = classItem.modifiers .findAnnotation("android.annotation.FlaggedApi") Loading Loading
AconfigFlags.bp +23 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,7 @@ java_aconfig_library { // DeviceStateManager aconfig_declarations { name: "android.hardware.devicestate.feature.flags-aconfig", exportable: true, package: "android.hardware.devicestate.feature.flags", srcs: ["core/java/android/hardware/devicestate/feature/*.aconfig"], } Loading @@ -184,6 +185,7 @@ java_aconfig_library { // Input aconfig_declarations { name: "com.android.hardware.input.input-aconfig", exportable: true, package: "com.android.hardware.input", srcs: ["core/java/android/hardware/input/*.aconfig"], } Loading Loading @@ -456,6 +458,7 @@ cc_aconfig_library { // Hardware aconfig_declarations { name: "android.hardware.flags-aconfig", exportable: true, package: "android.hardware.flags", srcs: ["core/java/android/hardware/flags/*.aconfig"], } Loading Loading @@ -548,6 +551,7 @@ java_aconfig_library { // Media Editing aconfig_declarations { name: "com.android.media.flags.editing-aconfig", exportable: true, package: "com.android.media.editing.flags", srcs: [ "media/java/android/media/flags/editing.aconfig", Loading Loading @@ -593,6 +597,7 @@ java_aconfig_library { // Media TV aconfig_declarations { name: "android.media.tv.flags-aconfig", exportable: true, package: "android.media.tv.flags", srcs: ["media/java/android/media/tv/flags/media_tv.aconfig"], } Loading @@ -606,6 +611,7 @@ java_aconfig_library { // OnDeviceIntelligence aconfig_declarations { name: "android.app.ondeviceintelligence-aconfig", exportable: true, package: "android.app.ondeviceintelligence.flags", srcs: ["core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig"], } Loading Loading @@ -657,6 +663,7 @@ cc_aconfig_library { // Biometrics aconfig_declarations { name: "android.hardware.biometrics.flags-aconfig", exportable: true, package: "android.hardware.biometrics", srcs: ["core/java/android/hardware/biometrics/flags.aconfig"], } Loading Loading @@ -734,6 +741,7 @@ java_aconfig_library { // Broadcast Radio aconfig_declarations { name: "android.hardware.radio.flags-aconfig", exportable: true, package: "android.hardware.radio", srcs: ["core/java/android/hardware/radio/*.aconfig"], } Loading Loading @@ -768,6 +776,7 @@ java_aconfig_library { // Content Protection aconfig_declarations { name: "android.view.contentprotection.flags-aconfig", exportable: true, package: "android.view.contentprotection.flags", srcs: ["core/java/android/view/contentprotection/flags/*.aconfig"], } Loading @@ -794,6 +803,7 @@ java_aconfig_library { // App prediction aconfig_declarations { name: "android.service.appprediction.flags-aconfig", exportable: true, package: "android.service.appprediction.flags", srcs: ["core/java/android/service/appprediction/flags/*.aconfig"], } Loading @@ -807,6 +817,7 @@ java_aconfig_library { // Controls aconfig_declarations { name: "android.service.controls.flags-aconfig", exportable: true, package: "android.service.controls.flags", srcs: ["core/java/android/service/controls/flags/*.aconfig"], } Loading @@ -820,6 +831,7 @@ java_aconfig_library { // Voice aconfig_declarations { name: "android.service.voice.flags-aconfig", exportable: true, package: "android.service.voice.flags", srcs: ["core/java/android/service/voice/flags/*.aconfig"], } Loading Loading @@ -849,6 +861,7 @@ java_aconfig_library { // Companion aconfig_declarations { name: "android.companion.flags-aconfig", exportable: true, package: "android.companion", srcs: ["core/java/android/companion/*.aconfig"], } Loading @@ -862,6 +875,7 @@ java_aconfig_library { // Networking aconfig_declarations { name: "android.net.platform.flags-aconfig", exportable: true, package: "android.net.platform.flags", srcs: ["core/java/android/net/flags.aconfig"], visibility: [":__subpackages__"], Loading @@ -870,6 +884,7 @@ aconfig_declarations { // Thread network aconfig_declarations { name: "com.android.net.thread.platform.flags-aconfig", exportable: true, package: "com.android.net.thread.platform.flags", srcs: ["core/java/android/net/thread/flags.aconfig"], } Loading Loading @@ -967,6 +982,7 @@ java_aconfig_library { aconfig_declarations { name: "framework-jobscheduler-job.flags-aconfig", package: "android.app.job", exportable: true, srcs: ["apex/jobscheduler/framework/aconfig/job.aconfig"], } Loading Loading @@ -1032,6 +1048,7 @@ java_aconfig_library { // Smartspace aconfig_declarations { name: "android.app.smartspace.flags-aconfig", exportable: true, package: "android.app.smartspace.flags", srcs: ["core/java/android/app/smartspace/flags.aconfig"], } Loading Loading @@ -1065,6 +1082,7 @@ java_aconfig_library { // USB aconfig_declarations { name: "android.hardware.usb.flags-aconfig", exportable: true, package: "android.hardware.usb.flags", srcs: ["core/java/android/hardware/usb/flags/*.aconfig"], } Loading Loading @@ -1145,6 +1163,7 @@ java_aconfig_library { // Provider aconfig_declarations { name: "android.provider.flags-aconfig", exportable: true, package: "android.provider", srcs: ["core/java/android/provider/*.aconfig"], } Loading @@ -1165,6 +1184,7 @@ java_aconfig_library { // Speech aconfig_declarations { name: "android.speech.flags-aconfig", exportable: true, package: "android.speech.flags", srcs: ["core/java/android/speech/flags/*.aconfig"], } Loading @@ -1185,6 +1205,7 @@ java_aconfig_library { // Content aconfig_declarations { name: "android.content.flags-aconfig", exportable: true, package: "android.content.flags", srcs: ["core/java/android/content/flags/flags.aconfig"], } Loading @@ -1211,6 +1232,7 @@ java_aconfig_library { // CrashRecovery Module aconfig_declarations { name: "android.crashrecovery.flags-aconfig", exportable: true, package: "android.crashrecovery.flags", srcs: ["packages/CrashRecovery/aconfig/flags.aconfig"], } Loading Loading @@ -1249,6 +1271,7 @@ java_aconfig_library { // Wearable Sensing aconfig_declarations { name: "android.app.wearable.flags-aconfig", exportable: true, package: "android.app.wearable", srcs: ["core/java/android/app/wearable/*.aconfig"], } Loading
apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java +0 −11 Original line number Diff line number Diff line Loading @@ -1737,17 +1737,6 @@ class JobConcurrencyManager { continue; } if (!nextPending.isReady()) { // This could happen when the job count reached its quota, the constrains // for the job has been updated but hasn't been removed from the pending // queue yet. if (DEBUG) { Slog.w(TAG, "Pending+not ready job: " + nextPending); } pendingJobQueue.remove(nextPending); continue; } if (DEBUG && isSimilarJobRunningLocked(nextPending)) { Slog.w(TAG, "Already running similar job to: " + nextPending); } Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +25 −66 Original line number Diff line number Diff line Loading @@ -512,7 +512,7 @@ public final class QuotaController extends StateController { /** An app has reached its quota. The message should contain a {@link UserPackage} object. */ @VisibleForTesting static final int MSG_REACHED_TIME_QUOTA = 0; static final int MSG_REACHED_QUOTA = 0; /** Drop any old timing sessions. */ private static final int MSG_CLEAN_UP_SESSIONS = 1; /** Check if a package is now within its quota. */ Loading @@ -524,7 +524,7 @@ public final class QuotaController extends StateController { * object. */ @VisibleForTesting static final int MSG_REACHED_EJ_TIME_QUOTA = 4; static final int MSG_REACHED_EJ_QUOTA = 4; /** * Process a new {@link UsageEvents.Event}. The event will be the message's object and the * userId will the first arg. Loading @@ -533,11 +533,6 @@ public final class QuotaController extends StateController { /** A UID's free quota grace period has ended. */ @VisibleForTesting static final int MSG_END_GRACE_PERIOD = 6; /** * An app has reached its job count quota. The message should contain a {@link UserPackage} * object. */ static final int MSG_REACHED_COUNT_QUOTA = 7; public QuotaController(@NonNull JobSchedulerService service, @NonNull BackgroundJobsController backgroundJobsController, Loading Loading @@ -879,37 +874,17 @@ public final class QuotaController extends StateController { } @VisibleForTesting @GuardedBy("mLock") boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) { final int standbyBucket = jobStatus.getEffectiveStandbyBucket(); // A job is within quota if one of the following is true: // 1. it was started while the app was in the TOP state // 2. the app is currently in the foreground // 3. the app overall is within its quota if (jobStatus.shouldTreatAsUserInitiatedJob() return jobStatus.shouldTreatAsUserInitiatedJob() || isTopStartedJobLocked(jobStatus) || isUidInForeground(jobStatus.getSourceUid())) { return true; } if (standbyBucket == NEVER_INDEX) return false; if (isQuotaFreeLocked(standbyBucket)) return true; final ExecutionStats stats = getExecutionStatsLocked(jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket); if (!(getRemainingExecutionTimeLocked(stats) > 0)) { // Out of execution time quota. return false; } if (mService.isCurrentlyRunningLocked(jobStatus)) { // if job is running, considered as in quota so it can keep running. return true; } // Check if the app is within job count quota. return isUnderJobCountQuotaLocked(stats) && isUnderSessionCountQuotaLocked(stats); || isUidInForeground(jobStatus.getSourceUid()) || isWithinQuotaLocked( jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket); } @GuardedBy("mLock") Loading @@ -934,11 +909,12 @@ public final class QuotaController extends StateController { ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket); // TODO: use a higher minimum remaining time for jobs with MINIMUM priority return getRemainingExecutionTimeLocked(stats) > 0 && isUnderJobCountQuotaLocked(stats) && isUnderSessionCountQuotaLocked(stats); && isUnderJobCountQuotaLocked(stats, standbyBucket) && isUnderSessionCountQuotaLocked(stats, standbyBucket); } private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats) { private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats, final int standbyBucket) { final long now = sElapsedRealtimeClock.millis(); final boolean isUnderAllowedTimeQuota = (stats.jobRateLimitExpirationTimeElapsed <= now Loading @@ -947,7 +923,8 @@ public final class QuotaController extends StateController { && stats.bgJobCountInWindow < stats.jobCountLimit; } private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats) { private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats, final int standbyBucket) { final long now = sElapsedRealtimeClock.millis(); final boolean isUnderAllowedTimeQuota = (stats.sessionRateLimitExpirationTimeElapsed <= now || stats.sessionCountInRateLimitingWindow < mMaxSessionCountPerRateLimitingWindow); Loading Loading @@ -1472,7 +1449,6 @@ public final class QuotaController extends StateController { stats.jobCountInRateLimitingWindow = 0; } stats.jobCountInRateLimitingWindow += count; stats.bgJobCountInWindow += count; } } Loading Loading @@ -1707,11 +1683,10 @@ public final class QuotaController extends StateController { changedJobs.add(js); } } else if (realStandbyBucket != EXEMPTED_INDEX && realStandbyBucket != ACTIVE_INDEX && realStandbyBucket == js.getEffectiveStandbyBucket() && !mService.isCurrentlyRunningLocked(js)) { && realStandbyBucket == js.getEffectiveStandbyBucket()) { // An app in the ACTIVE bucket may be out of quota while the job could be in quota // for some reason. Therefore, avoid setting the real value here and check each job // individually. Running job need to determine its own quota status as well. // individually. if (setConstraintSatisfied(js, nowElapsed, realInQuota, isWithinEJQuota)) { changedJobs.add(js); } Loading Loading @@ -1830,8 +1805,9 @@ public final class QuotaController extends StateController { } ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket); final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats); final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats); final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats, standbyBucket); final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats, standbyBucket); final long remainingEJQuota = getRemainingEJExecutionTimeLocked(userId, packageName); final boolean inRegularQuota = Loading Loading @@ -2150,11 +2126,6 @@ public final class QuotaController extends StateController { mBgJobCount++; if (mRegularJobTimer) { incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1); final ExecutionStats stats = getExecutionStatsLocked(mPkg.userId, mPkg.packageName, jobStatus.getEffectiveStandbyBucket(), false); if (stats.bgJobCountInWindow >= stats.jobCountLimit) { mHandler.obtainMessage(MSG_REACHED_COUNT_QUOTA, mPkg).sendToTarget(); } } if (mRunningBgJobs.size() == 1) { // Started tracking the first job. Loading Loading @@ -2286,6 +2257,7 @@ public final class QuotaController extends StateController { // repeatedly plugged in and unplugged, or an app changes foreground state // very frequently, the job count for a package may be artificially high. mBgJobCount = mRunningBgJobs.size(); if (mRegularJobTimer) { incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount); // Starting the timer means that all cached execution stats are now Loading @@ -2312,8 +2284,7 @@ public final class QuotaController extends StateController { return; } Message msg = mHandler.obtainMessage( mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA, mPkg); mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg); final long timeRemainingMs = mRegularJobTimer ? getTimeUntilQuotaConsumedLocked(mPkg.userId, mPkg.packageName) : getTimeUntilEJQuotaConsumedLocked(mPkg.userId, mPkg.packageName); Loading @@ -2330,7 +2301,7 @@ public final class QuotaController extends StateController { private void cancelCutoff() { mHandler.removeMessages( mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA, mPkg); mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg); } public void dump(IndentingPrintWriter pw, Predicate<JobStatus> predicate) { Loading Loading @@ -2586,7 +2557,7 @@ public final class QuotaController extends StateController { break; default: if (DEBUG) { Slog.d(TAG, "Dropping usage event " + event.getEventType()); Slog.d(TAG, "Dropping event " + event.getEventType()); } break; } Loading Loading @@ -2695,7 +2666,7 @@ public final class QuotaController extends StateController { public void handleMessage(Message msg) { synchronized (mLock) { switch (msg.what) { case MSG_REACHED_TIME_QUOTA: { case MSG_REACHED_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, "Checking if " + pkg + " has reached its quota."); Loading @@ -2714,7 +2685,7 @@ public final class QuotaController extends StateController { // This could potentially happen if an old session phases out while a // job is currently running. // Reschedule message Message rescheduleMsg = obtainMessage(MSG_REACHED_TIME_QUOTA, pkg); Message rescheduleMsg = obtainMessage(MSG_REACHED_QUOTA, pkg); timeRemainingMs = getTimeUntilQuotaConsumedLocked(pkg.userId, pkg.packageName); if (DEBUG) { Loading @@ -2724,7 +2695,7 @@ public final class QuotaController extends StateController { } break; } case MSG_REACHED_EJ_TIME_QUOTA: { case MSG_REACHED_EJ_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, "Checking if " + pkg + " has reached its EJ quota."); Loading @@ -2742,7 +2713,7 @@ public final class QuotaController extends StateController { // This could potentially happen if an old session phases out while a // job is currently running. // Reschedule message Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_TIME_QUOTA, pkg); Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_QUOTA, pkg); timeRemainingMs = getTimeUntilEJQuotaConsumedLocked( pkg.userId, pkg.packageName); if (DEBUG) { Loading @@ -2752,18 +2723,6 @@ public final class QuotaController extends StateController { } break; } case MSG_REACHED_COUNT_QUOTA: { UserPackage pkg = (UserPackage) msg.obj; if (DEBUG) { Slog.d(TAG, pkg + " has reached its count quota."); } mStateChangedListener.onControllerStateChanged( maybeUpdateConstraintForPkgLocked( sElapsedRealtimeClock.millis(), pkg.userId, pkg.packageName)); break; } case MSG_CLEAN_UP_SESSIONS: if (DEBUG) { Slog.d(TAG, "Cleaning up timing sessions."); Loading
api/coverage/tools/Android.bp +21 −0 Original line number Diff line number Diff line Loading @@ -30,3 +30,24 @@ java_library_host { type: "full", }, } java_test_host { name: "extract-flagged-apis-test", srcs: ["ExtractFlaggedApisTest.kt"], libs: [ "extract_flagged_apis_proto", "junit", "libprotobuf-java-full", ], static_libs: [ "truth", "truth-liteproto-extension", "truth-proto-extension", ], data: [ ":extract-flagged-apis", ], test_options: { unit_test: true, }, }
api/coverage/tools/ExtractFlaggedApis.kt +5 −6 Original line number Diff line number Diff line Loading @@ -28,9 +28,7 @@ fun main(args: Array<String>) { val builder = FlagApiMap.newBuilder() for (pkg in cb.getPackages().packages) { val packageName = pkg.qualifiedName() pkg.allClasses() .filter { it.methods().size > 0 } .forEach { pkg.allClasses().forEach { extractFlaggedApisFromClass(it, it.methods(), packageName, builder) extractFlaggedApisFromClass(it, it.constructors(), packageName, builder) } Loading @@ -45,6 +43,7 @@ fun extractFlaggedApisFromClass( packageName: String, builder: FlagApiMap.Builder ) { if (methods.isEmpty()) return val classFlag = classItem.modifiers .findAnnotation("android.annotation.FlaggedApi") Loading