为了解决此问题,AdMob 提供了可配置的适配器初始化功能。借助该功能,您可以控制为首次广告展示初始化哪些适配器,并减少此次展示的延迟时间。
本指南涵盖了可配置的适配器初始化功能的以下方面:
前提条件
- 导入 GMA Next-Gen SDK v0.25.0-beta01 或更高版本。
- 设置 GMA Next-Gen SDK。
如需选择启用此功能,请向您的类添加
@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());