禁用“Answers”,但不禁用“Crashlytics”

11
在我的Android应用程序中安装“Crashlytics”时,它会自动安装“Answers”。我只想安装“Crashlytics”,并希望禁用“Answers”。有人知道如何做到这一点吗?

enter image description here

build.gradle

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

谢谢!


在Android Studio或您的应用程序中禁用答案? - Bharatesh
2个回答

8

我是来自Fabric和Crashlytics的Mike。

正如您所见,Crashlytics默认包含Answers。如果您不想在应用程序中启用Answers,则需要在构建应用程序时调用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());

这将仅初始化崩溃报告方面的内容。


4
似乎这个不起作用,可能是因为 Crashlytics.Builder.build() 内部会创建一个 Answers 对象,即使没有将其传递给 builder。Crashlytics SDK 2.6.4。 - Xargs
11
使用上述代码段时,“Answers”仍然是可用的。我基本上使用了相同的代码,并且在Fabrio.io网络界面中仍然显示了“sessions”。然后我查看了Crashlytics.Builder.build()的代码,很明显该代码段将使“Answers”仍然可用。 - Xargs
是的,我尝试了那个解决方案,并且对于 Web 界面仍然显示非崩溃数据感到困惑。然后我检查了 logcat,并且它显示“D/Answers: Analytics collection enabled”。你是对的 @Xargs,这个答案在当前的 SDK(Crashlytics 2.8.0)中不起作用。 - Micha
你根本不应该构建Crashlytics。而是使用CrashlyticsCore.getInstance()来访问所有崩溃报告方法。 - Aleksei Potapkin

1

我认为目前不可能,因为Crashlytics正在创建一个Answers实例:

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(Answers answers,Beta beta,CrashlyticsCore core)不是公共的,因此我们无法实例化它。同时,answers字段是final的,所以您不能覆盖它。我认为现在没有办法让用户决定是否要使用answers。

嘿,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);
        }
    }
}

嗯,我测试了之前的解决方案,它正常工作。你在测试中具体遇到了什么问题?如果你想让最终用户决定是否选择加入Answers,我建议将Fabric init包装在一个if块中,检查基于应用程序中用户设置的布尔标志。 - Mike Bonnell
我正在做的正是这个。编辑了我的答案,这是一个处理“退出选择”场景的干净方法。可惜的是,fabric没有“optOut”或dryRun功能。 - Mate
是的,没错,目前我们没有optOut功能,但我会让团队知道您希望将其添加为选项。我们听到其他人说包装逻辑对他们非常有帮助,因为这样他们可以按照自己的意愿实现它,但很高兴知道您希望在SDK中提供一个选项。 - Mike Bonnell
不幸的是,这并不能解决这样一个问题,即在用户选择退出时,有人可能希望允许崩溃报告,但不允许分析跟踪。 - Micha
@MikeBonnell 目前我所看到的唯一方法是扩展Answers和Beta,并覆盖所有方法为NOOP。我可以将这些空类放入Crashlytics Builder中。 - DSchmidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接