Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java |
| index 148b8a6097a18854e69ec18e84ee524609ea4d42..85bc9b697561c30955c420849c22076968178074 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java |
| @@ -4,9 +4,14 @@ |
| package org.chromium.chrome.browser.crash; |
| +import android.annotation.SuppressLint; |
| import android.app.IntentService; |
| +import android.app.job.JobInfo; |
| +import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| +import android.os.Build; |
| +import android.os.PersistableBundle; |
| import android.support.annotation.StringDef; |
| import org.chromium.base.Log; |
| @@ -14,10 +19,12 @@ import org.chromium.base.StreamUtil; |
| import org.chromium.base.VisibleForTesting; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.metrics.RecordHistogram; |
| +import org.chromium.chrome.browser.ChromeFeatureList; |
| import org.chromium.chrome.browser.preferences.ChromePreferenceManager; |
| import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; |
| import org.chromium.components.minidump_uploader.CrashFileManager; |
| import org.chromium.components.minidump_uploader.MinidumpUploadCallable; |
| +import org.chromium.components.minidump_uploader.MinidumpUploadJobService; |
| import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager; |
| import java.io.BufferedReader; |
| @@ -41,6 +48,12 @@ public class MinidumpUploadService extends IntentService { |
| static final String UPLOAD_LOG_KEY = "upload_log"; |
| /** |
| + * The job id for uploading minidumps. For more info on this constant, see |
| + * https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#JobInfo.Builder(int,%20android.content.ComponentName) |
| + */ |
| + private static final int MINIDUMP_UPLOADING_JOB_ID = 142; |
|
gsennton
2017/03/14 18:17:28
I just realized it might be good to look for the I
Ilya Sherman
2017/03/15 02:13:34
Good call! Moved the constants into that componen
gsennton
2017/03/15 12:57:43
Indeed, I wonder if there will be anything stoppin
|
| + |
| + /** |
| * The number of times we will try to upload a crash. |
| */ |
| public static final int MAX_TRIES_ALLOWED = 3; |
| @@ -68,6 +81,47 @@ public class MinidumpUploadService extends IntentService { |
| } |
| /** |
| + * @return Whether to use the JobSchduler API to upload crash reports, rather than directly |
| + * creating a service for uploading. |
| + */ |
| + public static boolean shouldUseJobSchedulerForUploads() { |
| + // The JobScheduler API is only available as of Android L. |
| + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { |
| + return false; |
| + } |
| + |
| + return ChromeFeatureList.isEnabled( |
| + ChromeFeatureList.UPLOAD_CRASH_REPORTS_USING_JOB_SCHEDULER); |
| + } |
| + |
| + /** |
| + * Schedules uploading of all pending minidumps, using the JobScheduler API. |
| + */ |
| + @SuppressLint("NewApi") |
| + public static void scheduleUploadJob(Context context) { |
| + assert shouldUseJobSchedulerForUploads(); |
| + |
| + CrashReportingPermissionManager permissionManager = PrivacyPreferencesManager.getInstance(); |
| + PersistableBundle permissions = new PersistableBundle(); |
| + // Note: putBoolean is only available in API level 22, so massage the data into ints |
| + // instead. |
| + permissions.putInt(ChromeMinidumpUploaderDelegate.IS_CLIENT_IN_METRICS_SAMPLE, |
| + permissionManager.isClientInMetricsSample() ? 1 : 0); |
| + permissions.putInt(ChromeMinidumpUploaderDelegate.IS_CRASH_UPLOAD_DISABLED_BY_COMMAND_LINE, |
| + permissionManager.isCrashUploadDisabledByCommandLine() ? 1 : 0); |
| + permissions.putInt(ChromeMinidumpUploaderDelegate.IS_UPLOAD_ENABLED_FOR_TESTS, |
| + permissionManager.isUploadEnabledForTests() ? 1 : 0); |
| + |
| + JobInfo.Builder builder = |
| + new JobInfo |
| + .Builder(MINIDUMP_UPLOADING_JOB_ID, |
| + new ComponentName(context, ChromeMinidumpUploadJobService.class)) |
| + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) |
| + .setExtras(permissions); |
| + MinidumpUploadJobService.scheduleUpload(context, builder); |
| + } |
| + |
| + /** |
| * Stores the successes and failures from uploading crash to UMA, |
| */ |
| public static void storeBreakpadUploadStatsInUma(ChromePreferenceManager pref) { |
| @@ -106,10 +160,6 @@ public class MinidumpUploadService extends IntentService { |
| return; |
| } |
| int tries = CrashFileManager.readAttemptNumber(minidumpFileName); |
| - // -1 means no attempt number was read. |
| - if (tries == -1) { |
| - tries = 0; |
| - } |
| // Since we do not rename a file after reaching max number of tries, |
| // files that have maxed out tries will NOT reach this. |
| @@ -132,7 +182,7 @@ public class MinidumpUploadService extends IntentService { |
| if (uploadStatus == MinidumpUploadCallable.UPLOAD_SUCCESS) { |
| // Only update UMA stats if an intended and successful upload. |
| - incrementCrashSuccessUploadCount(getNewNameAfterSuccessfulUpload(minidumpFileName)); |
| + incrementCrashSuccessUploadCount(minidumpFileName); |
| } else if (uploadStatus == MinidumpUploadCallable.UPLOAD_FAILURE) { |
| // Unable to upload minidump. Incrementing try number and restarting. |
| @@ -212,12 +262,12 @@ public class MinidumpUploadService extends IntentService { |
| * crashes by looking into the file. |
| * @param fileName is the name of a minidump file that contains the type of crash. |
| */ |
| - private void incrementCrashSuccessUploadCount(String fileName) { |
| + public static void incrementCrashSuccessUploadCount(String fileName) { |
| ChromePreferenceManager.getInstance().incrementCrashSuccessUploadCount( |
| - getCrashType(fileName)); |
| + getCrashType(getNewNameAfterSuccessfulUpload(fileName))); |
|
gsennton
2017/03/14 18:17:28
Hiding this call in here seems like an implementat
Ilya Sherman
2017/03/15 02:13:34
That's a very good point, and I actually had a bug
gsennton
2017/03/15 12:57:43
Yeah, that looks fine ;).
|
| } |
| - private void incrementCrashFailureUploadCount(String fileName) { |
| + public static void incrementCrashFailureUploadCount(String fileName) { |
| ChromePreferenceManager.getInstance().incrementCrashFailureUploadCount( |
| getCrashType(fileName)); |
| } |
| @@ -249,6 +299,7 @@ public class MinidumpUploadService extends IntentService { |
| */ |
| public static void tryUploadCrashDump(Context context, File minidumpFile) |
| throws SecurityException { |
| + assert !shouldUseJobSchedulerForUploads(); |
| CrashFileManager fileManager = new CrashFileManager(context.getCacheDir()); |
| Intent intent = new Intent(context, MinidumpUploadService.class); |
| intent.setAction(ACTION_UPLOAD); |
| @@ -268,11 +319,12 @@ public class MinidumpUploadService extends IntentService { |
| * @param context Context of the application. |
| */ |
| public static void tryUploadAllCrashDumps(Context context) { |
| + assert !shouldUseJobSchedulerForUploads(); |
| CrashFileManager fileManager = new CrashFileManager(context.getCacheDir()); |
| File[] minidumps = fileManager.getAllMinidumpFiles(MAX_TRIES_ALLOWED); |
| Log.i(TAG, "Attempting to upload accumulated crash dumps."); |
| for (File minidump : minidumps) { |
| - MinidumpUploadService.tryUploadCrashDump(context, minidump); |
| + tryUploadCrashDump(context, minidump); |
| } |
| } |
| @@ -305,6 +357,11 @@ public class MinidumpUploadService extends IntentService { |
| Log.w(TAG, "Could not rename the file " + minidumpFile.getName() + " for re-upload"); |
| return; |
| } |
| - MinidumpUploadService.tryUploadCrashDump(context, renamedMinidumpFile); |
| + |
| + if (shouldUseJobSchedulerForUploads()) { |
| + scheduleUploadJob(context); |
| + } else { |
| + tryUploadCrashDump(context, renamedMinidumpFile); |
| + } |
| } |
| } |