// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.crash; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.FileObserver; import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.PathUtils; import org.chromium.base.metrics.RecordUserAction; import java.io.File; /** * The FileObserver to monitor the minidump directory. */ public class MinidumpDirectoryObserver extends FileObserver { private static final String TAG = "MinidumpDirObserver"; public MinidumpDirectoryObserver() { // The file observer detects MOVED_TO for child processes. super(new File(PathUtils.getCacheDirectory(), CrashFileManager.CRASH_DUMP_DIR).toString(), FileObserver.MOVED_TO); } /** * When a minidump is detected, upload it to Google crash server */ @Override public void onEvent(int event, String path) { // This is executed on a thread dedicated to FileObserver. if (CrashFileManager.isMinidumpMIMEFirstTry(path)) { Context appContext = ContextUtils.getApplicationContext(); try { Intent intent = MinidumpUploadService.createFindAndUploadLastCrashIntent(appContext); appContext.startService(intent); Log.i(TAG, "Detects a new minidump %s send intent to MinidumpUploadService", path); RecordUserAction.record("MobileBreakpadUploadAttempt"); } catch (SecurityException e) { // For KitKat and below, there was a framework bug which cause us to not be able to // find our own crash uploading service. Ignore a SecurityException here on older // OS versions since the crash will eventually get uploaded on next start. // crbug/542533 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { throw e; } } } } }