[Huawei Developers] devwithzachary:
Today we are going to take a look at how we can integrate the AppGallery Connect crash service into your Xamarin app.

But why might you want to do this? The AppGallery Connect Crash service provides a powerful yet lightweight solution to app crash problems. With the service, you can quickly detect, locate, and resolve app crashes (unexpected exits of apps), and have access to highly readable crash reports in real-time, without the need to write any code.

The service is completely free to use and can be a great addition to your project!

Below is a simple app example you can follow along with to get a good idea of how you might use this service in your own app!

Preparing the Xamarin Environment and Configuring Your Project​

Install the Xamarin environment.

You’ll need to install Visual Studio first, and then select Mobile development with .NET in Visual Studio to install the Xamarin environment.

Create a project in AppGallery Connect and enable HUAWEI Analytics for your project.

Install the service SDK. Right-click your project and choose Manage NuGet Packages

Search for crash on the Browse tab. Click Xamarin.Android bindings for HMS Core — AgconnectCrash in the search results and install it.

Add the JSON file to the Assets directory

Next, implement LazyInputStream to read the agconnect-services.json file.

For details, please refer to Getting Started with Xamarin

Finally set a package name in Android Manifest.

Example Application​

Lets start by creating a simple layout that has three buttons.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">

<LinearLayout
android:layout_width="300dp"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">

<Button
android:id="@+id/btn_crash"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="MakeCrash" />

<Button
android:id="@+id/btnRecordException"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="CatchException" />

<Button
android:id="@+id/btnCustomReport"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="CustomReport" />

</LinearLayout>
</LinearLayout>

In the MainActivity.cs file, call * AGConnectCrash.Instance.TestIt* to trigger a crash, call AGConnectCrash.Instance.SetUserId to set a custom user ID, call AGConnectCrash.Instance.SetCustomKey to set the key and value for a custom key-value pair, call AGConnectCrash.Instance.Log to set the log level, and call AGConnectCrash.Instance.RecordException to record a non-fatal exception.

private void BtnCreateCrash_Click(object sender, EventArgs e) {
AGConnectCrash.Instance.TestIt(this);
}

private void BtnCustomReport_Click(object sender, EventArgs e) {
AGConnectCrash.Instance.SetUserId("testuser");
AGConnectCrash.Instance.SetCustomKey("doublekey", "1.1");
AGConnectCrash.Instance.SetCustomKey("floatkey", "1.12f");
AGConnectCrash.Instance.SetCustomKey("intkey", "123");
AGConnectCrash.Instance.SetCustomKey("stringkey", "hello world");
AGConnectCrash.Instance.Log("default log level");
AGConnectCrash.Instance.Log(3, "3 is debug log level");

}

private void BtnRecordException_Click(object sender, EventArgs e) {
try {
ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException = new ArrayIndexOutOfBoundsException();
throw arrayIndexOutOfBoundsException;
} catch (Java.Lang.Exception ex) {
AGConnectCrash.Instance.RecordException(ex);
}
}

View the Crash Report​

Tap MakeCrash, CatchException, and CustomReport in sequence, and check the report in AppGallery Connect.

Crash statistics:

Exceptions:

Debugging:

View custom key-value pairs:

View custom log level:

View custom user IDs:

For more information, please refer to:

Crash document for Android

Codelab of Crash for Xamarin.Android