运行测试时如何禁用Fabric

运行测试时,如何禁用Fabric:Crashlytics和Answer?

有没有其他的方式来在测试期间禁用Crashlytics,而不是在每次测试之前放置这些代码?

@LargeTest @RunWith(AndroidJUnit4::class) class AcceptanceTest { @Before fun setUp() { val crashlyticsKit = Crashlytics.Builder() .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()) .build() Fabric.with(InstrumentationRegistry.getContext(), crashlyticsKit) } } 

并避免把像IS_TEST_MODE一样的全局布尔值

我发现一个更好,更干净的方法来禁用和管理Fabric。

在我的应用程序中,我使用slf4j-api ,这是一个在web开发中使用很多的日志API。 有了这个API,你可以创建appender,所以我决定创建一个Fabric Appender,只有在应用程序运行时才使用这个appender。

如何

Logback安装Logback

设置你的build.gradle

 dependencies { ... // Log compile 'com.github.tony19:logback-android-core:1.1.1-6' compile 'com.github.tony19:logback-android-classic:1.1.1-6' compile 'org.slf4j:slf4j-api:1.7.21' } 

添加src/main/assets/logback.xml

 <configuration> <appender name="FABRIC" class="path/to/your/FabricAppender" /> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="LOGCAT" /> <appender-ref ref="FABRIC" /> </root> 

默认情况下Logback有一个自定义appender与Logback工作。 您可以评论我们将在稍后解释的FABRIC部分。

添加src/androidTest/assets/logback.xml

 <configuration> <appender name="LOGCAT" class="ch.qos.logback.classic.android.LogcatAppender"> <tagEncoder> <pattern>%logger{0}</pattern> </tagEncoder> <encoder> <pattern>[PUP] %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="LOGCAT" /> </root> </configuration> 

你不想在这里有织物appender! 因为你希望你的仪表测试只能用Logcat运行

使用Logback

现在,您可以使用下面的slf4j的强大API轻松登录

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) log.info("Activity start") // ... } } 

Logback设置结构

在您的项目FabricAppender.kt创建

 package your.package.log import android.content.Context import ch.qos.logback.classic.Level import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.classic.spi.ThrowableProxy import ch.qos.logback.core.UnsynchronizedAppenderBase import com.crashlytics.android.Crashlytics import com.crashlytics.android.answers.Answers import com.crashlytics.android.answers.CustomEvent import io.fabric.sdk.android.Fabric class FabricAppender : UnsynchronizedAppenderBase<ILoggingEvent>() { companion object { private var isFabricInit = false fun init(context: Context) { Fabric.with(context, Crashlytics(), Answers()) isFabricInit = true } } override fun append(event: ILoggingEvent) { if (isFabricInit.not()) return when (event.level.levelInt) { Level.ERROR_INT -> { val throwable = (event.throwableProxy as ThrowableProxy).throwable if (throwable != null) { Crashlytics.logException(throwable) } else { Crashlytics.log(event.message.replace(": {}", "")) } } } } } 

每次你调用log.error("Something wrong happen!!")这个appender都会发送异常给Crashlytics 。 正如你所看到的,你可以完全自定义appender。

在应用程序启动时启动appender

 class MainActivity : AppCompatActivity() { private val log = LoggerFactory.getLogger(javaClass)!! // Call your logger in each class with this line override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) FabricAppender.init(this) // Init before the first log log.info("Activity start") // ... } } 

最后

现在,您的结构将通过使用slf4j API完全隔离到您的代码,并且在您的仪表化测试yataaa期间将不会使用! 你可以在互联网上找到其他appender(发送到ELK,文件等)

使用口味。

默认情况下,你有一种叫做main味道,你应该把所有的代码,资产和清单放在开发,测试和生产中使用。 您可以通过在您的模块的build.gradle文件中的buildTypes { ... }下添加您的风味名称,轻松地创建新的风味。 这使您可以拆分依赖关系,并轻松删除任何您不希望甚至在发布版本中都需要的东西。 你可以在这里阅读更多关于味道。 通过这种方式,您将能够分离出主要风格的核心代码,并仅在发布版本中添加crashlytics。

例如,在你的主要风格:

 open class BaseApplication : Application() { fun onCreate() { [common code between flavors] } } 

然后在你的释放风味

 open class MainApplication : BaseApplication() { fun onCreate() { [initialize crashlytics] } } 

在你的其他口味

 open class MainApplication : BaseApplication() 

注意:在清单中使用MainApplication而不是BaseApplication