inmobi-ad-tracker-iat | Audience Bidding for DFP (Android)

Prerequisites

Make sure that your Android application meets the following requirements before proceeding.

  • Android 4.2.2 (Jelly Bean, API 17) and higher. MRAID ads require API 19 and higher.
    Older Android versions may work, but are not officially supported.
  • Google Play Services will adhere to the user’s ad tracking preferences. For more information, please see Google's website regarding their Advertising ID.

Note: If you are using Android Studio 3.0+, you'll need to disable AAPT 2.0. To do this, you'll need to add the following to your gradle.properties:

android.enableAapt2=false
	

Step 1: Integrating the SDK

Step 1.1: Adding the libraries

Option 1: Pulling the Latest SDK via JCenter

If you are using Gradle to build your Android applications, you can pull the latest version of the SDK from JCenter as described below:

  1. Include JCenter in your top-level build.gradle file
    allprojects {
        repositories {
           jcenter()
        }
    }
    		
  2. Add the following line to the dependencies element in your application module’s build.gradle file.

    For Non-Audience Bidder:

    implementation 'com.inmobi.monetization:inmobi-mediation:9.0.1'
    		

    For Audience Bidder:

    implementation 'com.inmobi.monetization:inmobi-AB-plugin-dfp:1.0.1'
    		
  3. Sync your Gradle project to ensure that the dependency is downloaded by the build system.

Option 2: Adding the SDK Library to your Application Project

Alternately, you can download the latest version of InMobi’s SDK here and copy the library to your application module’s libs/ directory.

Add the following files to the app/lib folder within your project.

libs/InMobiSDK.aar
libs/InMobiMediationSDK.aar
	

In case you’re integrating with InMobi Audience Bidding solution, you'll need an additional aar file (InMobiABDFPPlugin-x.x.x.aar). It can be found out under dist/MoPub/network-support/DFP/AudienceBidder.

These resources can all be found in the download along with the InMobi SDK.

To add the library to your project’s dependencies, add this line to the dependencies element in your module’s build.gradle:

