+ package="io.flutter.plugins.firebase.crashlytics">
-
diff --git a/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/Constants.java b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/Constants.java
new file mode 100644
index 000000000000..dda4dae7127f
--- /dev/null
+++ b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/Constants.java
@@ -0,0 +1,22 @@
+package io.flutter.plugins.firebase.crashlytics;
+
+public class Constants {
+ public static final String EXCEPTION = "exception";
+ public static final String CONTEXT = "context";
+ public static final String INFORMATION = "information";
+ public static final String STACK_TRACE_ELEMENTS = "stackTraceElements";
+ public static final String FLUTTER_ERROR_EXCEPTION = "flutter_error_exception";
+ public static final String FLUTTER_ERROR_REASON = "flutter_error_reason";
+ public static final String MESSAGE = "message";
+ public static final String ENABLED = "enabled";
+ public static final String IDENTIFIER = "identifier";
+ public static final String KEY = "key";
+ public static final String VALUE = "value";
+ public static final String FILE = "file";
+ public static final String LINE = "line";
+ public static final String CLASS = "class";
+ public static final String METHOD = "method";
+ public static final String DID_CRASH_ON_PREVIOUS_EXECUTION = "didCrashOnPreviousExecution";
+ public static final String UNSENT_REPORTS = "unsentReports";
+ public static final String IS_CRASHLYTICS_COLLECTION_ENABLED = "isCrashlyticsCollectionEnabled";
+}
diff --git a/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FirebaseCrashlyticsTestCrash.java b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FirebaseCrashlyticsTestCrash.java
new file mode 100644
index 000000000000..e27311499d27
--- /dev/null
+++ b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FirebaseCrashlyticsTestCrash.java
@@ -0,0 +1,20 @@
+// Copyright 2020 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 io.flutter.plugins.firebase.crashlytics;
+
+import androidx.annotation.Keep;
+
+/**
+ * This class is purely cosmetic - to indicate on the Crashlytics console that it's a
+ * FirebaseCrashlyticsTestCrash error rather than the generic `java.lang.RuntimeException`.
+ *
+ * Name and message match iOS implementation.
+ */
+@Keep
+public class FirebaseCrashlyticsTestCrash extends RuntimeException {
+ FirebaseCrashlyticsTestCrash() {
+ super("This is a test crash caused by calling .crash() in Dart.");
+ }
+}
diff --git a/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterError.java b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterError.java
new file mode 100644
index 000000000000..50e05c5e8e80
--- /dev/null
+++ b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterError.java
@@ -0,0 +1,20 @@
+// Copyright 2020 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 io.flutter.plugins.firebase.crashlytics;
+
+import androidx.annotation.Keep;
+
+/**
+ * This class is purely cosmetic - to indicate on the Crashlytics console that it's a FlutterError
+ * error rather than the generic `java.lang.Exception`.
+ *
+ *
Name matches iOS implementation.
+ */
+@Keep
+public class FlutterError extends Exception {
+ FlutterError(String message) {
+ super(message);
+ }
+}
diff --git a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseAppRegistrar.java
similarity index 91%
rename from packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java
rename to packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseAppRegistrar.java
index ee58745a5430..0f0d33a39a83 100644
--- a/packages/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/firebasecrashlytics/FlutterFirebaseAppRegistrar.java
+++ b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseAppRegistrar.java
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-package io.flutter.plugins.firebase.crashlytics.firebasecrashlytics;
+package io.flutter.plugins.firebase.crashlytics;
import androidx.annotation.Keep;
import com.google.firebase.components.Component;
diff --git a/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseCrashlyticsPlugin.java b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseCrashlyticsPlugin.java
new file mode 100644
index 000000000000..3d479e1c3f6d
--- /dev/null
+++ b/packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseCrashlyticsPlugin.java
@@ -0,0 +1,336 @@
+// Copyright 2019 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 io.flutter.plugins.firebase.crashlytics;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
+import android.util.Log;
+import androidx.annotation.NonNull;
+import com.google.android.gms.tasks.Task;
+import com.google.android.gms.tasks.Tasks;
+import com.google.firebase.FirebaseApp;
+import com.google.firebase.crashlytics.FirebaseCrashlytics;
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.PluginRegistry.Registrar;
+import io.flutter.plugins.firebase.core.FlutterFirebasePlugin;
+import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/** FlutterFirebaseCrashlyticsPlugin */
+public class FlutterFirebaseCrashlyticsPlugin
+ implements FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler {
+ public static final String TAG = "FLTFirebaseCrashlytics";
+ private MethodChannel channel;
+
+ /** Plugin registration. */
+ public static void registerWith(Registrar registrar) {
+ FlutterFirebaseCrashlyticsPlugin instance = new FlutterFirebaseCrashlyticsPlugin();
+ instance.initInstance(registrar.messenger());
+ }
+
+ private void initInstance(BinaryMessenger messenger) {
+ String channelName = "plugins.flutter.io/firebase_crashlytics";
+ channel = new MethodChannel(messenger, channelName);
+ channel.setMethodCallHandler(this);
+ FlutterFirebasePluginRegistry.registerPlugin(channelName, this);
+ }
+
+ @Override
+ public void onAttachedToEngine(FlutterPluginBinding binding) {
+ initInstance(binding.getBinaryMessenger());
+ }
+
+ @Override
+ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
+ if (channel != null) {
+ channel.setMethodCallHandler(null);
+ channel = null;
+ }
+ }
+
+ private Task