A complete guide to MoPub native ads mediation on Android (Part 1)
Writing custom native ad adapters, the 9GAG way
(Two months after this article is published, MoPub has released adapters for Facebook, Flurry and AdMob. You are encouraged to use the official ones.)
This article shows you how to create custom adapters for MoPub native ads mediation:
- Part 1: The basics of MoPub SDK integration
- Part 2: Adapters for Facebook, Flurry and AppLovin
- Part 3: Adapter for AdMob and common problems
GitHub - ayltai/mopub-nativead-adapters: Custom adapters for MoPub native ads
mopub-nativead-adapters - Custom adapters for MoPub native ads
All snippets shown in this article are available on my GitHub. It is an Android library ready for most use cases. You can take my library and start getting working ads right away.
At 9GAG we aim to serve our users the most entertaining contents, free of charge. Showing ads on 9GAG Android app is a way to monetize (and survive). Native ads, as you may have guessed, look the same as the real contents and therefore, improve the revenue potential.
MoPub is an ad mediation platform which provides its own ads as well as its ad partners. You will need to provide your adapter classes to serve ads from MoPub mediated ad networks. MoPub officially offers you a few adapters, mostly for banner and interstitial ads though. They do offer an adapter for Facebook Audience Network native ads, which proves to be useful as a starting point for creating your own adapters for other ad networks.
A few ad networks, such as Flurry, also offer custom adapters for MoPub. Some ad networks, on the other hand, such as Google, make this game much more difficult to play. I know how hard it is to find these adapters on the Internet and, most importantly, make them work together because of the lack of official documentation. I know it because I did it myself and rolled out my custom implementation in our 9GAG Android app.
Before we proceed, you will need a registered account on MoPub. Please create here if you haven’t got one. Follow their official documentation to set up your application, ad units, orders, marketplace, etc., using MoPub Administrator Console.
MoPub SDK setup
You can find MoPub’s official wiki on how to setup their SDK. But you don’t need everything they mentioned if you are going to integrate native ads only.
In your application project (or root project if you prefer)
build.gradle, make sure you have
jcenter repository added:
Add MoPub SDK dependency to your application project
Note: MoPub SDK 4.12.0 supports Android API 16 or later. If you need to support API 11 or later, use 4.11.0 instead.
Add the following permission to your application
INTERNET is a required permission for all ad networks, of course. You will also need
WRITE_EXTERNAL_STORAGE if you want to mediate ads from Facebook, Flurry and AppLovin, as described in Part 2 of this article.
Add the following activities to the same
MoPubBrowser are required for MoPub SDK integration. If you want to integrate Facebook, Flurry and AppLovin, you also need to add the corresponding activities as illustrated above.
Native ad view layout design
A typical 9GAG post looks something like this:
The native ad view layout design should look almost the same as a 9GAG post. I said “almost” because sometimes it is impossible to look exactly the same. A native ad that contains elements that do not appear in a post, such as the ad description text, the privacy information icon, etc., would make it a bit different but that’s okay in our case.
The complete view layout XML file can be found here. Yours must contains view elements such as the ad title
TextView, ad description
TextView, main image
TextView, etc. It is your choice to decide what view elements to be shown.
MoPub SDK initialization
Assuming that your native ad view layout file is
view_native_ad.xml, this is how you initialize MoPub SDK:
You need a
Context to initialize MoPub SDK. An
Activity Context will do. You also need the ID of the ad unit you have created on MoPub Administrator Console in the steps mentioned above. I use
moPubNativeNetworkListener to listen for callbacks after requesting native ads in later steps.
MoPub SDK offers a renderer to help you render native ads of any ad networks if you specify a
ViewBinder to it. The
ViewBinder binds the view layout you have designed in the previous step,
view_native_ad.xml, with the view ID specified. It will use
findViewById to grab your views and automatically set text or image to your views.
Request native ads
You can make native ad requests by using the same
MoPubNative instance you have initialized before. There are many types of information you can request, but here I only need the title text, body text, main image and call-to-action text. Requesting less information means a faster response and processing time. So don’t request unnecessary information from MoPub server.
Handling native ad request response
If MoPub server finds a suitable native ad that fulfill your request, you will need some further processing before showing it.
setMoPubNativeEventListener registers 2 callbacks,
onImpression is called when the ad is rendered and visible to the user.
onClick is called when the user taps on the ad. You are not required to register the callbacks because the impression and click events are already handled by MoPub SDK. But if you want to, say, track impressions and clicks for your own purpose, you can do it in these callbacks.
Passing the view inflated using the view layout designed in the previous steps,
renderAdView will let MoPub SDK render all the native ad fields to your view automatically. You don’t need to call
The final step before displaying the ad view is to call
prepare. It is for registering impression and click tracking for your ad view. Without it, it is useless to display the ad because you won’t get any revenue without the ad server knowing your ad click rate.
Now you should see your native ad if MoPub responses one to you. For any reason you cannot see it, do check the error code inside
Re-use native ad view for multiple ads
If you need to display another native ads using the same view instance, you must call
NativeAd.clear(view) before calling
NativeAd.renderAdView(view) again. So you definitely need this if you want to display ads in a
When you are done with the native ad, such as closing an Activity or quitting your application, you must call destroy to clean up those resources used by MoPub SDK. Otherwise you may experience memory leak. You can do it in your Activity’s
onDestroy or your view container’s
onDetachedFromWindow method, whatever is most suitable for your case.
You need to destroy both the
NativeAd instance you received in
onNativeLoad callback, and the
MoPubNative instance you have initialized in the above step.
Now you have got native ads serving from MoPub successfully. You are ready to mediate other ad networks to enhance your ad revenue potential.