Use configurable adapter initialization (alpha)

By default, GMA Next-Gen SDK initializes all mediation adapters associated with your application during initialization. Initializing every adapter can take more than 30 seconds, leading to significant latency before your first ad can load.

To solve this issue, AdMob provides Configurable Adapter Initialization. This feature lets you control which adapters are initialized for your first ad impression, and reduces latency for that impression.

This guide covers the following aspects of Configurable Adapter Initialization:

Prerequisites

  • Opt in to this feature by adding the @ExperimentalApi annotation to your class:

    Kotlin

    @OptIn(ExperimentalApi::class)
    

    Java

    import androidx.annotation.OptIn;
    // ...
    @OptIn(markerClass = ExperimentalApi.class)
    

Create an adapter configuration

An adapter initialization configuration instructs GMA Next-Gen SDK to initialize only the required adapters. This prevents unnecessary adapters from blocking your first ad request, conserving computation resources and significantly reducing latency for the first ad impression.

To optimize your app's performance, consider the following strategies as you create an adapter initialization configuration:

Prioritize specific Ad Format or Ad Unit

Improve the performance of apps that show an ad immediately upon launch, such as an app open ad, by declaring the specific ad format or ad unit in your adapter initialization configuration.

The following example creates an adapter initialization configuration that initializes only the required mediation adapters for a specific app open ad unit with a five second timeout:

Kotlin

val adapterConfig =
  AdapterInitializationConfig.Builder()
    .setAllowedAdUnitIds(setOf(AD_UNIT_ID))
    .setInitializationTimeoutMs(5000)
    .build()

Java

AdapterInitializationConfig adapterConfig =
    new AdapterInitializationConfig.Builder()
        .setAllowedAdUnitIds(Set.of(AD_UNIT_ID))
        .setInitializationTimeoutMs(5000)
        .build();

The following example creates an adapter initialization configuration that initializes only the required mediation adapters for all App Open Ads and sets a five second timeout:

Kotlin

val adapterConfig =
  AdapterInitializationConfig.Builder()
    .setAllowedAdFormats(setOf(AdFormat.APP_OPEN_AD))
    .setInitializationTimeoutMs(5000)
    .build()

Java

AdapterInitializationConfig adapterConfig =
    new AdapterInitializationConfig.Builder()
        .setAllowedAdFormats(Set.of(AdFormat.APP_OPEN_AD))
        .setInitializationTimeoutMs(5000)
        .build();

Initialize specific mediation adapters

If you know exactly which mediation partners typically fill your first ad impression, you can initialize only that specific adapter by providing the adapter class name in your adapter initialization configuration. Combine this with explicitly skipping the uninitialized adapters and setting a timeout for GMA Next-Gen SDK to not wait for remaining uninitialized adapters during the auction.

The following example creates an adapter initialization configuration that initializes a specific mediation adapter and sets a five second timeout:

Kotlin

val adapterConfig =
  AdapterInitializationConfig.Builder()
    .setAllowedAdapterClasses(setOf(ADAPTER_JAVA_CLASS_NAME))
    .setInitializationTimeoutMs(5000)
    .build()

Java

AdapterInitializationConfig adapterConfig =
    new AdapterInitializationConfig.Builder()
        .setAllowedAdapterClasses(Set.of(ADAPTER_JAVA_CLASS_NAME))
        .setInitializationTimeoutMs(5000)
        .build();

You can fetch the adapter class names programmatically. The following example pulls adapter class names programmatically:

Kotlin

ExampleMediationAdapter::class.java.name

Java

ExampleMediationAdapter.class.getName()

Exclude specific mediation adapters

If you observe that certain mediation adapters have consistently high latency, you can exclude these adapters and initialize them at a later time.

The following example creates an adapter initialization configuration that excludes specific adapters from initializing, and sets a five second timeout:

Kotlin

val adapterConfig =
  AdapterInitializationConfig.Builder()
    .setExcludedAdapterClasses(setOf(ADAPTER_JAVA_CLASS_NAME))
    .setInitializationTimeoutMs(5000)
    .build()

Java

AdapterInitializationConfig adapterConfig =
    new AdapterInitializationConfig.Builder()
        .setExcludedAdapterClasses(Set.of(ADAPTER_JAVA_CLASS_NAME))
        .setInitializationTimeoutMs(5000)
        .build();

Skip uninitialized adapters

If you plan to initialize or exclude specific mediation adapters, you can configure your ad request to skip uninitialized adapters that are still present in your waterfall.

If you don't create an adapter configuration, you can still configure your ad request to skip uninitialized adapters. GMA Next-Gen SDK issues an ad request without waiting for adapters to time out or fail to initialize.

The following example initializes the SDK with an adapter initialization configuration and creates an app open ad request that skips uninitialized adapters:

Kotlin

val initConfig =
  InitializationConfig.Builder(appId)
    .setAdapterInitializationConfig(adapterInitializationConfig)
    .build()

// Initialize the GMA Next-Gen SDK with a config containing your adapter initialization
// settings.
val backgroundScope = CoroutineScope(Dispatchers.IO)
backgroundScope.launch {
  MobileAds.initialize(context = context, initConfig) {

    // Make your ad request after adapter initialization completes.
    AppOpenAd.load(
      AdRequest.Builder(adUnitId = adUnitId)
        // Set this to guarantee that the ad request
        // doesn't wait for any other uninitialized adapters.
        .skipUninitializedAdapters()
        .build(),
      adLoadCallback =
        object : AdLoadCallback<AppOpenAd> {

          override fun onAdLoaded(ad: AppOpenAd) {
            // TODO: Your ad logic here
            // ....

            // Execute non-time-sensitive tasks after ad load completes.
            performPostLaunchSetup()
          }

          override fun onAdFailedToLoad(adError: LoadAdError) {
            // TODO: Handle load error.
            // ....

            // Ensure non-time-sensitive post-launch tasks execute even if ad load fails.
            performPostLaunchSetup()
          }
        },
    )
  }
}

Java

InitializationConfig initConfig =
    new InitializationConfig.Builder(appId)
        .setAdapterInitializationConfig(adapterInitializationConfig)
        .build();

// Initialize the GMA Next-Gen SDK with a config containing your adapter initialization
// settings.
MobileAds.initialize(
    context,
    initConfig,
    initializationStatus -> {
      // Make your ad request after adapter initialization completes.
      AppOpenAd.load(
          new AdRequest.Builder(adUnitId)
              // Set this to guarantee that the ad request
              // doesn't wait for any other uninitialized adapters.
              .skipUninitializedAdapters()
              .build(),
          new AdLoadCallback<AppOpenAd>() {
            @Override
            public void onAdLoaded(@NonNull AppOpenAd ad) {
              // TODO: Your ad logic here
              // ....

              // Execute non-time-sensitive tasks after ad load completes.
              performPostLaunchSetup();
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError error) {
              // TODO: Handle load error.
              // ....

              // Ensure non-time-sensitive post-launch tasks execute even if ad load fails.
              performPostLaunchSetup();
            }
          });
    });

Initialize remaining adapters

After your time-sensitive ad opportunities have loaded, initialize your remaining adapters to ensure full partner mediation coverage for the rest of the app session.

The following example initializes the rest of the adapters by providing an empty configuration:

Kotlin


// Provide initializeAdapters with an empty configuration to initialize
// any adapters not initialized with configurable initialization.
MobileAds.initializeAdapters(AdapterInitializationConfig.Builder().build())

Java

// Provide initializeAdapters with an empty configuration to initialize
// any adapters not initialized with configurable initialization.
MobileAds.initializeAdapters(new AdapterInitializationConfig.Builder().build());