-->

How to disable Crashlytics Answers?

2019-01-25 10:32发布

问题:

Disabling Crashlytics error reporting is relatively straight forward.. I'd also like to disable Answers for debug builds. However,

new Crashlytics.Builder().answers(null);

doesn't work since apparently answers can't be null and

new Crashlytics.Builder().answers(new CustomAnswers());

with CustomAnswers being my class extending Answers gets me a NPE when calling Answers.getInstance(). But that approach is cumbersome to begin with compared to simply calling some enable() method.

Any ideas?

On a side note, I really hope Fabric is going to update and improve their docs soon.

回答1:

on my app we do it the old fashioned way:

if (!IS_DEBUG) {
   Fabric.with(this, new Crashlytics());
}

works fine.

Of course you can initialise with whichever custom parameters you need.

edit:

to get the debug boolean is just a matter of using gradle to your favour:

src/
   main/ // your app code
   debug/
       AppSettings.Java:
            public static final boolean IS_DEBUG = true;
   release/
       AppSettings.Java:
            public static final boolean IS_DEBUG = false;

edit:

I would advise against using BuildConfig.DEBUG, see this article: http://www.digipom.com/be-careful-with-buildconfig-debug/



回答2:

For the time being, I solved the problem the old Java way:

Extend Answers using a sort-of singleton:

public class CustomAnswers extends Answers {

    private static CustomAnswers instance;

    private boolean mEnabled;

    private CustomAnswers(boolean enabled) {
        super();
        mEnabled = enabled;
    }

    public static synchronized void init(boolean enabled) {
        if (instance == null) {
            instance = new CustomAnswers(enabled);
        }
    }

    public static synchronized CustomAnswers get() {
        return instance;
    }

    @Override
    public void logSignUp(SignUpEvent event) {
        if (mEnabled) {
            super.logSignUp(event);
        }
    }

    // (...)
}

Initialize Crashlytics with Answers implementation:

boolean isDebug = DebugHelper.isDebugVersion(this);
CustomAnswers.init(!isDebug);
CrashlyticsCore crashlyticsCore =
        new CrashlyticsCore.Builder().disabled(isDebug).build();
Fabric.with(this, new Crashlytics.Builder()
        .core(crashlyticsCore).answers(CustomAnswers.get()).build());

Use Answers implementation for events:

CustomAnswers.get().logInvite(new InviteEvent());

This will disable events being logged.

Note that, as described in my first post, Answers.getInstance() will return null and not your CustomAnswers instance in that case.



回答3:

Try this code

 CrashlyticsCore core = new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(core).build());

or

Fabric.with(this, new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build());