| 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 | 4 |
| 5 package org.chromium.android_webview.crash; | 5 package org.chromium.android_webview.crash; |
| 6 | 6 |
| 7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
| 8 import android.app.Service; | 8 import android.app.Service; |
| 9 import android.app.job.JobInfo; | 9 import android.app.job.JobInfo; |
| 10 import android.app.job.JobScheduler; | |
| 11 import android.content.ComponentName; | 10 import android.content.ComponentName; |
| 12 import android.content.Context; | 11 import android.content.Context; |
| 13 import android.content.Intent; | 12 import android.content.Intent; |
| 14 import android.os.Binder; | 13 import android.os.Binder; |
| 15 import android.os.Build; | 14 import android.os.Build; |
| 16 import android.os.IBinder; | 15 import android.os.IBinder; |
| 17 import android.os.ParcelFileDescriptor; | 16 import android.os.ParcelFileDescriptor; |
| 18 | 17 |
| 19 import org.chromium.base.Log; | 18 import org.chromium.base.Log; |
| 20 import org.chromium.base.VisibleForTesting; | 19 import org.chromium.base.VisibleForTesting; |
| 20 import org.chromium.components.background_task_scheduler.TaskIds; |
| 21 import org.chromium.components.minidump_uploader.CrashFileManager; | 21 import org.chromium.components.minidump_uploader.CrashFileManager; |
| 22 import org.chromium.components.minidump_uploader.MinidumpUploadJobService; |
| 22 | 23 |
| 23 import java.io.File; | 24 import java.io.File; |
| 24 import java.io.IOException; | 25 import java.io.IOException; |
| 25 | 26 |
| 26 /** | 27 /** |
| 27 * Service that is responsible for receiving crash dumps from an application, fo
r upload. | 28 * Service that is responsible for receiving crash dumps from an application, fo
r upload. |
| 28 */ | 29 */ |
| 29 @TargetApi(Build.VERSION_CODES.LOLLIPOP) | 30 @TargetApi(Build.VERSION_CODES.LOLLIPOP) |
| 30 public class CrashReceiverService extends Service { | 31 public class CrashReceiverService extends Service { |
| 31 private static final String TAG = "CrashReceiverService"; | 32 private static final String TAG = "CrashReceiverService"; |
| 32 | 33 |
| 33 private static final String WEBVIEW_CRASH_DIR = "WebView_Crashes"; | 34 private static final String WEBVIEW_CRASH_DIR = "WebView_Crashes"; |
| 34 private static final String WEBVIEW_TMP_CRASH_DIR = "WebView_Crashes_Tmp"; | 35 private static final String WEBVIEW_TMP_CRASH_DIR = "WebView_Crashes_Tmp"; |
| 35 | 36 |
| 36 private static final int MINIDUMP_UPLOADING_JOB_ID = 42; | |
| 37 // Initial back-off time for upload-job, this is set to a fairly high number
(30 minutes) to | |
| 38 // increase the chance of performing uploads in batches if the initial uploa
d fails. | |
| 39 private static final int JOB_BACKOFF_TIME_IN_MS = 1000 * 60 * 30; | |
| 40 // Back-off policy for upload-job. | |
| 41 private static final int JOB_BACKOFF_POLICY = JobInfo.BACKOFF_POLICY_EXPONEN
TIAL; | |
| 42 | |
| 43 private final Object mCopyingLock = new Object(); | 37 private final Object mCopyingLock = new Object(); |
| 44 private boolean mIsCopying = false; | 38 private boolean mIsCopying = false; |
| 45 | 39 |
| 46 @Override | 40 @Override |
| 47 public void onCreate() { | 41 public void onCreate() { |
| 48 super.onCreate(); | 42 super.onCreate(); |
| 49 } | 43 } |
| 50 | 44 |
| 51 private final ICrashReceiverService.Stub mBinder = new ICrashReceiverService
.Stub() { | 45 private final ICrashReceiverService.Stub mBinder = new ICrashReceiverService
.Stub() { |
| 52 @Override | 46 @Override |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 Log.e(TAG, "Was interrupted when waiting to copy minidumps",
e); | 92 Log.e(TAG, "Was interrupted when waiting to copy minidumps",
e); |
| 99 return false; | 93 return false; |
| 100 } | 94 } |
| 101 } | 95 } |
| 102 mIsCopying = true; | 96 mIsCopying = true; |
| 103 return true; | 97 return true; |
| 104 } | 98 } |
| 105 } | 99 } |
| 106 | 100 |
| 107 private void scheduleNewJob() { | 101 private void scheduleNewJob() { |
| 108 JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_
SCHEDULER_SERVICE); | 102 JobInfo.Builder builder = |
| 109 JobInfo newJob = new JobInfo | 103 new JobInfo |
| 110 .Builder(MINIDUMP_UPLOADING_JOB_ID /* jobId */, | 104 .Builder(TaskIds.WEBVIEW_MINIDUMP_UPLOADING_JOB_ID, |
| 111 new ComponentName(this, AwMinidumpUploa
dJobService.class)) | 105 new ComponentName(this, AwMinidumpUploadJobServi
ce.class)) |
| 112 .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UN
METERED) | 106 .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); |
| 113 // Minimum delay when a job is retried (a retry
will happen when | 107 MinidumpUploadJobService.scheduleUpload(this, builder); |
| 114 // there are minidumps left after trying to upl
oad all minidumps - | |
| 115 // this could e.g. happen if we add more minidu
mps at the same time | |
| 116 // as uploading old ones). | |
| 117 .setBackoffCriteria(JOB_BACKOFF_TIME_IN_MS, JOB
_BACKOFF_POLICY) | |
| 118 .build(); | |
| 119 if (jobScheduler.schedule(newJob) == JobScheduler.RESULT_FAILURE) { | |
| 120 throw new RuntimeException("couldn't schedule " + newJob); | |
| 121 } | |
| 122 } | 108 } |
| 123 | 109 |
| 124 /** | 110 /** |
| 125 * Copy minidumps from the {@param fileDescriptors} to the directory where W
ebView stores its | 111 * Copy minidumps from the {@param fileDescriptors} to the directory where W
ebView stores its |
| 126 * minidump files. {@param context} is used to look up the directory in whic
h the files will be | 112 * minidump files. {@param context} is used to look up the directory in whic
h the files will be |
| 127 * saved. | 113 * saved. |
| 128 * @return whether any minidump was copied. | 114 * @return whether any minidump was copied. |
| 129 */ | 115 */ |
| 130 @VisibleForTesting | 116 @VisibleForTesting |
| 131 public static boolean copyMinidumps( | 117 public static boolean copyMinidumps( |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 @VisibleForTesting | 199 @VisibleForTesting |
| 214 public static File getWebViewTmpCrashDir(Context context) { | 200 public static File getWebViewTmpCrashDir(Context context) { |
| 215 return new File(context.getCacheDir(), WEBVIEW_TMP_CRASH_DIR); | 201 return new File(context.getCacheDir(), WEBVIEW_TMP_CRASH_DIR); |
| 216 } | 202 } |
| 217 | 203 |
| 218 @Override | 204 @Override |
| 219 public IBinder onBind(Intent intent) { | 205 public IBinder onBind(Intent intent) { |
| 220 return mBinder; | 206 return mBinder; |
| 221 } | 207 } |
| 222 } | 208 } |
| OLD | NEW |