Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/MinidumpUploadJobService.java

Issue 2737263006: [Android Crash Reporting] Allow uploading minidumps via the JobScheduler (Closed)
Patch Set: Fully implemented, still needs tests Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.ComponentName;
12 import android.content.Context;
9 import android.os.Build; 13 import android.os.Build;
14 import android.os.PersistableBundle;
15
16 import org.chromium.base.Log;
10 17
11 /** 18 /**
12 * Class that interacts with the Android JobScheduler to upload Minidumps at app ropriate times. 19 * Class that interacts with the Android JobScheduler to upload Minidumps at app ropriate times.
13 */ 20 */
14 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 21 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
15 public abstract class MinidumpUploadJobService extends JobService { 22 public abstract class MinidumpUploadJobService extends JobService {
16 Object mRunningLock = new Object(); 23 private static final String TAG = "MinidumpJobService";
17 boolean mRunningJob = false; 24
18 MinidumpUploader mMinidumpUploader; 25 // The job id for uploading minidumps. For more info on this constant, see
26 // https://developer.android.com/reference/android/app/job/JobInfo.Builder.h tml#JobInfo.Builder(int,
27 // android.content.ComponentName)
28 private static final int MINIDUMP_UPLOADING_JOB_ID = 42;
gsennton 2017/03/13 17:57:17 I think we want different numbers for Chrome and W
Ilya Sherman 2017/03/14 02:18:55 Done. Good point -- I completely forgot about Mon
29
30 // Initial back-off time for upload-job. This is set to a fairly high number (30 minutes) to
31 // increase the chance of performing uploads in batches if the initial uploa d fails.
32 private static final int JOB_BACKOFF_TIME_IN_MS = 1000 * 60 * 30;
33
34 // Back-off policy for upload-job.
35 private static final int JOB_BACKOFF_POLICY = JobInfo.BACKOFF_POLICY_EXPONEN TIAL;
36
37 private final Object mRunningLock = new Object();
38 private boolean mRunningJob = false;
39 private MinidumpUploader mMinidumpUploader;
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 jobServiceClass The concrete class to use as the job service for u ploading minidumps.
45 * Should be a subclass of this class.
46 * @param requiredNetworkType The network type required for upload. Should b e set to one of the
47 * NETWORK_TYPE constants defined in the Android JobInfo class.
48 * @param extras Any serialized data that should be passed to the upload job , in case the job
49 * runs after the calling process is destroyed.
50 */
51 public static void scheduleUpload(Context context,
52 Class<? extends MinidumpUploadJobService> jobServiceClass, int requi redNetworkType,
53 PersistableBundle extras) {
54 Log.i(TAG, "Scheduling upload of all pending minidumps.");
55 JobScheduler scheduler =
56 (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SE RVICE);
57 JobInfo uploadJob =
58 new JobInfo
59 .Builder(MINIDUMP_UPLOADING_JOB_ID,
60 new ComponentName(context, jobServiceClass))
61 .setRequiredNetworkType(requiredNetworkType)
62 // Minimum delay when a job is retried (a retry will hap pen when
63 // there are minidumps left after trying to upload all m inidumps -
64 // this could e.g. happen if we add more minidumps at th e same time
65 // as uploading old ones).
66 .setBackoffCriteria(JOB_BACKOFF_TIME_IN_MS, JOB_BACKOFF_ POLICY)
67 .setExtras(extras)
68 .build();
69 if (scheduler.schedule(uploadJob) == JobScheduler.RESULT_FAILURE) {
70 throw new RuntimeException("couldn't schedule " + uploadJob);
71 }
72 }
19 73
20 @Override 74 @Override
21 public boolean onStartJob(JobParameters params) { 75 public boolean onStartJob(JobParameters params) {
22 // Ensure we only run one job at a time. 76 // Ensure we only run one job at a time.
23 synchronized (mRunningLock) { 77 synchronized (mRunningLock) {
78 // TODO(isherman): We never read mRunningJob -- is it obsolete?
Ilya Sherman 2017/03/13 03:12:09 Gustav, I forget whether we've discussed this befo
gsennton 2017/03/13 17:57:17 It's asserting that we aren't running several jobs
Ilya Sherman 2017/03/14 02:18:55 Okay, as long as it's intended just a sanity-check
gsennton 2017/03/14 18:17:28 Yeah, it's only enabled for WebView with a certain
24 assert !mRunningJob; 79 assert !mRunningJob;
25 mRunningJob = true; 80 mRunningJob = true;
26 } 81 }
27 mMinidumpUploader = createMinidumpUploader(); 82 mMinidumpUploader = createMinidumpUploader(params.getExtras());
28 mMinidumpUploader.uploadAllMinidumps(createJobFinishedCallback(params)); 83 mMinidumpUploader.uploadAllMinidumps(createJobFinishedCallback(params));
29 return true; // true = processing work on a separate thread, false = don e already. 84 return true; // true = processing work on a separate thread, false = don e already.
30 } 85 }
31 86
32 @Override 87 @Override
33 public boolean onStopJob(JobParameters params) { 88 public boolean onStopJob(JobParameters params) {
89 Log.i(TAG, "Canceling pending uploads due to change in networking status .");
34 boolean reschedule = mMinidumpUploader.cancelUploads(); 90 boolean reschedule = mMinidumpUploader.cancelUploads();
35 synchronized (mRunningLock) { 91 synchronized (mRunningLock) {
36 mRunningJob = false; 92 mRunningJob = false;
37 } 93 }
38 return reschedule; 94 return reschedule;
39 } 95 }
40 96
41 @Override 97 @Override
42 public void onDestroy() { 98 public void onDestroy() {
43 mMinidumpUploader = null; 99 mMinidumpUploader = null;
44 super.onDestroy(); 100 super.onDestroy();
45 } 101 }
46 102
47 private MinidumpUploader.UploadsFinishedCallback createJobFinishedCallback( 103 private MinidumpUploader.UploadsFinishedCallback createJobFinishedCallback(
48 final JobParameters params) { 104 final JobParameters params) {
49 return new MinidumpUploader.UploadsFinishedCallback() { 105 return new MinidumpUploader.UploadsFinishedCallback() {
50 @Override 106 @Override
51 public void uploadsFinished(boolean reschedule) { 107 public void uploadsFinished(boolean reschedule) {
108 if (reschedule) {
109 Log.i(TAG, "Some minidumps remain un-uploaded; rescheduling. ");
110 }
52 synchronized (mRunningLock) { 111 synchronized (mRunningLock) {
53 mRunningJob = false; 112 mRunningJob = false;
54 } 113 }
55 MinidumpUploadJobService.this.jobFinished(params, reschedule); 114 MinidumpUploadJobService.this.jobFinished(params, reschedule);
56 } 115 }
57 }; 116 };
58 } 117 }
59 118
60 /** 119 /**
120 * @param extras Any extra data persisted for this job.
61 * @return The minidump uploader that jobs should use. 121 * @return The minidump uploader that jobs should use.
62 */ 122 */
63 protected abstract MinidumpUploader createMinidumpUploader(); 123 protected abstract MinidumpUploader createMinidumpUploader(PersistableBundle extras);
64 } 124 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698