OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 package org.chromium.components.minidump_uploader; | 4 package org.chromium.components.minidump_uploader; |
5 | 5 |
6 import android.annotation.TargetApi; | 6 import android.annotation.TargetApi; |
| 7 import android.app.job.JobInfo; |
7 import android.app.job.JobParameters; | 8 import android.app.job.JobParameters; |
| 9 import android.app.job.JobScheduler; |
8 import android.app.job.JobService; | 10 import android.app.job.JobService; |
| 11 import android.content.Context; |
9 import android.os.Build; | 12 import android.os.Build; |
| 13 import android.os.PersistableBundle; |
| 14 |
| 15 import org.chromium.base.Log; |
10 | 16 |
11 /** | 17 /** |
12 * Class that interacts with the Android JobScheduler to upload Minidumps at app
ropriate times. | 18 * Class that interacts with the Android JobScheduler to upload Minidumps at app
ropriate times. |
13 */ | 19 */ |
14 @TargetApi(Build.VERSION_CODES.LOLLIPOP) | 20 @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
15 public abstract class MinidumpUploadJobService extends JobService { | 21 public abstract class MinidumpUploadJobService extends JobService { |
16 Object mRunningLock = new Object(); | 22 private static final String TAG = "MinidumpJobService"; |
17 boolean mRunningJob = false; | 23 |
18 MinidumpUploader mMinidumpUploader; | 24 // Initial back-off time for upload-job, i.e. the minimum delay when a job i
s retried. A retry |
| 25 // will happen when there are minidumps left after trying to upload all mini
dumps. This could |
| 26 // happen if an upload attempt fails, or if more minidumps are added at the
same time as |
| 27 // uploading old ones. The initial backoff is set to a fairly high number (3
0 minutes) to |
| 28 // increase the chance of performing uploads in batches if the initial uploa
d fails. |
| 29 private static final int JOB_INITIAL_BACKOFF_TIME_IN_MS = 1000 * 60 * 30; |
| 30 |
| 31 // Back-off policy for upload-job. |
| 32 private static final int JOB_BACKOFF_POLICY = JobInfo.BACKOFF_POLICY_EXPONEN
TIAL; |
| 33 |
| 34 private MinidumpUploader mMinidumpUploader; |
| 35 |
| 36 // Used in Debug builds to assert that this job service never attempts to ru
n more than one job |
| 37 // at a time: |
| 38 private final Object mRunningLock = new Object(); |
| 39 private boolean mRunningJob = false; |
| 40 |
| 41 /** |
| 42 * Schedules uploading of all pending minidumps. |
| 43 * @param context The application context, in which to schedule the crash re
port uploads. |
| 44 * @param jobInfoBuilder A job info builder that has been initialized with a
ny embedder-specific |
| 45 * requriements. This builder will be extended to include shared require
ments, and then used |
| 46 * to build an upload job for scheduling. |
| 47 */ |
| 48 public static void scheduleUpload(Context context, JobInfo.Builder jobInfoBu
ilder) { |
| 49 Log.i(TAG, "Scheduling upload of all pending minidumps."); |
| 50 JobScheduler scheduler = |
| 51 (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SE
RVICE); |
| 52 JobInfo uploadJob = |
| 53 jobInfoBuilder |
| 54 .setBackoffCriteria(JOB_INITIAL_BACKOFF_TIME_IN_MS, JOB_
BACKOFF_POLICY) |
| 55 .build(); |
| 56 int result = scheduler.schedule(uploadJob); |
| 57 assert result == JobScheduler.RESULT_SUCCESS; |
| 58 } |
19 | 59 |
20 @Override | 60 @Override |
21 public boolean onStartJob(JobParameters params) { | 61 public boolean onStartJob(JobParameters params) { |
22 // Ensure we only run one job at a time. | 62 // Ensure we only run one job at a time. |
23 synchronized (mRunningLock) { | 63 synchronized (mRunningLock) { |
24 assert !mRunningJob; | 64 assert !mRunningJob; |
25 mRunningJob = true; | 65 mRunningJob = true; |
26 } | 66 } |
27 mMinidumpUploader = createMinidumpUploader(); | 67 mMinidumpUploader = createMinidumpUploader(params.getExtras()); |
28 mMinidumpUploader.uploadAllMinidumps(createJobFinishedCallback(params)); | 68 mMinidumpUploader.uploadAllMinidumps(createJobFinishedCallback(params)); |
29 return true; // true = processing work on a separate thread, false = don
e already. | 69 return true; // true = processing work on a separate thread, false = don
e already. |
30 } | 70 } |
31 | 71 |
32 @Override | 72 @Override |
33 public boolean onStopJob(JobParameters params) { | 73 public boolean onStopJob(JobParameters params) { |
| 74 Log.i(TAG, "Canceling pending uploads due to change in networking status
."); |
34 boolean reschedule = mMinidumpUploader.cancelUploads(); | 75 boolean reschedule = mMinidumpUploader.cancelUploads(); |
35 synchronized (mRunningLock) { | 76 synchronized (mRunningLock) { |
36 mRunningJob = false; | 77 mRunningJob = false; |
37 } | 78 } |
38 return reschedule; | 79 return reschedule; |
39 } | 80 } |
40 | 81 |
41 @Override | 82 @Override |
42 public void onDestroy() { | 83 public void onDestroy() { |
43 mMinidumpUploader = null; | 84 mMinidumpUploader = null; |
44 super.onDestroy(); | 85 super.onDestroy(); |
45 } | 86 } |
46 | 87 |
47 private MinidumpUploader.UploadsFinishedCallback createJobFinishedCallback( | 88 private MinidumpUploader.UploadsFinishedCallback createJobFinishedCallback( |
48 final JobParameters params) { | 89 final JobParameters params) { |
49 return new MinidumpUploader.UploadsFinishedCallback() { | 90 return new MinidumpUploader.UploadsFinishedCallback() { |
50 @Override | 91 @Override |
51 public void uploadsFinished(boolean reschedule) { | 92 public void uploadsFinished(boolean reschedule) { |
| 93 if (reschedule) { |
| 94 Log.i(TAG, "Some minidumps remain un-uploaded; rescheduling.
"); |
| 95 } |
52 synchronized (mRunningLock) { | 96 synchronized (mRunningLock) { |
53 mRunningJob = false; | 97 mRunningJob = false; |
54 } | 98 } |
55 MinidumpUploadJobService.this.jobFinished(params, reschedule); | 99 MinidumpUploadJobService.this.jobFinished(params, reschedule); |
56 } | 100 } |
57 }; | 101 }; |
58 } | 102 } |
59 | 103 |
60 /** | 104 /** |
| 105 * @param extras Any extra data persisted for this job. |
61 * @return The minidump uploader that jobs should use. | 106 * @return The minidump uploader that jobs should use. |
62 */ | 107 */ |
63 protected abstract MinidumpUploader createMinidumpUploader(); | 108 protected abstract MinidumpUploader createMinidumpUploader(PersistableBundle
extras); |
64 } | 109 } |
OLD | NEW |