使用可配置的适配器初始化功能(Alpha 版)

默认情况下,GMA Next-Gen SDK 会在初始化期间初始化与您的应用关联的所有中介适配器。初始化每个适配器可能需要超过 30 秒的时间,导致在加载首个广告之前出现明显的延迟。

为了解决此问题,AdMob 提供了可配置的适配器初始化功能。借助该功能,您可以控制为首次广告展示初始化哪些适配器,并减少此次展示的延迟时间。

本指南涵盖了可配置的适配器初始化功能的以下方面:

前提条件

  • 如需选择启用此功能,请向您的类添加 @ExperimentalApi 注解:

    Kotlin

    @OptIn(ExperimentalApi::class)
    

    Java

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

创建适配器配置

适配器初始化配置会指示 GMA Next-Gen SDK 仅初始化必需的适配器。这样可以防止不必要的适配器阻塞首个广告请求,从而节省计算资源并显著缩短首次广告展示的延迟时间。

如需优化应用的性能,请在创建适配器初始化配置时考虑以下策略:

优先投放特定广告格式或广告单元

通过在适配器初始化配置中声明特定的广告格式或广告单元,提高在启动时立即展示广告(例如开屏广告)的应用的性能。

以下示例创建了一项适配器初始化配置,该配置仅初始化特定开屏广告单元必需的中介适配器,并将超时限值设为 5 秒:

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();

以下示例创建了一项适配器初始化配置,该配置仅初始化所有开屏广告必需的中介适配器,并将超时限值设为 5 秒:

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();

初始化特定的中介适配器

如果您确切知道哪些中介合作伙伴通常会填充您的首次广告展示,则可以在适配器初始化配置中提供相应的适配器类名称,从而仅初始化特定适配器。将这种做法与明确跳过未初始化的适配器以及为 GMA Next-Gen SDK 设置超时限值相结合,即可避免在竞价期间等待未初始化的剩余适配器。

以下示例创建了一项适配器初始化配置,该配置用于初始化特定的中介适配器,并将超时限值设为 5 秒:

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();

您可以以编程方式获取适配器类名称。以下示例以编程方式拉取适配器类名称:

Kotlin

ExampleMediationAdapter::class.java.name

Java

ExampleMediationAdapter.class.getName()

排除特定的中介适配器

如果您发现某些中介适配器的延迟时间一直很长,则可排除这些适配器,并在晚些时候初始化它们。

以下示例创建了一项适配器初始化配置,该配置用于排除特定适配器以使其不进行初始化,并将超时限值设为 5 秒:

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();

跳过未初始化的适配器

如果您计划初始化或排除特定的中介适配器,则可配置广告请求以跳过广告瀑布流中仍存在的未初始化的适配器。

如果不创建适配器配置,您仍可配置广告请求以跳过未初始化的适配器。GMA Next-Gen SDK 会在不等待适配器超时或初始化失败的情况下发出广告请求。

以下示例使用了一项适配器初始化配置来初始化 SDK,并创建了一项跳过未初始化适配器的开屏广告请求:

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();
            }
          });
    });

初始化剩余的适配器

在加载了时间敏感型广告机会之后,初始化剩余适配器,以确保在应用会话的剩余时间内实现对合作伙伴中介的全面覆盖。

以下示例通过提供一项空配置来初始化剩余的适配器:

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());