禁用 "Answers" 但不禁用 "Crashlytics"
Disable "Answers" but not "Crashlytics"
在我的 Android 应用程序中安装 "Crashlytics" 时,它会自动安装 "Answers"。我只想安装 "Crashlytics" 并想禁用 "Answers"。有人知道怎么做吗?
build.gradle
dependencies {
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
transitive = true;
}
谢谢!
来自 Fabric 和 Crashlytics 的 Mike。
如您所见,Crashlytics 默认包含 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 正在创建一个 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) 不是 public,所以我们无法实例化它。此外,答案字段是最终的,因此您不能覆盖它。我认为现在有办法让用户决定是否要使用答案。
嘿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);
}
}
}
在我的 Android 应用程序中安装 "Crashlytics" 时,它会自动安装 "Answers"。我只想安装 "Crashlytics" 并想禁用 "Answers"。有人知道怎么做吗?
build.gradle
dependencies {
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
transitive = true;
}
谢谢!
来自 Fabric 和 Crashlytics 的 Mike。
如您所见,Crashlytics 默认包含 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 正在创建一个 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) 不是 public,所以我们无法实例化它。此外,答案字段是最终的,因此您不能覆盖它。我认为现在有办法让用户决定是否要使用答案。
嘿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);
}
}
}