| Index: components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java
|
| diff --git a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java
|
| index c275030846f7b104471f8a6dc2c0397644de1848..9e29f128db932d64fc6aea4c9f3a9448096e9dd2 100644
|
| --- a/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java
|
| +++ b/components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java
|
| @@ -4,18 +4,58 @@
|
| package org.chromium.components.minidump_uploader;
|
|
|
| import android.annotation.TargetApi;
|
| +import android.app.job.JobInfo;
|
| import android.app.job.JobParameters;
|
| +import android.app.job.JobScheduler;
|
| import android.app.job.JobService;
|
| +import android.content.Context;
|
| import android.os.Build;
|
| +import android.os.PersistableBundle;
|
| +
|
| +import org.chromium.base.Log;
|
|
|
| /**
|
| * Class that interacts with the Android JobScheduler to upload Minidumps at appropriate times.
|
| */
|
| @TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
| public abstract class MinidumpUploadJobService extends JobService {
|
| - Object mRunningLock = new Object();
|
| - boolean mRunningJob = false;
|
| - MinidumpUploader mMinidumpUploader;
|
| + private static final String TAG = "MinidumpJobService";
|
| +
|
| + // Initial back-off time for upload-job, i.e. the minimum delay when a job is retried. A retry
|
| + // will happen when there are minidumps left after trying to upload all minidumps. This could
|
| + // happen if an upload attempt fails, or if more minidumps are added at the same time as
|
| + // uploading old ones. The initial backoff is set to a fairly high number (30 minutes) to
|
| + // increase the chance of performing uploads in batches if the initial upload fails.
|
| + private static final int JOB_INITIAL_BACKOFF_TIME_IN_MS = 1000 * 60 * 30;
|
| +
|
| + // Back-off policy for upload-job.
|
| + private static final int JOB_BACKOFF_POLICY = JobInfo.BACKOFF_POLICY_EXPONENTIAL;
|
| +
|
| + private MinidumpUploader mMinidumpUploader;
|
| +
|
| + // Used in Debug builds to assert that this job service never attempts to run more than one job
|
| + // at a time:
|
| + private final Object mRunningLock = new Object();
|
| + private boolean mRunningJob = false;
|
| +
|
| + /**
|
| + * Schedules uploading of all pending minidumps.
|
| + * @param context The application context, in which to schedule the crash report uploads.
|
| + * @param jobInfoBuilder A job info builder that has been initialized with any embedder-specific
|
| + * requriements. This builder will be extended to include shared requirements, and then used
|
| + * to build an upload job for scheduling.
|
| + */
|
| + public static void scheduleUpload(Context context, JobInfo.Builder jobInfoBuilder) {
|
| + Log.i(TAG, "Scheduling upload of all pending minidumps.");
|
| + JobScheduler scheduler =
|
| + (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
|
| + JobInfo uploadJob =
|
| + jobInfoBuilder
|
| + .setBackoffCriteria(JOB_INITIAL_BACKOFF_TIME_IN_MS, JOB_BACKOFF_POLICY)
|
| + .build();
|
| + int result = scheduler.schedule(uploadJob);
|
| + assert result == JobScheduler.RESULT_SUCCESS;
|
| + }
|
|
|
| @Override
|
| public boolean onStartJob(JobParameters params) {
|
| @@ -24,13 +64,14 @@ public abstract class MinidumpUploadJobService extends JobService {
|
| assert !mRunningJob;
|
| mRunningJob = true;
|
| }
|
| - mMinidumpUploader = createMinidumpUploader();
|
| + mMinidumpUploader = createMinidumpUploader(params.getExtras());
|
| mMinidumpUploader.uploadAllMinidumps(createJobFinishedCallback(params));
|
| return true; // true = processing work on a separate thread, false = done already.
|
| }
|
|
|
| @Override
|
| public boolean onStopJob(JobParameters params) {
|
| + Log.i(TAG, "Canceling pending uploads due to change in networking status.");
|
| boolean reschedule = mMinidumpUploader.cancelUploads();
|
| synchronized (mRunningLock) {
|
| mRunningJob = false;
|
| @@ -49,6 +90,9 @@ public abstract class MinidumpUploadJobService extends JobService {
|
| return new MinidumpUploader.UploadsFinishedCallback() {
|
| @Override
|
| public void uploadsFinished(boolean reschedule) {
|
| + if (reschedule) {
|
| + Log.i(TAG, "Some minidumps remain un-uploaded; rescheduling.");
|
| + }
|
| synchronized (mRunningLock) {
|
| mRunningJob = false;
|
| }
|
| @@ -58,7 +102,8 @@ public abstract class MinidumpUploadJobService extends JobService {
|
| }
|
|
|
| /**
|
| + * @param extras Any extra data persisted for this job.
|
| * @return The minidump uploader that jobs should use.
|
| */
|
| - protected abstract MinidumpUploader createMinidumpUploader();
|
| + protected abstract MinidumpUploader createMinidumpUploader(PersistableBundle extras);
|
| }
|
|
|