Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import io.embrace.android.embracesdk.internal.arch.datasource.NoInputValidation
import io.embrace.android.embracesdk.internal.arch.destination.LogWriter
import io.embrace.android.embracesdk.internal.arch.limits.UpToLimitStrategy
import io.embrace.android.embracesdk.internal.arch.schema.SchemaType.AeiLog
import io.embrace.android.embracesdk.internal.config.behavior.AppExitInfoBehavior
import io.embrace.android.embracesdk.internal.config.ConfigService
import io.embrace.android.embracesdk.internal.logging.EmbLogger
import io.embrace.android.embracesdk.internal.logging.InternalErrorType
import io.embrace.android.embracesdk.internal.payload.AppExitInfoData
Expand All @@ -23,7 +23,7 @@ import io.embrace.android.embracesdk.internal.worker.BackgroundWorker
@RequiresApi(VERSION_CODES.R)
internal class AeiDataSourceImpl(
private val backgroundWorker: BackgroundWorker,
private val appExitInfoBehavior: AppExitInfoBehavior,
private val configService: ConfigService,
private val activityManager: ActivityManager,
private val preferencesService: PreferencesService,
logWriter: LogWriter,
Expand All @@ -50,7 +50,7 @@ internal class AeiDataSourceImpl(
}

private fun processAeiRecords() {
val maxNum = appExitInfoBehavior.appExitInfoMaxNum()
val maxNum = configService.appExitInfoBehavior.appExitInfoMaxNum()
val records = activityManager.getHistoricalProcessExitReasons(null, 0, maxNum).take(SDK_AEI_SEND_LIMIT)
val deliveredIds = preferencesService.deliveredAeiIds

Expand All @@ -60,7 +60,7 @@ internal class AeiDataSourceImpl(
preferencesService.deliveredAeiIds = sentRecords.map { it.getAeiId() }.toSet()

unsentRecords.forEach {
val obj = it.constructAeiObject(versionChecker, appExitInfoBehavior.getTraceMaxLimit())
val obj = it.constructAeiObject(versionChecker, configService.appExitInfoBehavior.getTraceMaxLimit())
val crashNumber = obj?.getOrdinal(preferencesService::incrementAndGetCrashNumber)
val aeiNumber = obj?.getOrdinal(preferencesService::incrementAndGetAeiCrashNumber)
if (obj == null) {
Expand All @@ -69,10 +69,13 @@ internal class AeiDataSourceImpl(
captureData(
inputValidation = NoInputValidation,
captureAction = {
val schemaType = AeiLog(obj, crashNumber, aeiNumber)
addLog(schemaType, INFO.toOtelSeverity(), obj.trace ?: "")
val capture = configService.autoDataCaptureBehavior.isNativeCrashCaptureEnabled() || !obj.hasNativeTombstone()
if (capture) {
val schemaType = AeiLog(obj, crashNumber, aeiNumber)
addLog(schemaType, INFO.toOtelSeverity(), obj.trace ?: "")
}

// count AEI as delivered once submitted to the OTel logging system
// always count AEI as delivered once we process it & submit to the OTel logging system, or discard
preferencesService.deliveredAeiIds = preferencesService.deliveredAeiIds.plus(obj.getAeiId())
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ internal class FeatureModuleImpl(
if (BuildVersionChecker.isAtLeast(Build.VERSION_CODES.R) && activityManager != null) {
AeiDataSourceImpl(
workerThreadModule.backgroundWorker(Worker.Background.NonIoRegWorker),
configService.appExitInfoBehavior,
configService,
activityManager,
androidServicesModule.preferencesService,
logWriter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ internal class AeiDataSourceImplTest {
logWriter = FakeLogWriter()
applicationExitInfoService = AeiDataSourceImpl(
worker,
configService.appExitInfoBehavior,
configService,
mockActivityManager,
preferenceService,
logWriter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import android.app.ActivityManager
import android.app.ApplicationExitInfo
import com.android.server.os.TombstoneProtos
import io.embrace.android.embracesdk.ResourceReader
import io.embrace.android.embracesdk.fakes.FakeConfigService
import io.embrace.android.embracesdk.fakes.FakeLogWriter
import io.embrace.android.embracesdk.fakes.FakePreferenceService
import io.embrace.android.embracesdk.fakes.behavior.FakeAppExitInfoBehavior
import io.embrace.android.embracesdk.fakes.behavior.FakeAutoDataCaptureBehavior
import io.embrace.android.embracesdk.fakes.fakeBackgroundWorker
import io.embrace.android.embracesdk.internal.TypeUtils
import io.embrace.android.embracesdk.internal.logging.EmbLoggerImpl
Expand Down Expand Up @@ -134,7 +135,7 @@ internal class AeiNdkCrashProtobufSendTest {
val logWriter = FakeLogWriter()
AeiDataSourceImpl(
fakeBackgroundWorker(),
FakeAppExitInfoBehavior(enabled = true),
FakeConfigService(autoDataCaptureBehavior = FakeAutoDataCaptureBehavior(ndkEnabled = true)),
activityManager,
FakePreferenceService(),
logWriter,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import android.os.Build
import android.preference.PreferenceManager
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig
import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig
import io.embrace.android.embracesdk.internal.arch.schema.EmbType
import io.embrace.android.embracesdk.internal.config.remote.AppExitInfoConfig
import io.embrace.android.embracesdk.internal.config.remote.RemoteConfig
Expand Down Expand Up @@ -125,6 +127,7 @@ internal class AeiFeatureTest {
@Test
fun `native crash`() {
testRule.runTest(
instrumentedConfig = FakeInstrumentedConfig(enabledFeatures = FakeEnabledFeatureConfig(nativeCrashCapture = true)),
setupAction = {
setupFakeAeiData(listOf(nativeCrash.toAeiObject(), nativeCrash.toAeiObject()))
},
Expand All @@ -139,6 +142,22 @@ internal class AeiFeatureTest {
)
}

@Test
fun `native crash disabled`() {
testRule.runTest(
instrumentedConfig = FakeInstrumentedConfig(enabledFeatures = FakeEnabledFeatureConfig(nativeCrashCapture = false)),
setupAction = {
setupFakeAeiData(listOf(nativeCrash.toAeiObject()))
},
testCaseAction = {
recordSession()
},
assertAction = {
assertEquals(0, getLogEnvelopes(0).size)
}
)
}

@Test
fun `anr exit`() {
testRule.runTest(
Expand Down