Отключить "Ответы", но не "Crashlytics"

При установке "Crashlytics" в моем приложении для Android автоматически устанавливаются "Ответы". Я только хочу установить "Crashlytics" и хочу отключить "Ответы". Кто-нибудь знает как это сделать?

build.gradle

dependencies {
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
    transitive = true;
}

Спасибо!

2 ответа

Решение

Майк из ткани и Crashlytics здесь.

Как вы видели, Crashlytics по умолчанию включает в себя ответы. Если вы не хотите, чтобы ответы были включены в вашем приложении, то вы хотите вызвать CrashlyticsCore() при создании приложения вместо Crashlytics,

Например, используйте их в качестве импорта:

import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import io.fabric.sdk.android.Fabric;

Затем, когда вы инициализируете Fabric, используйте:

Fabric.with(this, new CrashlyticsCore());

и это будет инициализировать только сторону сообщения о сбоях.

Я думаю, что в настоящий момент это невозможно, потому что Crashlytics создает экземпляр ответов:

public Crashlytics build() {
            if(this.coreBuilder != null) {
                if(this.core != null) {
                    throw new IllegalStateException("Must not use Deprecated methods delay(), disabled(), listener(), pinningInfoProvider() with core()");
                }

                this.core = this.coreBuilder.build();
            }

            if(this.answers == null) {
                this.answers = new Answers();
            }

            if(this.beta == null) {
                this.beta = new Beta();
            }

            if(this.core == null) {
                this.core = new CrashlyticsCore();
            }

            return new Crashlytics(this.answers, this.beta, this.core);
        }

Crashlytics (ответы на вопросы, бета-бета, ядро ​​CrashlyticsCore) не является общедоступным, поэтому мы не можем это установить. Также поле ответов является окончательным, поэтому вы не можете переопределить его. Я думаю, что теперь есть способ позволить пользователям решать, хотят ли они использовать ответы.

Привет, Fabric / Google, вы должны сделать программный способ отказаться от сеанса, чтобы дать программисту возможность позволить пользователю решать, хотят ли они каким-либо образом считаться.

РЕДАКТИРОВАТЬ

Мое решение состоит в том, чтобы использовать обертку для всех необходимых функций и init, не стесняйтесь использовать ее:

public class AnalyticsWrapper {

    static AnalyticsWrapper instance;

    public static void initialize(Context context, boolean optOut) {
        if (instance != null) throw new IllegalStateException("AnalyticsWrapper must only be initialized once");
        instance = new AnalyticsWrapper(context.getApplicationContext(), optOut);
    }

    public static AnalyticsWrapper getInstance() {
        if (instance == null) throw new IllegalStateException("AnalyticsWrapper must be initialized before");
        return instance;
    }

    final boolean optOut;

    private AnalyticsWrapper(Context context, boolean optOut) {
        this.optOut = optOut;
        initFabric(context);
    }

    public boolean isOptOut() {
        return optOut;
    }

    private void initFabric(Context context) {
        if (!optOut) {

            if (!BuildConfig.DEBUG) {
                Timber.plant(new CrashlyticsLogExceptionTree());
                Timber.plant(new CrashlyticsLogTree(Log.INFO));
            }

            Crashlytics crashlyticsKit = new Crashlytics.Builder().core(
                    new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG)
                                                 .build())
                                                                  .build();

            Fabric fabric = new Fabric.Builder(context).kits(crashlyticsKit)
                                                             .debuggable(BuildConfig.DEBUG)
                                                             .build();


            Fabric.with(fabric);
        }
    }

    public void crashlyticsSetString(String key, String value) {
        if (!optOut) {
            Crashlytics.setString(key, value);
        }
    }

    public void logException(Throwable throwable) {
        if (!optOut) {
            Crashlytics.logException(throwable);
        }
    }

    public void logEvent(CustomEvent event) {
        if (!optOut) {
            Answers.getInstance()
                   .logCustom(event);
        }
    }
}
Другие вопросы по тегам