Use a feature flag to decide whether logs should be printed to logcat or not

This is done so it can be temporarily enabled on release builds for quick debugging sessions, then disabled again.
This commit is contained in:
Jorge Martín 2025-03-13 16:11:21 +01:00
parent 842357d7f7
commit cb5dcf9b79
3 changed files with 16 additions and 1 deletions

View file

@ -16,6 +16,7 @@ import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.matrix.api.tracing.TracingService import io.element.android.libraries.matrix.api.tracing.TracingService
import io.element.android.libraries.preferences.api.store.AppPreferencesStore import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.analytics.api.AnalyticsService
@ -40,5 +41,7 @@ interface AppBindings {
fun enterpriseService(): EnterpriseService fun enterpriseService(): EnterpriseService
fun featureFlagService(): FeatureFlagService
fun buildMeta(): BuildMeta fun buildMeta(): BuildMeta
} }

View file

@ -12,6 +12,7 @@ import android.system.Os
import androidx.startup.Initializer import androidx.startup.Initializer
import io.element.android.features.rageshake.api.reporter.BugReporter import io.element.android.features.rageshake.api.reporter.BugReporter
import io.element.android.libraries.architecture.bindings import io.element.android.libraries.architecture.bindings
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.tracing.TracingConfiguration import io.element.android.libraries.matrix.api.tracing.TracingConfiguration
import io.element.android.libraries.matrix.api.tracing.WriteToFilesConfiguration import io.element.android.libraries.matrix.api.tracing.WriteToFilesConfiguration
import io.element.android.x.di.AppBindings import io.element.android.x.di.AppBindings
@ -28,9 +29,10 @@ class TracingInitializer : Initializer<Unit> {
val bugReporter = appBindings.bugReporter() val bugReporter = appBindings.bugReporter()
Timber.plant(tracingService.createTimberTree(ELEMENT_X_TARGET)) Timber.plant(tracingService.createTimberTree(ELEMENT_X_TARGET))
val preferencesStore = appBindings.preferencesStore() val preferencesStore = appBindings.preferencesStore()
val featureFlagService = appBindings.featureFlagService()
val logLevel = runBlocking { preferencesStore.getTracingLogLevelFlow().first() } val logLevel = runBlocking { preferencesStore.getTracingLogLevelFlow().first() }
val tracingConfiguration = TracingConfiguration( val tracingConfiguration = TracingConfiguration(
writesToLogcat = true, writesToLogcat = runBlocking { featureFlagService.isFeatureEnabled(FeatureFlags.PrintLogsToLogcat) },
writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter), writesToFilesConfiguration = defaultWriteToDiskConfiguration(bugReporter),
logLevel = logLevel, logLevel = logLevel,
extraTargets = listOf(ELEMENT_X_TARGET), extraTargets = listOf(ELEMENT_X_TARGET),

View file

@ -168,4 +168,14 @@ enum class FeatureFlags(
defaultValue = { true }, defaultValue = { true },
isFinished = false, isFinished = false,
), ),
PrintLogsToLogcat(
key = "feature.print_logs_to_logcat",
title = "Print logs to logcat",
description = "Print logs to logcat in addition to log files. Requires an app restart to take effect." +
"\n\nWARNING: this will make the logs visible in the device logs and may affect performance. " +
"It's not intended for daily usage in release builds.",
defaultValue = { buildMeta -> buildMeta.buildType != BuildType.RELEASE },
// False so it's displayed in the developer options screen
isFinished = false,
)
} }