Skip to content

Commit

Permalink
avoid deadlock during AppMetricaService#onDestroy
Browse files Browse the repository at this point in the history
  • Loading branch information
alexklints committed Nov 22, 2023
1 parent 45d08e8 commit efe93d3
Show file tree
Hide file tree
Showing 9 changed files with 325 additions and 461 deletions.
6 changes: 3 additions & 3 deletions .mapping.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@
"analytics/src/main/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnit.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnit.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitFieldsFactory.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitFieldsFactory.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/MigrationScript.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/MigrationScript.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponent.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponent.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponent.kt":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponent.kt",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentFactory.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentFactory.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/ReportComponentConfigurationHolder.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/ReportComponentConfigurationHolder.java",
"analytics/src/main/java/io/appmetrica/analytics/impl/component/ReporterArgumentsFactory.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/main/java/io/appmetrica/analytics/impl/component/ReporterArgumentsFactory.java",
Expand Down Expand Up @@ -1215,8 +1215,8 @@
"analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentIdTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentIdTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitFieldsFactoryTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitFieldsFactoryTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/MainReporterComponentUnitTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentHandleReportTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentHandleReportTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentHandleReportTest.kt":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentHandleReportTest.kt",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentTest.kt":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/RegularDispatcherComponentTest.kt",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/ReportComponentConfigurationHolderTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/ReportComponentConfigurationHolderTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/ReportReferrerMainReporterClientUnitTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/ReportReferrerMainReporterClientUnitTest.java",
"analytics/src/test/java/io/appmetrica/analytics/impl/component/ReporterArgumentsFactoryTest.java":"mobile/metrika/android/appmetrica/appmetrica-sdk/analytics/src/test/java/io/appmetrica/analytics/impl/component/ReporterArgumentsFactoryTest.java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ public synchronized void onStartupChanged(@NonNull StartupState newState) {
}

@Override
public synchronized void onStartupError(@NonNull StartupError error, @Nullable StartupState existingState) {
public void onStartupError(@NonNull StartupError error, @Nullable StartupState existingState) {

}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.appmetrica.analytics.impl.component

import android.content.Context
import androidx.annotation.VisibleForTesting
import io.appmetrica.analytics.coreutils.internal.logger.YLogger
import io.appmetrica.analytics.impl.CounterReport
import io.appmetrica.analytics.impl.EventsManager
import io.appmetrica.analytics.impl.component.CommonArguments.ReporterArguments
import io.appmetrica.analytics.impl.component.clients.ClientUnit
import io.appmetrica.analytics.impl.component.clients.ComponentUnitFactory
import io.appmetrica.analytics.impl.startup.StartupCenter
import io.appmetrica.analytics.impl.startup.StartupError
import io.appmetrica.analytics.impl.startup.StartupListener
import io.appmetrica.analytics.impl.startup.StartupState
import io.appmetrica.analytics.impl.startup.StartupUnit

internal class RegularDispatcherComponent<COMPONENT>(
@get:VisibleForTesting val context: Context,
@get:VisibleForTesting val componentId: ComponentId,
sdkConfig: CommonArguments,
componentUnitFactory: ComponentUnitFactory<COMPONENT>,
private val lifecycleManager: ComponentLifecycleManager<ClientUnit?>,
startupCenter: StartupCenter
) : IClientConsumer<ClientUnit?>,
StartupListener,
IDispatcherComponent where COMPONENT : IReportableComponent, COMPONENT : IComponent {

constructor(
context: Context,
componentId: ComponentId,
sdkConfig: CommonArguments,
componentUnitFactory: ComponentUnitFactory<COMPONENT>
) : this(
context,
componentId,
sdkConfig,
componentUnitFactory,
ComponentLifecycleManager<ClientUnit?>(),
StartupCenter.getInstance()
)

private val tag = "[RegularDispatcherComponent]"

private val startupUnit: StartupUnit =
startupCenter.getOrCreateStartupUnit(context, componentId, sdkConfig.startupArguments)

private val reportingComponent: COMPONENT = componentUnitFactory.createComponentUnit(
context,
componentId,
sdkConfig.componentArguments,
startupUnit
)

init {
startupCenter.registerStartupListener(componentId, this)
}

fun handleReport(counterReport: CounterReport, configuration: CommonArguments) {
YLogger.d("%s handle report for componentId: %s; data: %s", tag, componentId, counterReport)

if (!EventsManager.isEventWithoutAppConfigUpdate(counterReport.type)) {
updateComponentConfig(configuration.componentArguments)
}

reportingComponent.handleReport(counterReport)
}

private fun updateComponentConfig(sdkConfig: ReporterArguments) {
YLogger.d("%sUpdate sdk config for componentId: %s; config: %s", tag, componentId, sdkConfig)
reportingComponent.updateSdkConfig(sdkConfig)
}

override fun connectClient(client: ClientUnit) {
lifecycleManager.connectClient(client)
}

override fun disconnectClient(client: ClientUnit) {
lifecycleManager.disconnectClient(client)
}

override fun onStartupChanged(newState: StartupState) {
reportingComponent.onStartupChanged(newState)
}

override fun onStartupError(error: StartupError, existingState: StartupState?) {
reportingComponent.onStartupError(error, existingState)
}

override fun updateConfig(arguments: CommonArguments) {
startupUnit.updateConfiguration(arguments.startupArguments)
updateComponentConfig(arguments.componentArguments)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,7 @@ public void onRequestError(@NonNull StartupError cause) {
}

public synchronized void updateConfiguration(@NonNull StartupRequestConfig.Arguments arguments) {
YLogger.d(TAG + " update configuration for %s", mComponentId.toString());
YLogger.d(TAG + " update configuration. New configuration %s", arguments);
YLogger.d(TAG + " update configuration for %s. New configuration %s", mComponentId.toString(), arguments);
mConfigHolder.updateArguments(arguments);
findHosts(mConfigHolder.get());
}
Expand Down
Loading

0 comments on commit efe93d3

Please sign in to comment.