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
This commit is contained in:
Pritesh Nandgaonkar
2018-11-26 03:41:17 -08:00
committed by Facebook Github Bot
parent d475a50f2a
commit 37c973d0c9
3 changed files with 81 additions and 2 deletions

View File

@@ -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();

View File

@@ -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.

View File

@@ -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;
}
}