implementation fileTree(dir: 'libs', include: ['*.aar])
	

The SDK bundle contains all media adapters that we support. Prune the downloaded folder to retain the media adapters you need.

Warning: Please remove all older versions of the InMobi SDK (8.X.X and older) and all older versions of the AerServ SDK. Otherwise, your code will not compile! Please reach out to your account manager if you have any questions.

Warning: Using any other version of these SDKs may cause issues and unintended behavior.

Adding and Verifying the Dependencies

To monetize with the InMobi Ad SDK, you must add the following dependencies to your application module build.gradle:

Google Play Services

The InMobi SDK for Android needs the Google Play Services library to enable better ad targeting via the Google Play Advertising ID. Additionally, the SDK also uses the Google Play Services for getting a location fix, should the user consent to collecting their location.

To add the Google Play Services client library to your application:

  1. Add the following lines to the application module’s dependency element:
              implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0'
              implementation 'com.google.android.gms:play-services-location:17.0.0'//optional dependency for better targeting
    		
  2. Sync your Gradle project to ensure that the dependencies are included.
Chrome Custom Tab

This is required to redirect the users to URLs outside InMobi WebView. To add the Chrome Custom library to your application:

  1. Add the following line to the application module's dependency element in the Gradle build script:
    implementation 'com.android.support:customtabs:28.0.0'
    		
  2. Sync your Gradle project to ensure dependencies are included.

Picasso Library

The InMobi SDK for Android uses the popular Picasso library for loading the ad assets. To add the Picasso library to your application:

  1. Add the following line to the application module’s dependency element in the gradle build script.
                implementation 'com.squareup.picasso:picasso:2.71828'
    		

Note: Failure to include Picasso dependency in your application gradle scripts will cause interstitial ad requests to fail, thus affecting monetization of your app with the InMobi SDK.

Support Library

For supporting paged scroll of a deck of images or ads, you must use support-v4 library.

To do so, add the following line to the application module’s dependency element in the Gradle build script.

            implementation '<strong>com.android.support:support-v4:28.0.0</strong>'
	

RecyclerView

For supporting free scroll of a deck of images or ads, you must use RecyclerView.

To do so, add the following line to the application module’s dependency element in the Gradle build script.

            implementation '<strong>com.android.support:recyclerview-v7:27.1.0</strong>'
	

Note: Failure to include RecyclerView dependency in your application gradle scripts will cause interstitial ad requests to fail, thus affecting monetization of your app with the InMobi SDK.

Miscellaneous

At times, including the InMobi SDK may cause the 64K limit on methods that can be packaged in an Android dex file to be breached. This can happen if, for example, your app packs a lot of features for your users and includes substantive code to realize this.

If this happens, you can use the multidex support library to enable building your app correctly. To do this:

  1. Modify the defaultConfig mark your application as multidex enabled:
    defaultConfig {
                applicationId "com.inmobi.samples"
                minSdkVersion 15
                targetSdkVersion 29 
                versionCode 1
                versionName "1.0.0"
                multiDexEnabled true // add this to enable multi-dex
            }
    		
  2. Add the following line to the dependencies element in your application module’s build script.
                compile 'com.android.support:multidex:1.0.3'
    		

Step 1.2: Gradle settings

You'll need to add the following settings to your application's build.gradle:

android {
  defaultConfig { 
  }
  buildTypes {
    ...
  }
  sourceSets {
    main {
    }
  }
}
repositories {
  ...
}
dependencies {
  implementation 'com.google.android.gms:play-services-ads-identifier:17.2.0'
  implementation 'com.google.android.gms:play-services-basement:16.1.0'
  implementation 'com.google.android.gms:play-services-location:17.0.0' //optional dependency for better targeting
  implementation 'com.squareup.picasso:picasso:2.71828'
}
	

Step 1.3: Android Manifest

Add the following Android permission into your Android Manifest:

<?xml version='1.0' encoding='utf-8'?>
<manifest xmlns:android='http://schemas.android.com/apk/res/android'  
  package='com.sample.myapp' >
  <!-- Optional Permissions -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <application
    android:allowBackup='true'
    android:label='@string/app_name'>
  </application>  
</manifest>
	

Note: Not including the optional permission MAY negatively impact fill for the respective networks that use these permissions.

Important Prerequisites

  • Checkpoint 1: Preparing Your App for Android 10

    InMobi SDK is compatible with Android 10 (API level 29), the latest version of the Android platform. On Android P onwards, apps make connections over HTTPS by default. Though InMobi supports the adoption of HTTPS, the current setup requires our demand partners to support HTTPS as well. The publisher can change their settings to HTTP if it has an impact on the revenue potential.

  • Checkpoint 2: Preparing Your App for AndroidX

    InMobi SDK is compatible with AndroidX (JetPack) library. In case your app uses the AndroidX library, then follow the standard guidelines by Google for migration by adding both the flags in build file.

    android.useAndroidX=true
    android.enableJetifier=true
    		

Note: It is highly recommended to upgrade Android Gradle plugin version to 4.1 or greater to avoid known issues in the jetifier which is fixed in the latest Gradle plugin version. To upgrade Android gradle plugin version please refer to Android developer documentation.

Step 1.4: Integrating DFP to InMobi Adapter

Step 1.4.1: Audience Bidding

To use the InMobi Audience Bidding SDK, here is how you can expect the flow to go:

  1. The InMobi Audience Bidder SDK will make an ad request and return a bid token
  2. The bid token from the ad network will have an updated PublisherAdRequest.Builder object and have pricing keywords attached
  3. You then call loadAd() on the DFP ad object as before.
  4. If InMobi is selected to fill, The InMobi Audience Bidder SDK will handle the rendering

Note: Contact your account manager for Audience Bidding placement setup.

Optionally, if you would like to handle the keywords yourself, you may also observe the below flow:

  1. The InMobi Audience Bidder SDK will make an ad request and return a bid token
  2. The bid token from the ad network will have an IMABBidResponse object
  3. You may query the object for the bid keyword, price, granular keyword, InMobi placement, and buyer
  4. You would then append the bid keyword to PublisherAdRequest.Builder
  5. You would then call loadAd() on the DFP ad object as before
  6. If InMobi is selected to fill, The InMobi Audience Bidder SDK will handle the rendering
Step 1.4.1.1: Enabling Audience Bidding Setup on DFP

To enable Audience Bidding, you will need to do 2 things:

  1. Set up the yield group to use the specific keywords with pricing used by the IMAudienceBidder class.
  2. Update your existing DFP integration details.
Step 1.4.1.1.1: Setting Up the DFP Yield Groups
  1. Sign in to Google Ad Manager.
  2. Click Delivery > Yield groups.
  3. Click New Yield Group. Enter a unique name for the yield group that describes the reporting process.
  4. Select the Ad format and Inventory type you wish to target with this yield group.
  5. Under Inventory > Key-Values:, Define the Key values using the keyword: “IMAB” for different price points.

    Enter the keyword in the following format IMAB:0.00 (eg. IMAB:0.50)

  6. Add/map the ad units to these keywords under Custom Targeting.

  7. Ad Exchange will be your default partner/demand source on the UI. Proceed to add additional third-party yield partner and select InMobi (as the ad network) to compete for the targeted inventory.

    Note: Please ensure that the CustomClass name is as follows for Banner and Interstitial
    Banner: com.inmobi.plugin.dfp.IMABCustomEventBanner
    Interstitial: com.inmobi.plugin.dfp.IMABCustomEventInterstitial

  8. Click Save to confirm your changes without activating this yield group for delivery. Conversely, click Save and Activate to confirm your changes and immediately approve this yield group for delivery.
  9. Once a yield group has been created and activated, Ad Manager is ready to begin using the yield group to fill requests.
  10. Note: The different recommended price points are shown below in this step:

    Banner Price Points

    Enter the keyword in the "Keyword targeting" in the following format IMAB:0.00 (ex. IMAB:0.50)

    eCPM

    Keyword

    eCPM

    Keyword

    <0.05

    IMAB:0.05

    1

    IMAB:1.00

    0.1

    IMAB:0.10

    1.2

    IMAB:1.20

    0.2

    IMAB:0.20

    1.4

    IMAB:1.40

    0.3

    IMAB:0.30

    1.6

    IMAB:1.60

    0.4

    IMAB:0.40

    1.8

    IMAB:1.80

    0.5

    IMAB:0.50

    2

    IMAB:2.00

    0.6

    IMAB:0.60

    2.5

    IMAB:2.50

    0.7

    IMAB:0.70

    3

    IMAB:3.00

    0.8

    IMAB:0.80

    3.5

    IMAB:3.50

    0.9

    IMAB:0.90

    >4.00

    IMAB:4.00


    Interstitial Price Points

    Enter the keyword in the "Keyword targeting" in this format IMAB:0.00 (ex. IMAB:0.50)

    eCPM

    Keyword

    eCPM

    Keyword

    <0.50

    IMAB:0.50

    7

    IMAB:7.00

    1

    IMAB:1.00

    8

    IMAB:8.00

    1.5

    IMAB:1.50

    9

    IMAB:9.00

    2

    IMAB:2.00

    10

    IMAB:10.00

    2.5

    IMAB:2.50

    12

    IMAB:12.00

    3

    IMAB:3.00

    14

    IMAB:14.00

    3.5

    IMAB:3.50

    16

    IMAB:16.00

    4

    IMAB:4.00

    18

    IMAB:18.00

    4.5

    IMAB:4.50

    20

    IMAB:20.00

    5

    IMAB:5.00

    22

    IMAB:22.00

    6

    IMAB:6.00

    >24.00

    IMAB:24.00

Step 1.4.1.1.2: Updating Integration Details for Audience Bidding

For Audience Bidding, here are the required changes that you'll need to do in our code:

  1. Integration Step 1: Add additional imports

    Our IMAudienceBidder will have most the necessary classes you'll need for working with our bidder.

    import com.inmobi.plugin.dfp.IMAudienceBidder;
    		

  2. Integration Step 2: Initialize the InMobi Audience Bidder

    You MUST initialize the InMobi Audience Bidder before you make an ad request. Typically, the initialization step may take up to 10 seconds. The initialize method will take in the current context and your application site ID (from the InMobi platform). If you have problems finding this information, reach out to your account manager.

    InMobiAudienceBidder.initialize(this, IMAB_SITE_ID);
    		

    You may also initialize the InMobi Audience Bidder SDK with a GDPR consent object.

    JSONObject consentObject = new JSONObject();
    try {
       // Provide correct consent value to sdk which is obtained by User
       consentObject.put(InMobiSdk.IM_GDPR_CONSENT_AVAILABLE, true);
      // Provide 0 if GDPR is not applicable and 1 if applicable 
       consentObject.put("gdpr", "0");
      // Provide user consent in IAB format
       consentObject.put(InMobiSdk.IM_GDPR_CONSENT_IAB, “<<consent in IAB format>>”);
    } catch (JSONException e) {
       e.printStackTrace();
    }
    InMobiAudienceBidder.initialize(this, IMAB_SITE_ID, consentObject);
    		

  3. Integration Step 3: Get the singleton instance of the IMAudienceBidder

    Our IMAudienceBidder class will power the majority of the bidding functionality.

    IMAudienceBidder inMobiAudienceBidder = IMAudienceBidder.getInstance();
    		

  4. Integration Step 4: Create a BidToken for later

    To easily support banner refresh and subsequent ad requests for the InMobi Audience Bidder, InMobi provides a BidToken that you may use. InMobi recommends retaining a reference to this. Our bid methods will return this BidToken which you can then call our refreshBid on. Our bid token constructor will require you to pass in an InMobi placement (PLC). Contact your InMobi account manager if you have any questions about this.

    private IMAudienceBidder.BidToken bidToken;
    		

  5. Integration Step 5: Make an Ad request using the BidToken

    This step can be broken down into a couple smaller parts. Full example snippets for banner and interstitial are available below.

    1. Create a PublisherAdRequest.Builder object and ensure build is not called on this object.
    2. The banner bidder has a constructor method that will accept the current context, InMobi banner placement, PublisherAdRequest.Builder, and a listener ( IMAudienceBidderBannerListener)
    3. The interstitial bidder has a constructor method that will accept the current context, InMobi interstitial placement, PublisherAdRequest.Builder, and a listener( IMAudienceBidderInterstitialListener)
    4. You may define multiple bidTokens.
    5. Both banner and interstitial listeners will define onBidReceived and onBidFailed callback methods that must be implemented.
  6. Option A:

    If you would like for InMobi to handle the keywords (thus simplifying your integration), implement the IMAudienceBidderBannerListener or IMAudienceBidderInterstitialListener interface

    1. For onBidReceived (meaning a bid was received from the InMobi Audience Bidder), you get returned an updated PublisherAdRequest.Builder object. Following this, you have to call build() on this updated object. Finally, use PublisherAdRequest object to call loadAd() on DFP ad object.
    2. For onBidFailed (meaning InMobi Audience Bidder failed to give a bid), you get returned a reference of the PublisherAdRequest.Builder object with unmodified keywords. You then may call loadAd() on this DFP ad object.

    Banner Code Examples

      // Use a Boolean to keep track so we don't call loadAd() on the banner repeatedly.
      public Boolean bannerLoaded = false;
      bannerBidToken = inMobiAudienceBidder.createBidToken(this, AB_BannerPLC, builder, dipViewWidth, dipViewHeight, new IMAudienceBidder.IMAudienceBidderBannerListener()
      {
    @Override public void onBidReceived(@NonNull final PublisherAdRequest.Builder adRequestBuilder)
      {
      // Bid was received from InMobi Audience Bidder. Call loadAd() on the updated ad object.
      // If the banner has not yet been loaded, call loadAd() to load the ad into the view
      if (!bannerLoaded) {
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherAdView.loadAd(publisherAdRequest);
    }
      @Override public void onBidFailed(@NonNull PublisherAdRequest.Builder adRequestBuilder, @NonNull final Error error)
      {
      // No Bid received from InMobi Audience Bidder. Call loadAd() on the ad object.
      // If the banner has not yet been loaded, call loadAd() on the updated ad view
      if (!bannerLoaded) {
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherAdView.loadAd(publisherAdRequest);
      }
      }
      });
      // Call update bid to start this process 
      bannerBidToken.updateBid();
      });
    		

    Interstitial Code Examples

      interstitialBidToken = inMobiAudienceBidder.createBidToken(Activity.this, AB_InterstitialPLC, adRequestBuilder, new IMAudienceBidder.IMAudienceBidderInterstitialListener()
      {
    @Override public void onBidReceived(@NonNull final PublisherAdRequest.Builder adRequestBuilder)
      {
      // Bid was received from InMobi Audience Bidder. You may call load() on the updated ad object.
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherInterstitialAd.loadAd(publisherAdRequest);
      @Override public void onBidFailed(@NonNull PublisherAdRequest.Builder adRequestBuilder, @NonNull final Error error) 
      {
      // No Bid received from InMobi Audience Bidder. You may call load() on the ad object.
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherInterstitialAd.loadAd(publisherAdRequest);
      // Then, call update bid to kick off the bidding process 
      interstitialBidToken.updateBid();
      });
    		

    Option B:

    If you would like to handle the keywords yourself instead, you may instead implement the IMAudienceBidderBannerKeywordListener or IMAudienceBidderInterstitialKeywordListener interface. In addition, you will have to call addCustomTargeting() on the PublisherAdRequest.Builder object.

    • For onBidReceived (meaning a bid was received from the InMobi Audience Bidder), you get returned a IMABBidResponse. You can then retrieve the following pieces of information from the IMABBidResponse:
      • getPlacement() - Returns a String that describes the InMobi placement
      • getBuyer() - Returns a String that describes the buyer
      • getPrice() - Returns a Double that describes the price
      • getBidKeyword() - Returns a String that describes a keyword that should be provided to the PublisherAdRequest.Builder object
      • getGranularKeyword() - Returns a String that describes a granular keyword

    • For onBidFailed (meaning InMobi Audience Bidder failed to give a bid), you get returned an error. You then can call loadAd() on the original DFP ad object .

    Banner Code Examples

    You will handle the keywords in this example. You will need to ensure PublisherAdRequest.Builder object is not null first. Below is an example of what you might do in your banner configuration code.

      Bundle metadata = new Bundle();
      metadata.putString(IMAudienceBidder.IMAB_PLACEMENT, placement);
      adRequestBuilder.addCustomEventExtrasBundle(IMABCustomEventBanner.class, metadata);
    		

    The key difference with this integration path is that you'll need to call setKeywords() yourself by retrieving the value from the IMABBidResponse.

      // Use a Boolean to keep track so we don't call loadAd() on the banner repeatedly.
      public Boolean bannerLoaded = false;
      bannerBidToken = inMobiAudienceBidder.createBidToken(this, AB_BannerPLC, dfpViewWidth, dfpviewHeight, new IMAudienceBidder.IMAudienceBidderBannerKeywordListener()
      {
      	@Override public void onBidReceived(IMAudienceBidder.IMABBidResponse imabBidResponse)
      {
      // Bid was received from InMobi Audience Bidder.
      // Parse the imaBidResponse for any additional information you need, and set them here as desired.
      adRequestBuilder.addCustomTargeting(IMAudienceBidder.IMAB_KEY, imabBidResponse.getBidKeyword());
      // If the banner has not yet been loaded, call loadAd to load the ad into the view
      if (!bannerLoaded) {
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherAdView.loadAd(publisherAdRequest);
      }
      @Override public void onBidFailed(Error error)
      {
      // No Bid received from InMobi Audience Bidder. Call loadAd on your DFP view once you are ready.
      // Error handling here as desired
      // If the banner has not yet been loaded, call loadAd to load the ad into the view
      if (!bannerLoaded) {
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherAdView.loadAd(publisherAdRequest);
      }
      }
      });
      // Call update bid to start this process 
      bannerBidToken.updateBid();
      });
    		

    For more information about DFP banner implementation specifics, you can consult the relevant DFP documentation here: https://developers.google.com/ad-manager/mobile-ads-sdk/android/banner


    Interstitial Code Examples

    You will handle the keywords in this example. You will need to ensure PublisherAdRequest.Builder object is not null first. Below is an example of what you might do in your interstitial configuration code.

      Bundle metadata = new Bundle();
      metadata.putString(IMAudienceBidder.IMAB_PLACEMENT, placement);
      adRequestBuilder.addCustomEventExtrasBundle(IMABCustomEventBanner.class, metadata);
    		

    The key difference with this integration path is that you'll need to call setKeywords() yourself by retrieving the value from the IMABBidResponse.

      interstitialBidToken = inMobiAudienceBidder.createBidToken(this, AB_InterstitialPLC, new IMAudienceBidder.IMAudienceBidderInterstitialKeywordListener()
      {
    @Override public void onBidReceived(IMAudienceBidder.IMABBidResponse imabBidResponse)
      {
      // Bid was received from InMobi Audience Bidder.
      // Parse the imaBidResponse for any additional information you need, and set them here as desired.
      adRequestBuilder.addCustomTargeting(IMAudienceBidder.IMAB_KEY, imabBidResponse.getBidKeyword());
      // Call load on the interstitial after all keywords have been set
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherInterstitialAd.loadAd(publisherAdRequest);
      @Override public void onBidFailed(Error error) 
      {
    // No bid received - you may call load on the interstitial after any additional keywords have been set
      // Error handling here as desired
      PublisherAdRequest publisherAdRequest = adRequestBuilder.build();
      mPublisherInterstitialAd.loadAd(publisherAdRequest);
      }})
      // Then, call update bid to kick off the bidding process
      interstitialBidToken.updateBid();
      });
    		

    Remember to show the interstitial! Consult DFP documentation here regarding interstitials:

    https://developers.google.com/ad-manager/mobile-ads-sdk/android/interstitial

    public void onAdLoaded() {
        if (interstitial.isReady()){  
            interstitial.show();
        }
    }
    		

    Integration Step 6: Re-use the interstitial bid token

    You can also re-use the interstitial bid token. As an example, you might include this in the onAdClosed callback from DFP.

    // Update bid for the next ad call 
    interstitialBidToken.updateBid();
    		


    Step 1.4.1.1.3: Testing your Audience Bidding Integration

    In order to test your Audience Bidding implementation, you will need to:

    • Make sure you enable test mode on your placement through the UI
    • Set up a line item with:
      • CPM 0.00
      • Keyword: IMAB:0.00

    Two ways to verify:

    • Through Charles:
    • Through DFP Reporting:
      1. Make sure the ad filled on testing.
      2. Make sure the numbers align for the newly generated line item at $0.00 (It might take a few minutes for DFP to report it).

Step 1.4.2: Non-Audience Bidding

Perform the following steps to initiate non-Audience bidding:

Step 1.4.2.1: Add DFP to InMobi Adapter

Add the following files from dist/network-support/DFP/AerServCustomEvents to your project:

Step 1.4.2.2: Configure Ad Setup on DFP Dashboard

Enter the following information:

a. Class Name: Use one of the following class names:

  • For Banner: AerServDFPCustomEventBanner
  • For Interstitial: AerServDFPCustomEventInterstitial

b. Parameter: AerServ platform ad parameters, in JSON format.

Step 1.4.2.3: Map Plugin Events

AerServ banner events are mapped to DFP's CustomEventBanner events, in the following manner:

  • AD_LOADED → onAdLoaded()
  • AD_FAILED → onAdFailedToLoad()
  • AD_CLICKED → onAdClicked() & onAdLeftApplication()
  • AD_DISMISSED → onAdClosed()

AerServ interstitial events are mapped to DFP's CustomEventInterstital events, in the following manner:

  • PRELOADY_READY → onAdLoaded()
  • AD_FAILED → onAdFailedToLoad()
  • AD_DISMISSED → onAdClosed()
  • AD_IMPRESSION → onAdOpened()
  • AD_CLICKED → onAdClicked() & onAdLeftApplication()

Version History

SDK 9.0

  • 9.0.1: 10/25/19
    • Added support for IAB GDPR consent string
    • Updated OMSDK to v1.2.19
    • Added Banner refresh support from SSUI
    • Added support for Facebook Audience Network 5.5
    • Bug Fixes for SDK and AudienceBidder Plugin
  • 9.0.0: 9/20/19
    • Modular SDK

      - Added an ability to integrate Mediation as a separate module.

    • Added support for Android 10
    • Support for Mopub 5.8
    • Interface changes through APIs

      - AerServTransactionInformation

      public String getCreativeID()

    • Bug fixes and performance improvements
  • 8.2.1: 8/22/19
    • Bug Fixes for SDK and AudienceBidder Plugin
  • 8.2.0: 8/5/19
    • Chrome Custom tabs support
    • Thread Optimizations
    • Bug Fixes for SDK and AudienceBidder Plugin
  • 8.1.3: 7/18/19
    • Support for Audience Bidding for DFP
    • Bug Fixes
  • 8.1.2: 6/19/19
    • Updated AdColony SDK support to 3.3.10
    • Updated Audience Network (Facebook) support to 5.3.1
  • 8.1.1: 5/27/19
    • Support for new Picasso version 2.71828
    • Bug Fixes
  • 8.1.0: 5/14/19
    • DFP Plugin Support
    • Mopub Audience Bidding Plugin Keyword Handling
  • 8.0.9: 4/22/19
    • Bug Fixes
  • 8.0.8: 4/17/19
    • Bug Fixes
  • 8.0.7: 4/5/19
    • Bug Fixes
    • Updated AudienceBidder to v1.0.1
      • Support for granular keywords
      • Fixed issue with updateBid not working with MoPub's refresh
      • Replaced source file with a aar
      • Various API Changes (see documentation)
  • 8.0.5: 3/11/19
    • Audience Bidder for the Mopub Plugin
    • Telaria Adapter Deprecation
    • Flurry Banner Adapter Deprecation
    • Applovin 3rd Party API Reporting updates
    • Chartboost 3rd Party API Reporting updates
    • Mediated SDK updates
    • Bug Fixes
  • 8.0.1: 11/28/18
    • Unified InMobi + AerServ SDK