summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java12
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java4
2 files changed, 9 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 9785d478a6d1..f85d6af9efee 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -405,11 +405,15 @@ public final class BackgroundDexOptService {
new TimingsTraceAndSlog(TAG, Trace.TRACE_TAG_PACKAGE_MANAGER);
tr.traceBegin("jobExecution");
boolean completed = false;
+ boolean fatalError = false;
try {
completed = runIdleOptimization(
pm, pkgs, params.getJobId() == JOB_POST_BOOT_UPDATE);
} catch (LegacyDexoptDisabledException e) {
Slog.wtf(TAG, e);
+ } catch (RuntimeException e) {
+ fatalError = true;
+ throw e;
} finally { // Those cleanup should be done always.
tr.traceEnd();
Slog.i(TAG,
@@ -422,12 +426,10 @@ public final class BackgroundDexOptService {
if (completed) {
markPostBootUpdateCompleted(params);
}
- // Reschedule when cancelled
- job.jobFinished(params, !completed);
- } else {
- // Periodic job
- job.jobFinished(params, false /* reschedule */);
}
+ // Reschedule when cancelled. No need to reschedule when failed with
+ // fatal error because it's likely to fail again.
+ job.jobFinished(params, !completed && !fatalError);
markDexOptCompleted();
}
}));
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
index 8b36da5bc36c..d5aa7fec996f 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
@@ -413,8 +413,8 @@ public final class BackgroundDexOptServiceUnitTest {
mDexOptThread.join(TEST_WAIT_TIMEOUT_MS);
mCancelThread.join(TEST_WAIT_TIMEOUT_MS);
- // Always reschedule for periodic job
- verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, false);
+ // The job should be rescheduled.
+ verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, true /* wantsReschedule */);
verifyLastControlDexOptBlockingCall(false);
}