禁用“答案”但不禁用“Crashlytics”

Posted

技术标签:

【中文标题】禁用“答案”但不禁用“Crashlytics”【英文标题】:Disable "Answers" but not "Crashlytics" 【发布时间】:2016-03-15 15:38:48 【问题描述】:

在我的 android 应用中安装“Crashlytics”时,它会自动安装“Answers”。我只想安装“Crashlytics”并希望禁用“答案”。有人知道怎么做吗?

build.gradle

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

谢谢!

【问题讨论】:

在 android studio 或您的应用程序中禁用答案? 【参考方案1】:

来自 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());

这将只初始化崩溃报告方面的事情。

【讨论】:

这似乎不起作用,可能是因为 Crashlytics.Builder.build() 在内部创建了一个 Answers 对象,即使它没有传递给构建器。 Crashlytics SDK 2.6.4. Answers 在使用上面的 sn-p 时仍然启用。我基本上使用了上面相同的代码,会话仍然显示在 Fabrio.io Web 界面中。然后我查看了 Crashlytics.Builder.build() 的代码,很明显 sn-p 将使 Answers 仍处于启用状态。 是的,我尝试了该解决方案,并且想知道 Web 界面是否显示非崩溃数据。然后我检查了logcat,它说D/Answers: Analytics collection enabled。你是对的@Xargs,这个答案在当前的sdk(Crashlytics 2.8.0)中不起作用。 您根本不应该构建 Crashlytics。并使用 CrashlyticsCore.getInstance() 访问所有崩溃报告方法。【参考方案2】:

我认为目前不可能,因为 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) 不是公开的,所以我们无法实例化。答案字段也是最终的,因此您不能覆盖它。我认为现在有办法让用户决定是否要使用答案。

Hey Fabric/Google,您应该以编程方式选择退出会话,让程序员可以选择让用户决定是否要以某种方式计算他们。

编辑

我的解决方案是为所有需要的功能和初始化使用包装器,请随意使用它:

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 块中,根据您应用中的用户设置检查布尔标志。 正是我在做什么。编辑了我的答案,这是一种处理 optOut 场景的干净方法。可悲的是,面料没有“optOut”或dryRun功能。 是的,没错,我们目前没有 optOut 功能,但我会让团队知道您希望将其作为选项添加。我们从其他人那里听说,包装逻辑对他们最有帮助,因为他们可以完全按照自己的意愿实现它,但很高兴知道您想要 SDK 中的一个选项。 不幸的是,这并不能解决当用户选择退出时可能希望允许崩溃报告但不允许分析跟踪的问题。 @MikeBonnell 我目前看到的唯一方法是扩展 Answers 和 Beta 并用 NOOP 覆盖所有方法。我可以将这些空类放入 Crashlytics Builder

以上是关于禁用“答案”但不禁用“Crashlytics”的主要内容,如果未能解决你的问题,请参考以下文章

如何完全禁用 FirebaseAnalytics 或 Crashlytics [重复]

新的 Firebase Crashlytics 在调试模式下禁用

如何在运行时禁用 Crashlytics for iOS?

当用户更改首选项时如何在运行时禁用 Crashlytics/Fabric

在 iOS 运行时禁用 crashlytics/Fabric

在 iOS 应用程序运行时启用/禁用 Crashlytics