libs.versions.toml
[versions] playServicesAds = "23.2.0" [libraries] play-services-ads = { module = "com.google.android.gms:play-services-ads", version.ref = "playServicesAds" }
build.gradle(module:App)
// ads implementation (libs.play.services.ads) implementation ("io.github.farimarwat:admobnative-compose:1.2") val multidex_version = "2.0.1" implementation("androidx.multidex:multidex:$multidex_version") implementation ("androidx.lifecycle:lifecycle-process:2.8.3")

Enable multidex for apps with over 64K methods | Android Studio | Android Developers
Learn how to enable an app configuration known as multidex, which allows your app to build and read multiple DEX files.
class LCApplication : MultiDexApplication() { override fun onCreate() { super.onCreate() // for firebase FirebaseApp.initializeApp(applicationContext) // remote config val remoteConfig: FirebaseRemoteConfig = Firebase.remoteConfig val configSettings = remoteConfigSettings { minimumFetchIntervalInSeconds = 0 } remoteConfig.setConfigSettingsAsync(configSettings) // ads MobileAds.initialize(this) {} AppOpenAdsManager( this, "ca-app-pub-3940256099942544/9257395921" ) }
Banner Ads

Banner ads | Android | Google for Developers
Banner ads are rectangular ads that occupy a portion of an app's layout. They stay on screen while users are interacting with the app, either anchored at the top or bottom of the screen or inline with content as the user scrolls. Banner ads can refresh automatically after a certain period of time. See Overview of banner ads for more information.
import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.AdSize import com.google.android.gms.ads.AdView @Composable fun AdMobBanner( modifier: Modifier = Modifier, adSize: AdSize, ) { AndroidView(modifier = modifier, factory = { AdView(it).apply { setAdSize(adSize) adUnitId = "ca-app-pub-3940256099942544/9214589741" loadAd(AdRequest.Builder().build()) } }) }
Interstitial Ads

Interstitial ads | Android | Google for Developers
Interstitial ads are full-screen ads that cover the interface of their host app. They're typically displayed at natural transition points in the flow of an app, such as between activities or during the pause between levels in a game. When an app shows an interstitial ad, the user has the choice to either tap on the ad and continue to its destination or close it and return to the app. Read one of our case studies.
import android.app.Activity import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.LoadAdError import com.google.android.gms.ads.interstitial.InterstitialAd import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback fun adMobInterstitial( context: Activity, ) { InterstitialAd.load( context, "ca-app-pub-3940256099942544/1033173712", AdRequest.Builder().build(), object : InterstitialAdLoadCallback() { override fun onAdFailedToLoad(p0: LoadAdError) { super.onAdFailedToLoad(p0) } override fun onAdLoaded(interstitialAd: InterstitialAd) { interstitialAd.show(context) } } ) }
Rewarded Ads

Rewarded ads | Android | Google for Developers
When building and testing your apps, make sure you use test ads rather than live, production ads. Failure to do so can lead to suspension of your account.
import android.app.Activity import android.widget.Toast import com.google.android.gms.ads.AdError import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.FullScreenContentCallback import com.google.android.gms.ads.LoadAdError import com.google.android.gms.ads.OnUserEarnedRewardListener import com.google.android.gms.ads.rewarded.RewardItem import com.google.android.gms.ads.rewarded.RewardedAd import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback fun adMobRewarded( context: Activity, ) { val adRequest = AdRequest.Builder().build() RewardedAd.load( context, "ca-app-pub-3940256099942544/5224354917", adRequest, object : RewardedAdLoadCallback() { override fun onAdFailedToLoad(adError: LoadAdError) { } override fun onAdLoaded(rewardedAd: RewardedAd) { super.onAdLoaded(rewardedAd) rewardedAd.fullScreenContentCallback = object : FullScreenContentCallback() { override fun onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent() adMobRewarded(context) onAdDismissedFullScreenContent() } override fun onAdFailedToShowFullScreenContent(p0: AdError) { super.onAdFailedToShowFullScreenContent(p0) } } rewardedAd.show(context,object : OnUserEarnedRewardListener { override fun onUserEarnedReward(p0: RewardItem) { Toast.makeText(context, "Add finished", Toast.LENGTH_SHORT).show() } }) } }) }
AppOpen Ads

App Open Ads | Android | Google for Developers
This guide is intended for publishers integrating app open ads using the Google Mobile Ads Android SDK.
import android.app.Activity import android.app.Application import android.content.Context import android.os.Bundle import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.ProcessLifecycleOwner import com.google.android.gms.ads.AdError import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.FullScreenContentCallback import com.google.android.gms.ads.LoadAdError import com.google.android.gms.ads.appopen.AppOpenAd import com.google.android.gms.ads.appopen.AppOpenAd.AppOpenAdLoadCallback import java.util.Date interface OnShowAdCompleteListener { fun onShowAdComplete() } class AppOpenAdsManager() : Application.ActivityLifecycleCallbacks { private var currentActivity: Activity? = null private lateinit var adUnit: String private val lifecycleEventObserver = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { currentActivity?.let { showAdIfAvailable(it) } } } constructor(application: Application, adUnitId: String) : this() { this.adUnit = adUnitId application.registerActivityLifecycleCallbacks(this) ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver) } override fun onActivityCreated(p0: Activity, p1: Bundle?) { //"Not yet implemented") } override fun onActivityStarted(p0: Activity) { //"Not yet implemented") } override fun onActivityResumed(p0: Activity) { currentActivity = p0 } override fun onActivityPaused(p0: Activity) { currentActivity = null } override fun onActivityStopped(p0: Activity) { //"Not yet implemented") } override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) { //"Not yet implemented") } override fun onActivityDestroyed(p0: Activity) { //"Not yet implemented") } private var appOpenAds: AppOpenAd? = null private var isLoadingAd = false private var isShowingAd = false private var loadTime: Long = 0 private fun loadAd(context: Context) { if (isLoadingAd or isAdAvailable()) { return } isLoadingAd = true val request = AdRequest.Builder().build() AppOpenAd.load( context, adUnit, request, object : AppOpenAdLoadCallback() { override fun onAdFailedToLoad(p0: LoadAdError) { super.onAdFailedToLoad(p0) isLoadingAd = false } override fun onAdLoaded(p0: AppOpenAd) { super.onAdLoaded(p0) appOpenAds = p0 isLoadingAd = false loadTime = Date().time } } ) } private fun isAdAvailable(): Boolean = appOpenAds != null private fun showAdIfAvailable(activity: Activity) { showAdIfAvailable(activity, object : OnShowAdCompleteListener { override fun onShowAdComplete() { } }) } private fun showAdIfAvailable( activity: Activity, onShowAdCompleteListener: OnShowAdCompleteListener, ) { if (isShowingAd) { return } if (!isAdAvailable()) { onShowAdCompleteListener.onShowAdComplete() loadAd(activity) return } appOpenAds!!.fullScreenContentCallback = object : FullScreenContentCallback() { override fun onAdShowedFullScreenContent() { super.onAdShowedFullScreenContent() } override fun onAdFailedToShowFullScreenContent(p0: AdError) { appOpenAds = null isShowingAd = false onShowAdCompleteListener.onShowAdComplete() loadAd(activity) } override fun onAdDismissedFullScreenContent() { appOpenAds = null isShowingAd = false onShowAdCompleteListener.onShowAdComplete() loadAd(activity) } } isShowingAd = true appOpenAds!!.show(activity) } }
Native ads
@Composable fun DemoScreen(){ val context = LocalContext.current val adstate = rememberNativeAdState( context = context, adUnitId = "ca-app-pub-3940256099942544/2247696110", refreshInterval = 60000 ) Text(text = "Small Native") //Small Banner BannerAdAdmobSmall(loadedAd = adstate) Spacer(modifier = Modifier.height(10.dp)) Text(text = "Medium Native") //Medium Banner BannerAdAdmobMedium(loadedAd = adstate) }
Example - All Ads Demo
import android.app.Activity import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.farimarwat.composenativeadmob.nativead.BannerAdAdmobMedium import com.farimarwat.composenativeadmob.nativead.BannerAdAdmobSmall import com.farimarwat.composenativeadmob.nativead.rememberNativeAdState import com.google.android.gms.ads.AdSize @Composable fun StatusScreen() { Column( modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { val context = LocalContext.current val adstate = rememberNativeAdState( context = context, adUnitId = "ca-app-pub-3940256099942544/2247696110", refreshInterval = 60000 ) Spacer(modifier = Modifier.height(100.dp)) Text(text = "BANNER") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.BANNER) Spacer(modifier = Modifier.height(10.dp)) Text(text = "FULL_BANNER") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.FULL_BANNER) Spacer(modifier = Modifier.height(10.dp)) Text(text = "LARGE_BANNER") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.LARGE_BANNER) Spacer(modifier = Modifier.height(10.dp)) Text(text = "SMART_BANNER") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.SMART_BANNER) Spacer(modifier = Modifier.height(10.dp)) Text(text = "FLUID") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.FLUID) Spacer(modifier = Modifier.height(10.dp)) Text(text = "INVALID") AdMobBanner(modifier = Modifier.fillMaxWidth(), adSize = AdSize.INVALID) Spacer(modifier = Modifier.height(10.dp)) Text(text = "Interstitial") Button(onClick = { adMobInterstitial(context = context as Activity) }) { Text(text = "Show Interstitial Ad") } Spacer(modifier = Modifier.height(10.dp)) Text(text = "Rewarded") Button(onClick = { adMobRewarded(context = context as Activity) }) { Text(text = "Show Rewarded Ad") } Spacer(modifier = Modifier.height(10.dp)) Text(text = "Small Native") //Small Banner BannerAdAdmobSmall(loadedAd = adstate) Spacer(modifier = Modifier.height(10.dp)) Text(text = "Medium Native") //Medium Banner BannerAdAdmobMedium(loadedAd = adstate) Spacer(modifier = Modifier.height(200.dp)) } }