From 37c973d0c9d78bdc4d1863cc8b2796911b677ee2 Mon Sep 17 00:00:00 2001 From: Pritesh Nandgaonkar Date: Mon, 26 Nov 2018 03:41:17 -0800 Subject: [PATCH] Crash reporting plugin android (#328) Summary: This PR adds the barebone of a crash reporting plugin in android. Since there is no easy way to stack the PR's in git, creating a new PR, but this depends on the [iOS PR](https://github.com/facebook/flipper/pull/322) Pull Request resolved: https://github.com/facebook/flipper/pull/328 Reviewed By: jknoxville, passy Differential Revision: D13137447 Pulled By: priteshrnandgaonkar fbshipit-source-id: 3b86cebbb1ea01601405dd7ba58e1caa2b506065 --- .../sample/FlipperSampleApplication.java | 4 +- .../flipper/sample/RootComponentSpec.java | 2 +- .../crashreporter/CrashReporterPlugin.java | 77 +++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java b/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java index fca9fa714..e18520fbb 100644 --- a/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java +++ b/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. @@ -12,6 +12,7 @@ import android.content.Context; import android.support.annotation.Nullable; import com.facebook.flipper.android.AndroidFlipperClient; import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; import com.facebook.flipper.plugins.example.ExampleFlipperPlugin; import com.facebook.flipper.plugins.inspector.DescriptorMapping; import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; @@ -64,6 +65,7 @@ public class FlipperSampleApplication extends Application { new SharedPreferencesDescriptor("other_sample", Context.MODE_PRIVATE)))); client.addPlugin(new LeakCanaryFlipperPlugin()); client.addPlugin(new ExampleFlipperPlugin()); + client.addPlugin(new CrashReporterPlugin()); client.start(); getSharedPreferences("sample", Context.MODE_PRIVATE).edit().putString("Hello", "world").apply(); diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java b/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java index 1b1212434..c6a738fbc 100644 --- a/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java +++ b/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. diff --git a/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java new file mode 100644 index 000000000..8ef0ab3d1 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) Facebook, Inc. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + * + */ +package com.facebook.flipper.plugins.crashreporter; + +import android.app.Activity; +import android.support.annotation.Nullable; +import com.facebook.flipper.core.FlipperConnection; +import com.facebook.flipper.core.FlipperObject; +import com.facebook.flipper.core.FlipperPlugin; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class CrashReporterPlugin implements FlipperPlugin { + public static final String ID = "CrashReporter"; + + @Nullable private Activity mActivity; + + @Nullable private FlipperConnection mConnection; + + @Nullable private Thread.UncaughtExceptionHandler prevHandler; + + /* + * Activity to be used to display incoming messages + */ + public void setActivity(Activity activity) { + mActivity = activity; + } + + @Override + public void onConnect(FlipperConnection connection) { + mConnection = connection; + prevHandler = Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler( + new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread paramThread, Throwable paramThrowable) { + if (mConnection != null) { + FlipperConnection connection = mConnection; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + paramThrowable.printStackTrace(pw); + connection.send( + "crash-report", + new FlipperObject.Builder() + .put("callstack", sw.toString()) + .put("cause", paramThrowable.toString()) + .put("reason", paramThrowable.toString()) + .build()); + } + if (prevHandler != null) { + prevHandler.uncaughtException(paramThread, paramThrowable); + } + } + }); + } + + @Override + public void onDisconnect() { + mConnection = null; + Thread.setDefaultUncaughtExceptionHandler(prevHandler); + } + + @Override + public boolean runInBackground() { + return true; + } + + @Override + public String getId() { + return ID; + } +}