Friday, July 19, 2019

[Android Crashlytics] Get the most out of Firebase Crashlytics. Beyond a crash detector.

Intro



NullPointerException at class abc.java line 20

Crashlytics.logException()

Handle try/catch

try {
  (code)
} catch(Exception e) {
  Crashlytics.logException(e); 
}

Report custom messages

if (response == null) {
  Crashlytics.logException(new Throwable("Response is null - this should have never happened"));
} else if (response.code == 501) {
  Crashlytics.logException(new Throwable("Response code 501 received"));
}  else if (response.code == 502) {
  Crashlytics.logException(new Throwable("Response code 502 received"));
}

Divide one report into separate reports

if (response == null) {
  Crashlytics.logException(new Throwable("Response is null - this should have never happened"));
} else if (response.code == 501) {
  Crashlytics.logException(new Throwable("Response code 501 received"));
}  else if (response.code == 502) {
  Crashlytics.logException(new Throwable("Response code 502 received"));
}
private void handleResponse(Response response) {
 if (response == null) {
   logResonseNull();
 } else if (response.code == 501) {
   logResponse501();
 } else if (response.code == 502) {
   logResponse502();
 }
}private void logResonseNull() {
 Crashlytics.logException(new Throwable("Response is null - this should have never happened"));
}private void logResponse501() {
 Crashlytics.logException(new Throwable("Response code 501 received"));
}private void logResponse502() {
 Crashlytics.logException(new Throwable("Response code 502 received"));
}

Crashlytics.log()

Log current screen

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    logCurrentFragment();
    return super.onCreateView(inflater, container, savedInstanceState);
}private void logCurrentFragment() {
 try {
  // this.getClass().toString() returns following:
  // "class com.joshua.example.DashboardFragment"
  // changing it to:
  // "DashboardFragment"
  String fragmentName = this.getClass().toString();
  if(!TextUtils.isEmpty(fragmentName) && fragmentName.contains("."))
  {
   int indexToDelete = fragmentName.lastIndexOf('.') + 1;
   if(indexToDelete < fragmentName.length())
   fragmentName = fragmentName.substring(indexToDelete);
  }
  PLog.currentController = fragmentName;
  Crashlytics.log("current_fragment: " + fragmentName);
 }catch (Exception e) { }
}

Log event/action

Crashlytics.log("AbcFragment:OnClick_OK()");

Log Activity lifecycle

@Override 
protected void onResume() {
    super.onResume();
    Crashlytics.log("Activity.onResume()");
}

Log Http response

if (error instanceof HttpException) {
 String url = ((HttpException)error).response()
       .raw().request().url().url().toString();
 String code = (HttpException) error).code();
 Crashlytics.logException(new Throwable("url: " + url + " code: " + code));
}

Log user identifier/email

//set
Crashlytics.setUserIdentifier("1234");
Crashlytics.setUserEmail("hello@example.com");// reset
Crashlytics.setUserIdentifier("");
Crashlytics.setUserEmail("");