diff options
author | Sagar Dhawan <sdhawan@codeaurora.org> | 2015-04-21 17:59:28 -0700 |
---|---|---|
committer | jrizzoli <joey@cyanogenmoditalia.it> | 2015-08-28 13:15:44 +0200 |
commit | c0e1d433f8e15511dccb14e44e6517040fd9e86a (patch) | |
tree | 6e2c445fd1698b1c00ee3ea0a3ee76a17cc9ba5d /src | |
parent | d0f60407c935d5ab2aa3cb7ad67a4525aa84a0ed (diff) | |
download | android_packages_apps_Gello-c0e1d433f8e15511dccb14e44e6517040fd9e86a.tar.gz android_packages_apps_Gello-c0e1d433f8e15511dccb14e44e6517040fd9e86a.tar.bz2 android_packages_apps_Gello-c0e1d433f8e15511dccb14e44e6517040fd9e86a.zip |
Enable native crash logging
Add functionality to upload native crash reports
generated by Breakpad.
Change-Id: I42d82484582e5097e14f54ac304178049e8b942e
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/browser/CrashLogExceptionHandler.java | 80 |
1 files changed, 79 insertions, 1 deletions
diff --git a/src/com/android/browser/CrashLogExceptionHandler.java b/src/com/android/browser/CrashLogExceptionHandler.java index c27a7fd5..09f64e8f 100644 --- a/src/com/android/browser/CrashLogExceptionHandler.java +++ b/src/com/android/browser/CrashLogExceptionHandler.java @@ -37,6 +37,8 @@ import android.os.Build.VERSION; import android.os.SystemClock; import android.net.http.AndroidHttpClient; import android.util.Log; +import android.os.FileObserver; +import android.os.Handler; import org.codeaurora.swe.BrowserCommandLine; @@ -45,6 +47,9 @@ import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.entity.InputStreamEntity; +import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONObject; @@ -68,6 +73,7 @@ public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler private static final String CRASH_LOG_FILE = "crash.log"; private static final String CRASH_LOG_SERVER_CMD = "crash-log-server"; private static final String CRASH_LOG_MAX_FILE_SIZE_CMD = "crash-log-max-file-size"; + private static final String CRASH_REPORT_DIR = "Crash Reports"; private final static String LOGTAG = "CrashLog"; @@ -80,10 +86,17 @@ public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler private boolean mOverrideHandler = false; private int mMaxLogFileSize = 1024 * 1024; + // To avoid increasing startup time an upload delay is used + private static final int UPLOAD_DELAY = 3000; + + private static FileObserver crashObserver; + + private final Handler mCrashReportHandler = new Handler(); public CrashLogExceptionHandler(Context ctx) { mAppContext = ctx; if (BrowserCommandLine.hasSwitch(CRASH_LOG_SERVER_CMD)) { + initNativeReporter(ctx); mLogServer = BrowserCommandLine.getSwitchValue(CRASH_LOG_SERVER_CMD); if (mLogServer != null) { uploadPastCrashLog(); @@ -103,6 +116,33 @@ public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler } + private void initNativeReporter(Context ctx){ + final File crashReports = new File(ctx.getCacheDir(),CRASH_REPORT_DIR); + // On fresh installs, make the directory before registering an observer + if (!crashReports.isDirectory()) { + crashReports.mkdir(); + } + // Implement FileObserver for crashReports that don't bring the system down + crashObserver = new FileObserver(crashReports.getAbsolutePath()) { + @Override + public void onEvent(int event, String path){ + if ((event == FileObserver.CREATE) || (event == FileObserver.MOVED_TO)){ + Log.w(LOGTAG, "A crash report was generated"); + checkNativeCrash(crashReports); + } + } + }; + // Native Crash reporting if commandline is set + mCrashReportHandler.postDelayed(new Runnable() { + @Override + public void run() { + checkNativeCrash(crashReports); + } + }, UPLOAD_DELAY); + // start watching the crash reports folder + crashObserver.startWatching(); + } + private void saveCrashLog(String crashLog) { // Check if log file exists and it's current size try { @@ -154,7 +194,7 @@ public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler crashLog.append("\n").append(line); } - uploadCrashLog(crashLog.toString(), 3000); + uploadCrashLog(crashLog.toString(), UPLOAD_DELAY); } catch(FileNotFoundException fnfe) { Log.v(LOGTAG,"No previous crash found"); } catch(IOException ioe) { @@ -281,4 +321,42 @@ public class CrashLogExceptionHandler implements Thread.UncaughtExceptionHandler return value; } + private void checkNativeCrash(final File crashReportsDir) { + // Search cache/Crash Reports/ for any crashes + if (crashReportsDir.exists()) { + new Thread(new Runnable() { + @Override + public void run() { + for (File f : crashReportsDir.listFiles()) { + uploadNativeCrashReport(f); + } + } + }).start(); + } + } + + private void uploadNativeCrashReport(final File report) { + Log.w(LOGTAG, "Preparing Crash Report for upload " + report.getName()); + // get server url from commandline + String server = BrowserCommandLine.getSwitchValue(CRASH_LOG_SERVER_CMD); + try { + HttpClient httpClient = new DefaultHttpClient(); + HttpPost httpPost = new HttpPost(server); + InputStreamEntity isEntity = new InputStreamEntity( + new FileInputStream(report), -1); + // Send the report as a Binary + isEntity.setContentType("binary/octet-stream"); + isEntity.setChunked(false); + httpPost.setEntity(isEntity); + HttpResponse response = httpClient.execute(httpPost); + int status = response.getStatusLine().getStatusCode(); + if (status == 200) + report.delete(); + else Log.w(LOGTAG, "Upload Failure. Will try again next time- " + status); + + } catch (Exception e) { + Log.w(LOGTAG, "Crash Report failed to upload, will try again next time " + e); + } + } + } |