AI 도구를 사용하여 Google Mobile Ads SDK에서 GMA Next-Gen SDK로의 마이그레이션을 최적화하려면 AI 환경에 스킬을 추가하세요. 스킬을 추가하면 AI 도구에 GMA Next-Gen SDK와 관련된 컨텍스트를 제공하고 AI 지원 코드 생성의 출력을 개선할 수 있습니다.
이 가이드에서는 Google Mobile Ads SDK에서 GMA Next-Gen SDK로 이전하는 데 도움이 되도록 AI 모델을 최적화하는 방법을 다룹니다.
기본 요건
Android 스튜디오를 사용하는 경우 다음 단계를 따르세요.
- Android 스튜디오의 Gemini에 대해 알아봅니다.
- Android 스튜디오 Panda 3 Canary 2 이상을 사용하여 Android 스튜디오에서 Gemini를 설정합니다.
기능 추가
Google은 AI 도구가 이전 단계를 지원할 수 있도록 안내가 포함된 SKILL.md 파일을 제공합니다.
AI 도구에서 GMA Next-Gen SDK 관련 스킬을 사용하려면 다음 단계를 따르세요.
Android 스튜디오
프로젝트의 루트 디렉터리에
.skills/이라는 폴더를 만듭니다.gma-migrate라는 스킬 디렉터리를 만듭니다.gma-migrate디렉터리에SKILL.md이라는 파일을 만듭니다.SKILL.md파일에 다음 안내를 추가합니다.--- name: gma-migrate description: Migrates applications from the old Google Mobile Ads (GMA) SDK (com.google.android.gms:play-services-ads) to the new GMA Next-Gen SDK (com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk). Use when migrating an existing codebase from the old SDK to the new Next-Gen SDK. Includes comprehensive mapping tables for imports, classes, and method signatures to help determine migration steps. metadata: version: 1.0 --- # AI Migration Agent Instructions for the Google Mobile Ads SDK ## Migration Workflow Use this checklist to track your migration progress: * **Configure Gradle**: - [ ] Replace `com.google.android.gms:play-services-ads` with the latest stable version of `com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk`. - [ ] Update `minSdk` (24+) and `compileSdk` (35+). - [ ] Exclude `play-services-ads` and `play-services-ads-lite` from all dependencies globally in the app-level build file to avoid duplicate symbol errors. - [ ] Sync Gradle before moving on to the next step. * **Per-File Migration**: - [ ] Refactor the codebase following the API Mapping and Method Mapping tables to migrate imports, class names, and method signature to GMA Next-Gen SDK. * **Verify and Build**: - [ ] Confirm a successful clean build. ## Core Migration Rules * **SDK Versions**: **ALWAYS** look up and use the latest stable version for `com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk`. Do not assume a version number. * **App ID Usage**: **Always** use the value of the `com.google.android.gms.ads.APPLICATION_ID` meta-data tag from `AndroidManifest.xml` for the `applicationId` in `InitializationConfig`. * *Constraint*: Preserve the `<meta-data>` tag in the manifest; it is still required for publishers using the User Messaging Platform SDK. * **Initialization Sequence**: 1. Call `MobileAds.initialize()` on a background thread. 2. Ensure `initialize()` is called **before** any other SDK methods. 3. If using `RequestConfiguration`, bundle it into `InitializationConfig.Builder.setRequestConfiguration()`. **Do not** call `MobileAds.setRequestConfiguration()` before initialization. * **UI Threading**: **MANDATORY**: Callbacks in GMA-Next Gen SDK are invoked on a background thread. Wrap UI-related operations (Toasts, View updates) in `runOnUiThread {}` or `Dispatchers.Main.launch {}` within SDK callbacks. * **Mediation**: Classes implementing `com.google.android.gms.ads.mediation.Adapter` MUST continue using `com.google.android.gms.ads`. ## Format Specifics ### Banner Ads * Use `com.google.android.libraries.ads.mobile.sdk.banner.AdView` for loading GMA Next-Gen SDK banners. * The following API checks if a banner is collapsible: `adView.getBannerAd().isCollapsible()`. ### Native Ads * The following APIs are now set on the `NativeAdRequest.Builder`: * `.setCustomFormatIds(customFormatIds: List<String>)` * `.disableImageDownloading()` * `.setMediaAspectRatio(mediaAspectRatio: NativeMediaAspectRatio)` * `.setAdChoicesPlacement(adChoicesPlacement: AdChoicesPlacement)` * `.setVideoOptions(videoOptions: VideoOptions)` * **Removal**: Delete all "Mute This Ad" logic; it is unsupported in GMA Next-Gen SDK. * **MediaView**: `NativeAd` no longer has a direct `mediaView` variable; use `registerNativeAd(nativeAd, mediaView)` to associate the ad with the view. ### Ad preloading * Unless specified in the mapping table, ad preloading methods in the GMA Next-Gen SDK retain the same API signatures and parameters as the Old SDK. ## API Mapping This table covers the main classes and their GMA Next-Gen SDK equivalents. | Feature | Old SDK Import (`com.google.android.gms.ads...`) | GMA Next-Gen SDK Import (`com.google.android.libraries.ads.mobile.sdk...` ) | |:---------------------------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Core** | | | | Initialization | `MobileAds` | `MobileAds`, `initialization.InitializationConfig` | | Ad Request | `AdRequest` | *Format specific* (e.g. `common.AdRequest`, `banner.BannerAdRequest`, `nativead.NativeAdRequest`) (Ad Unit ID is declared in `Builder`. Load() no longer takes an activity) | | Load Error | `LoadAdError` | `common.LoadAdError` (`LoadAdError` no longer has a domain variable. REMOVE the domain variable if found.) | | Full Screen Show Error | `AdError` (within `FullScreenContentCallback`) | `common.FullScreenContentError` (within format-specific `AdEventCallback`) | | Request Configuration | `RequestConfiguration` | `common.RequestConfiguration` (Nested Enums/Constants for RequestConfiguration are now under common.RequestConfiguration.) | | Event Callbacks | `FullScreenContentCallback` (for full screen formats), `AdListener` (Banner, Native) | *Format Specific* (e.g., `interstitial.InterstitialAdEventCallback`, `banner.BannerAdEventCallback`, `native.NativeAdEventCallback`). Variable on the ad format is `adEventCallback`. | | **Tools** | | | | Ad Inspector | `MobileAds.openAdInspector()` | `MobileAds.openAdInspector()` (`openAdInspector` no longer takes an activity) | | Ad Inspector Listener | `OnAdInspectorClosedListener` | `common.OnAdInspectorClosedListener` | | **Formats** | | | | App Open | `appopen.AppOpenAd` | `appopen.AppOpenAd` | | App Open Load | `appopen.AppOpenAd.AppOpenAdLoadCallback` | `common.AdLoadCallback<appopen.AppOpenAd>` | | Banner | `AdView`, `AdSize` | `banner.AdView`, `banner.AdSize` (`AdView` no longer has `pause()`, `resume()`, `setAdSize()`). `AdSize` is declared in `BannerAdRequest`. | | Banner Load | `AdListener` | `common.AdLoadCallback<banner.BannerAd>` | | Banner Events | `AdListener` | `banner.BannerAdEventCallback`, `banner.BannerAdRefreshCallback` | | Interstitial | `interstitial.InterstitialAd` | `interstitial.InterstitialAd` | | Interstitial Load | `interstitial.InterstitialAd.InterstitialAdLoadCallback` | `common.AdLoadCallback<interstitial.InterstitialAd>` | | Ad Loader | `AdLoader` | `nativead.NativeAdLoader` | | Native | `nativead.NativeAd` | `nativead.NativeAd` (No longer has a `mediaView` variable) | | Native Custom Format Ad | `nativead.NativeCustomFormatAd` | `nativead.CustomNativeAd` | | Native Custom Click | `nativead.NativeCustomFormatAd.OnCustomClickListener` | `nativead.OnCustomClickListener` (set on the `CustomNativeAd` object (e.g., `.onCustomClickListener`) | | Native Load | `nativead.NativeAd.OnNativeAdLoadedListener` | `nativead.NativeAdLoaderCallback` | | Native Ad View | `nativead.NativeAdView` | `nativead.NativeAdView` | | Media Content | `MediaContent` | `nativead.MediaContent` (hasVideoContent is declared as a `val`) | | Media Aspect Ratio | `MediaAspectRatio` | `nativead.MediaAspectRatio` | | Video Options | `VideoOptions` | `common.VideoOptions` | | Video Controller | `VideoController` | `common.VideoController` (VideoLifecycleCallbacks is now an interface, so instantiate with `object : VideoController.VideoLifecycleCallbacks { ... }`) | | Rewarded | `rewarded.RewardedAd` | `rewarded.RewardedAd` | | Rewarded Load | `rewarded.RewardedAd.RewardedAdLoadCallback` | `common.AdLoadCallback<rewarded.RewardedAd>` | | Rewarded Interstitial | `rewardedinterstitial.RewardedInterstitialAd` | `rewardedinterstitial.RewardedInterstitialAd` | | Rewarded Interstitial Load | `rewardedinterstitial.RewardedInterstitialAd.RewardedInterstitialAdLoadCallback` | `common.AdLoadCallback<rewardedinterstitial.RewardedInterstitialAd>` | | Paid Event Listener | `OnPaidEventListener` | `common.AdEventCallback` | | Response Info | `ResponseInfo` | `common.ResponseInfo` (property access is now `getResponseInfo()`. `loadedAdapterResponseInfo` is now `loadedAdSourceResponseInfo`.) | | **Rewards** | | | | Reward Listener | `OnUserEarnedRewardListener` | `rewarded.OnUserEarnedRewardListener` | | Reward Item | `rewarded.RewardItem` | `rewarded.RewardItem` (property access on `RewardedAd` and `RewardedInterstitialAd` is now `getRewardItem()`) | | Ad Value | `AdValue` | `common.AdValue` | | **Preloading** | | | | Configuration | `preload.PreloadConfiguration` | `common.PreloadConfiguration` | | Callback | `preload.PreloadCallbackV2` | `common.PreloadCallback` (Now an interface instead of an abstract class) | | Interstitial Preloader | `interstitial.InterstitialPreloader` | `interstitial.InterstitialAdPreloader` | | **Ad Manager** | | | | Ad Request | `admanager.AdManagerAdRequest` | `common.AdRequest` (Now directly implemented in the `AdRequest` class) | | Ad View | `admanager.AdView` | `banner.AdView` (No `AdManagerAdView` class) | | App Event Listener | `admanager.AppEventListener` | `common.OnAppEventListener` | ## Method Mapping This table covers the main methods and their GMA Next-Gen SDK equivalents. | Feature | Old SDK Method Signature | GMA Next-Gen SDK Method Signature | |:-----------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Core** | | | | MobileAds Initialization | `MobileAds.initialize(Context context, OnInitializationCompleteListener listener)` | `MobileAds.initialize(Context context, InitializationConfig config, OnInitializationCompleteListener listener)` | | InitializationConfig Builder | N/A | `InitializationConfig.Builder(String applicationId)` | | Ad Request Builder | `AdRequest.Builder().build()` | `AdRequest.Builder(String adUnitId).build()` (for App Open, Interstitial, Rewarded, Rewarded Interstitial) **Banner:** `BannerAdRequest.Builder(String adUnitId, AdSize adSize).build()` **Native:** `NativeAdRequest.Builder(String adUnitId, nativeAdTypes: List<NativeAdType>).build()` | | Add Network Extras (AdMobAdapter) | `AdRequest.Builder().addNetworkExtrasBundle(Class<MediationExtrasReceiver>, Bundle networkExtras)` | `AdRequest.Builder(String adUnitId).setGoogleExtrasBundle(Bundle extraBundle)` | | Add Network Extras (Ad Source Adapter) | `AdRequest.Builder().addNetworkExtrasBundle(Class<MediationExtrasReceiver>, Bundle networkExtras)` | `AdRequest.Builder(String adUnitId).putAdSourceExtrasBundle(Class<MediationExtrasReceiver> adapterClass, Bundle adSourceExtras)` | | Custom Targeting | `AdRequest.Builder().setCustomTargeting(String key, String value)` | `AdRequest.Builder(String adUnitId).putCustomTargeting(String key, String value)` | | **Formats** | | | | 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 Builder | `AdLoader.Builder(Context context, String adUnitId).forNativeAd(NativeAd.OnNativeAdLoadedListener onNativeAdLoadedListener)` | `NativeAdRequest.Builder(String adUnitId, nativeAdTypes: List<NativeAdType>)` (Include `NativeAd.NativeAdType.NATIVE` in `nativeAdTypes`) | | Native Load | `AdLoader.Builder(...).build().loadAd(AdRequest request)` | `NativeAdLoader.load(NativeAdRequest request, NativeAdLoaderCallback callback)` | | Native Ad Register | `NativeAdView.setNativeAd(NativeAd nativeAd)` | `NativeAdView.registerNativeAd(NativeAd nativeAd, mediaView: MediaView?)` | | Set an App Event Listener (Banner) | `AdManagerAdView.appEventListener` | `BannerAd.adEventCallback` (`onAppEvent(name: String, data: String?)` is now part of the `BannerAdEventCallback`) | | Set an App Event Listener (Interstitial) | `AdManagerInterstitialAd.appEventListener` | `InterstitialAd.adEventCallback` (`onAppEvent(name: String, data: String?)` is now part of the `InterstitialAdEventCallback`) | | **Callbacks** | | | | onAdOpened | `AdListener.onAdOpened()` | `AdEventCallback.onAdShowedFullScreenContent()` | | onAdClosed | `AdListener.onAdClosed()` | `AdEventCallback.onAdDismissedFullScreenContent()` | | onFailedToShowFullScreenContent | `onAdFailedToShowFullScreenContent(adError: AdError)` | `onAdFailedToShowFullScreenContent(fullScreenContentError: FullScreenContentError)` | | onAdLoaded | **AdLoadCallback**: `onAdLoaded(ad: T)` (e.g., `InterstitialAdLoadCallback`, `RewardedAdLoadCallback`, `RewardedInterstitialAdLoadCallback`) | Parameter name is always `ad` **Format specific**: `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)` (Format-specific e.g., `banner.BannerAdEventCallback.onAdPaid(value: AdValue)`) | | onVideoMute | `onVideoMute(muted: Boolean)` | `onVideoMute(isMuted: Boolean)` | | onAdPreloaded | `onAdPreloaded(preloadId: String, responseInfo: ResponseInfo?)` | `onAdPreloaded(preloadId: String, responseInfo: ResponseInfo)` | | **Preloading** | | | | Configuration | `PreloadConfiguration.Builder(String adUnitId).build()` | `PreloadConfiguration(AdRequest request)` |
자세한 내용은 스킬로 에이전트 모드 확장하기를 참고하세요.
프롬프트에서 스킬 호출
프로젝트에 스킬을 추가한 후 다음 예시 프롬프트를 사용하여 AI 도구에서 스킬을 호출합니다.
Android 스튜디오
스킬을 호출하려면 @를 입력하고 gma-migrate 스킬을 선택합니다.
@gma-migrate Migrate the files in my project from the old Google Mobile Ads SDK to the new GMA Next-Gen SDK
의견 남기기
Google은 GMA Next-Gen SDK 주제에 대한 AI 코드 지원 도구의 응답을 개선하기 위해 AI 코드 지원 도구에 제공되는 컨텍스트를 계속 평가하고 최적화하고 있습니다.
GMA Next-Gen SDK에 맞게 Gemini를 최적화하는 데 관한 의견이 있으면 GMA Next-Gen SDK Discord 채널에 참여하세요.