Loading services/core/java/com/android/server/pm/BackgroundDexOptService.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -405,11 +405,15 @@ public final class BackgroundDexOptService { new TimingsTraceAndSlog(TAG, Trace.TRACE_TAG_PACKAGE_MANAGER); new TimingsTraceAndSlog(TAG, Trace.TRACE_TAG_PACKAGE_MANAGER); tr.traceBegin("jobExecution"); tr.traceBegin("jobExecution"); boolean completed = false; boolean completed = false; boolean fatalError = false; try { try { completed = runIdleOptimization( completed = runIdleOptimization( pm, pkgs, params.getJobId() == JOB_POST_BOOT_UPDATE); pm, pkgs, params.getJobId() == JOB_POST_BOOT_UPDATE); } catch (LegacyDexoptDisabledException e) { } catch (LegacyDexoptDisabledException e) { Slog.wtf(TAG, e); Slog.wtf(TAG, e); } catch (RuntimeException e) { fatalError = true; throw e; } finally { // Those cleanup should be done always. } finally { // Those cleanup should be done always. tr.traceEnd(); tr.traceEnd(); Slog.i(TAG, Slog.i(TAG, Loading @@ -422,12 +426,10 @@ public final class BackgroundDexOptService { if (completed) { if (completed) { markPostBootUpdateCompleted(params); 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(); markDexOptCompleted(); } } })); })); Loading services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -413,8 +413,8 @@ public final class BackgroundDexOptServiceUnitTest { mDexOptThread.join(TEST_WAIT_TIMEOUT_MS); mDexOptThread.join(TEST_WAIT_TIMEOUT_MS); mCancelThread.join(TEST_WAIT_TIMEOUT_MS); mCancelThread.join(TEST_WAIT_TIMEOUT_MS); // Always reschedule for periodic job // The job should be rescheduled. verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, false); verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, true /* wantsReschedule */); verifyLastControlDexOptBlockingCall(false); verifyLastControlDexOptBlockingCall(false); } } Loading Loading
services/core/java/com/android/server/pm/BackgroundDexOptService.java +7 −5 Original line number Original line Diff line number Diff line Loading @@ -405,11 +405,15 @@ public final class BackgroundDexOptService { new TimingsTraceAndSlog(TAG, Trace.TRACE_TAG_PACKAGE_MANAGER); new TimingsTraceAndSlog(TAG, Trace.TRACE_TAG_PACKAGE_MANAGER); tr.traceBegin("jobExecution"); tr.traceBegin("jobExecution"); boolean completed = false; boolean completed = false; boolean fatalError = false; try { try { completed = runIdleOptimization( completed = runIdleOptimization( pm, pkgs, params.getJobId() == JOB_POST_BOOT_UPDATE); pm, pkgs, params.getJobId() == JOB_POST_BOOT_UPDATE); } catch (LegacyDexoptDisabledException e) { } catch (LegacyDexoptDisabledException e) { Slog.wtf(TAG, e); Slog.wtf(TAG, e); } catch (RuntimeException e) { fatalError = true; throw e; } finally { // Those cleanup should be done always. } finally { // Those cleanup should be done always. tr.traceEnd(); tr.traceEnd(); Slog.i(TAG, Slog.i(TAG, Loading @@ -422,12 +426,10 @@ public final class BackgroundDexOptService { if (completed) { if (completed) { markPostBootUpdateCompleted(params); 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(); markDexOptCompleted(); } } })); })); Loading
services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java +2 −2 Original line number Original line Diff line number Diff line Loading @@ -413,8 +413,8 @@ public final class BackgroundDexOptServiceUnitTest { mDexOptThread.join(TEST_WAIT_TIMEOUT_MS); mDexOptThread.join(TEST_WAIT_TIMEOUT_MS); mCancelThread.join(TEST_WAIT_TIMEOUT_MS); mCancelThread.join(TEST_WAIT_TIMEOUT_MS); // Always reschedule for periodic job // The job should be rescheduled. verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, false); verify(mJobServiceForIdle).jobFinished(mJobParametersForIdle, true /* wantsReschedule */); verifyLastControlDexOptBlockingCall(false); verifyLastControlDexOptBlockingCall(false); } } Loading