关于 google-mobile-ads-android-migrate-to-next-gen
面向开发者的迁移技能,帮助 Android 应用从 Google Mobile Ads SDK 转向 Next-Gen SDK,涵盖依赖、API、线程处理和构建验证。
主要功能
- 01Gradle 依赖与 SDK 级别更新
- 02新旧 API 对照
- 03初始化与回调规则
- 04广告格式迁移指引
- 05构建验证清单
适用场景
- 01将 Android 应用迁移至 Next-Gen SDK
- 02查找替换类和方法
- 03检查回调中的 UI 线程处理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ google/ skills --skill google-mobile-ads-android-migrate-to-next-gen安装后在 Claude Code 中输入/google-mobile-ads-android-migrate-to-next-gen确认已加载。
详细介绍
Google Mobile Ads SDK 的 AI 迁移 Agent 指南
迁移工作流
使用此清单跟踪迁移进度:
- 配置 Gradle:
-
将
com.google.android.gms:play-services-ads替换为最新的 稳定版本com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk。如果 无法直接访问 Maven,请运行以下命令获取最新版本。latest标签中 返回的版本即为 GMA Next-Gen SDK 的最新版本:curl -sS https://dl.google.com/dl/android/maven2/com/google/android/libraries/ads/mobile/sdk/ads-mobile-sdk/maven-metadata.xml | sed -n 's/.*<latest>\(.*\)<\/latest>.*/\1/p' -
更新
minSdk(24+)和compileSdk(34+)。 -
在应用级构建文件中全局排除所有依赖项中的
play-services-ads和play-services-ads-lite,以避免重复符号错误。 -
在继续下一步之前同步 Gradle。
-
- 逐文件迁移:
- 按照 API 映射表和方法映射表重构代码库,将导入项、类名和方法 签名迁移到 GMA Next-Gen SDK。
- 验证并构建:
- 运行
gradle build -x test,确认构建成功且无残留问题。 解决所有与 GMA SDK 相关的编译错误。
- 运行
核心迁移规则
- 应用 ID 用法:始终使用
AndroidManifest.xml中com.google.android.gms.ads.APPLICATION_ID元数据标签的值,作为InitializationConfig中的applicationId。- 约束:保留清单中的
<meta-data>标签;使用 User Messaging Platform SDK 的发布者仍然需要此标签。
- 约束:保留清单中的
- 初始化顺序:
- 在后台线程上调用
MobileAds.initialize()。 - 确保在调用任何其他 SDK 方法之前调用
initialize()。 - 如果使用
RequestConfiguration,请将其传入InitializationConfig.Builder.setRequestConfiguration()。不要 在初始化前调用MobileAds.setRequestConfiguration()。
- 在后台线程上调用
- UI 线程:必须:GMA-Next Gen SDK 的回调会在后台线程上执行。所有
与 UI 相关的操作(例如 Toast、View 更新、Fragment 事务)都必须
在 GMA SDK 回调中通过
runOnUiThread {}或Dispatchers.Main.launch {}包装。跳过此步骤会导致应用崩溃。 - 中介:实现
com.google.android.gms.ads.mediation.Adapter的类必须继续使用com.google.android.gms.ads。
格式特定说明
横幅广告
- 使用
com.google.android.libraries.ads.mobile.sdk.banner.AdView加载 GMA Next-Gen SDK 横幅广告。 - 以下 API 可检查横幅广告是否可折叠:
adView.getBannerAd().isCollapsible()。
原生广告
- NativeAdLoader:
NativeAdLoader是抽象类,无法实例化。 它以静态方式使用(例如NativeAdLoader.load(...))。 - 以下 API 现在设置在
NativeAdRequest.Builder上:.setCustomFormatIds(customFormatIds: List<String>).disableImageDownloading().setMediaAspectRatio(mediaAspectRatio: NativeMediaAspectRatio).setAdChoicesPlacement(adChoicesPlacement: AdChoicesPlacement).setVideoOptions(videoOptions: VideoOptions)
- 移除:删除所有“静音此广告”逻辑;GMA Next-Gen SDK 不支持此功能。
- MediaView:
NativeAd不再具有直接的mediaView变量;使用registerNativeAd(nativeAd, mediaView)将广告与视图关联。
广告预加载
- 除非映射表中另有说明,否则 GMA Next-Gen SDK 中的广告预加载方法保留与 旧版 SDK 相同的 API 签名和参数。
API 映射
此表涵盖主要类及其在 GMA Next-Gen SDK 中的对应项。
| 功能 | 旧版 SDK 导入(com.google.android.gms.ads...) | GMA Next-Gen SDK 导入(com.google.android.libraries.ads.mobile.sdk... ) |
|---|---|---|
| 核心 | ||
| 初始化 | MobileAds | MobileAds、initialization.InitializationConfig |
| 初始化监听器 | initialization.OnInitializationCompleteListener | initialization.OnAdapterInitializationCompleteListener |
| 广告请求 | AdRequest | 特定格式(例如,common.AdRequest、banner.BannerAdRequest、nativead.NativeAdRequest)(广告单元 ID 在 Builder 中声明。Load() 不再接收 Activity) |
| 加载错误 | LoadAdError | common.LoadAdError(LoadAdError 不再包含 domain 变量。若存在,请移除 domain 变量。) |
| 全屏展示错误 | AdError(位于 FullScreenContentCallback 中) | common.FullScreenContentError(位于特定格式的 AdEventCallback 中) |
| 请求配置 | RequestConfiguration | common.RequestConfiguration(RequestConfiguration 的嵌套枚举/常量现在位于 common.RequestConfiguration 下。) |
| 事件回调 | FullScreenContentCallback(用于全屏格式)、AdListener(横幅、原生) | 特定格式(例如,interstitial.InterstitialAdEventCallback、banner.BannerAdEventCallback、native.NativeAdEventCallback)。广告格式上的变量为 adEventCallback。 |
| 工具 | ||
| 广告检查器 | MobileAds.openAdInspector() | MobileAds.openAdInspector()(openAdInspector 不再接收 Activity) |
| 广告检查器监听器 | OnAdInspectorClosedListener | common.OnAdInspectorClosedListener |
| 格式 | ||
| 应用启动 | appopen.AppOpenAd | appopen.AppOpenAd |
| 应用启动加载 | appopen.AppOpenAd.AppOpenAdLoadCallback | common.AdLoadCallback<appopen.AppOpenAd> |
| 横幅 | AdView、AdSize | banner.AdView、banner.AdSize(AdView 不再包含 pause()、resume()、setAdSize()。)AdSize 在 BannerAdRequest 中声明。 |
| 横幅加载 | AdListener | common.AdLoadCallback<banner.BannerAd> |
| 横幅事件 | AdListener | banner.BannerAdEventCallback、banner.BannerAdRefreshCallback |
| 插页式 | interstitial.InterstitialAd | interstitial.InterstitialAd |
| 插页式加载 | interstitial.InterstitialAd.InterstitialAdLoadCallback | common.AdLoadCallback<interstitial.InterstitialAd> |
| 广告加载器 | AdLoader | nativead.NativeAdLoader |
| 原生 | nativead.NativeAd | nativead.NativeAd(不再包含 mediaView 变量) |
| 原生自定义格式广告 | nativead.NativeCustomFormatAd | nativead.CustomNativeAd |
| 原生自定义点击 | nativead.NativeCustomFormatAd.OnCustomClickListener | nativead.OnCustomClickListener(在 CustomNativeAd 对象上设置,例如 .onCustomClickListener) |
| 原生加载 | nativead.NativeAd.OnNativeAdLoadedListener | nativead.NativeAdLoaderCallback |
| 原生广告视图 | nativead.NativeAdView | nativead.NativeAdView |
| 媒体内容 | MediaContent | nativead.MediaContent(hasVideoContent 声明为 val) |
| 媒体宽高比 | MediaAspectRatio | nativead.MediaAspectRatio |
| 视频选项 | VideoOptions | common.VideoOptions |
| 视频控制器 | VideoController | common.VideoController(VideoLifecycleCallbacks 现在是一个接口,因此请使用 object : VideoController.VideoLifecycleCallbacks { ... } 实例化) |
| 激励式 | rewarded.RewardedAd | rewarded.RewardedAd |
| 激励式加载 | rewarded.RewardedAd.RewardedAdLoadCallback | common.AdLoadCallback<rewarded.RewardedAd> |
| 激励式插页广告 | rewardedinterstitial.RewardedInterstitialAd | rewardedinterstitial.RewardedInterstitialAd |
| 激励式插页广告加载 | rewardedinterstitial.RewardedInterstitialAd.RewardedInterstitialAdLoadCallback | common.AdLoadCallback<rewardedinterstitial.RewardedInterstitialAd> |
| 付费事件监听器 | OnPaidEventListener | common.AdEventCallback |
| 响应信息 | ResponseInfo | common.ResponseInfo |
| 适配器响应信息 | AdapterResponseInfo | common.AdSourceResponseInfo |
| 奖励 | ||
| 奖励监听器 | OnUserEarnedRewardListener | rewarded.OnUserEarnedRewardListener |
| 奖励项 | rewarded.RewardItem | rewarded.RewardItem(现在通过 RewardedAd 和 RewardedInterstitialAd 上的 getRewardItem() 访问属性) |
| 广告价值 | AdValue | common.AdValue |
| 预加载 | ||
| 配置 | preload.PreloadConfiguration | common.PreloadConfiguration |
| 回调 | preload.PreloadCallbackV2 | common.PreloadCallback(现在是接口,而不是抽象类) |
| 插页式预加载器 | interstitial.InterstitialPreloader | interstitial.InterstitialAdPreloader |
| Ad Manager | ||
| 广告请求 | admanager.AdManagerAdRequest | common.AdRequest(现在直接在 AdRequest 类中实现) |
| 广告视图 | admanager.AdView | banner.AdView(没有 AdManagerAdView 类) |
| 应用事件监听器 | admanager.AppEventListener | common.OnAppEventListener |
方法映射
此表涵盖主要方法及其对应的 GMA Next-Gen SDK 方法。
| 功能 | 旧版 SDK 方法签名 | GMA Next-Gen SDK 方法签名 |
|---|---|---|
| 核心 | ||
| MobileAds 初始化 | MobileAds.initialize(Context context, OnInitializationCompleteListener listener) | MobileAds.initialize(Context context, InitializationConfig config, OnInitializationCompleteListener listener) |
| InitializationConfig 构建器 | 不适用 | InitializationConfig.Builder(String applicationId) |
| 广告请求构建器 | AdRequest.Builder().build() | AdRequest.Builder(String adUnitId).build()(用于 App Open、Interstitial、Rewarded、Rewarded Interstitial) Banner: BannerAdRequest.Builder(String adUnitId, AdSize adSize).build() Native: NativeAdRequest.Builder(String adUnitId, nativeAdTypes: List<NativeAdType>).build() |
| 添加网络扩展(AdMobAdapter) | AdRequest.Builder().addNetworkExtrasBundle(Class<MediationExtrasReceiver>, Bundle networkExtras) | AdRequest.Builder(String adUnitId).setGoogleExtrasBundle(Bundle extraBundle) |
| 添加网络扩展(广告来源适配器) | AdRequest.Builder().addNetworkExtrasBundle(Class<MediationExtrasReceiver>, Bundle networkExtras) | AdRequest.Builder(String adUnitId).putAdSourceExtrasBundle(Class<MediationExtrasReceiver> adapterClass, Bundle adSourceExtras) |
| 自定义定向 | AdRequest.Builder().setCustomTargeting(String key, String value) | AdRequest.Builder(String adUnitId).putCustomTargeting(String key, String value) |
| 格式 | ||
| App Open | AppOpenAd.load(Context context, String adUnitId, AdRequest request, AppOpenAdLoadCallback loadCallback) | AppOpenAd.load(AdRequest request, AdLoadCallback<AppOpenAd> loadCallback) |
| Banner | AdView.loadAd(AdRequest request) | AdView.loadAd(BannerAdRequest request, AdLoadCallback<BannerAd> loadCallback) |
| Interstitial | InterstitialAd.load(Context context, String adUnitId, AdRequest request, InterstitialAdLoadCallback loadCallback) | InterstitialAd.load(AdRequest request, AdLoadCallback<InterstitialAd> loadCallback) |
| Rewarded | RewardedAd.load(Context context, String adUnitId, AdRequest request, RewardedAdLoadCallback loadCallback) | RewardedAd.load(AdRequest request, AdLoadCallback<RewardedAd> loadCallback) |
| Rewarded Interstitial | RewardedInterstitialAd.load(Context context, String adUnitId, AdRequest request, RewardedInterstitialAdLoadCallback loadCallback) | RewardedInterstitialAd.load(AdRequest request, AdLoadCallback<RewardedInterstitialAd> loadCallback) |
| Native 构建器 | AdLoader.Builder(Context context, String adUnitId).forNativeAd(NativeAd.OnNativeAdLoadedListener onNativeAdLoadedListener) | NativeAdRequest.Builder(String adUnitId, nativeAdTypes: List<NativeAdType>)(在 nativeAdTypes 中包含 NativeAd.NativeAdType.NATIVE) |
| Native 加载 | AdLoader.Builder(...).build().loadAd(AdRequest request) | NativeAdLoader.load(NativeAdRequest request, NativeAdLoaderCallback callback) |
| Native 广告注册 | NativeAdView.setNativeAd(NativeAd nativeAd) | NativeAdView.registerNativeAd(NativeAd nativeAd, mediaView: MediaView?) |
| 设置应用事件监听器(Banner) | AdManagerAdView.appEventListener | BannerAd.adEventCallback(onAppEvent(name: String, data: String?) 现在属于 BannerAdEventCallback 的一部分) |
| 设置应用事件监听器(Interstitial) | AdManagerInterstitialAd.appEventListener | InterstitialAd.adEventCallback(onAppEvent(name: String, data: String?) 现在属于 InterstitialAdEventCallback 的一部分) |
| 回调 | ||
| onAdOpened | AdListener.onAdOpened() | AdEventCallback.onAdShowedFullScreenContent() |
| onAdClosed | AdListener.onAdClosed() | AdEventCallback.onAdDismissedFullScreenContent() |
| onFailedToShowFullScreenContent | onAdFailedToShowFullScreenContent(adError: AdError) | onAdFailedToShowFullScreenContent(fullScreenContentError: FullScreenContentError) |
| onAdLoaded | AdLoadCallback:onAdLoaded(ad: T)(例如 InterstitialAdLoadCallback、RewardedAdLoadCallback、RewardedInterstitialAdLoadCallback) | 参数名称始终为 ad 特定格式:onAdLoaded(ad: InterstitialAd)、onAdLoaded(ad: RewardedAd)、onAdLoaded(ad: RewardedInterstitialAd) |
| onAdFailedToLoad | onAdFailedToLoad(loadAdError: LoadAdError) | onAdFailedToLoad(adError: LoadAdError) |
| onCustomFormatAdLoaded | OnCustomFormatAdLoadedListener.onCustomFormatAdLoaded(NativeCustomFormatAd ad) | NativeAdLoaderCallback.onCustomNativeAdLoaded(CustomNativeAd customNativeAd) |
| onPaidEventListener | OnPaidEventListener.onPaidEvent(AdValue value) | AdEventCallback.onAdPaid(value: AdValue)(特定格式,例如 banner.BannerAdEventCallback.onAdPaid(value: AdValue)) |
| onVideoMute | onVideoMute(muted: Boolean) | onVideoMute(isMuted: Boolean) |
| onAdPreloaded | onAdPreloaded(preloadId: String, responseInfo: ResponseInfo?) | onAdPreloaded(preloadId: String, responseInfo: ResponseInfo) |
| 预加载 | ||
| 配置 | PreloadConfiguration.Builder(String adUnitId).build() | PreloadConfiguration(AdRequest request) |
| 响应信息 | ||
| 获取响应信息 | ad.responseInfo | ad.getResponseInfo() |
| 已加载的适配器响应信息 | responseInfo.getLoadedAdapterResponseInfo() | responseInfo.loadedAdSourceResponseInfo |
| 获取适配器响应 | responseInfo.getAdapterResponses() | responseInfo.adSourceResponses |
| 获取中介适配器类 | responseInfo.getMediationAdapterClassName() | responseInfo.adapterClassName |
| 适配器响应信息 | ||
| 广告来源 ID | AdapterResponseInfo.getAdSourceId() | AdSourceResponseInfo.id |
| 广告来源名称 | AdapterResponseInfo.getAdSourceName() | AdSourceResponseInfo.name |
| 广告来源实例 ID | AdapterResponseInfo.getAdSourceInstanceId() | AdSourceResponseInfo.instanceId |
| 广告来源实例名称 | AdapterResponseInfo.getAdSourceInstanceName() | AdSourceResponseInfo.instanceName |
评论
支持 Markdown