Android Migration Guide — BlueStack SDK v5 to v6
This guide covers the breaking changes introduced in BlueStack SDK v6.0.0 for Android and explains how to update your existing v5 integration.
Overview
BlueStack SDK v6 introduces an update that removes the
BlueStack and MNG prefixes from all public API classes
and constants. The underlying functionality remains the same —
only the names have changed. This makes the SDK more neutral
and easier to integrate across different publishing environments.
SDK Initialization
The main entry point for initializing the SDK has been
renamed from BlueStack to MobileAds.
Before (v5)
- Java
- Kotlin
import com.azerion.bluestack.BlueStack;
import com.azerion.bluestack.initialization.InitializationListener;
import com.azerion.bluestack.initialization.InitializationStatus;
class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BlueStack.INSTANCE.initialize(this, "YOUR_APP_ID", initializationStatus -> {
initializationStatus.getAdapterStatusMap().forEach((adNetworkName, adapterStatus) ->
Log.d(TAG, "name: " + adapterStatus.getName() + ", state: " + adapterStatus.getState())
);
});
}
}
import com.azerion.bluestack.BlueStack
import com.azerion.bluestack.initialization.InitializationListener
import com.azerion.bluestack.initialization.InitializationStatus
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
BlueStack.initialize(this, "YOUR_APP_ID", object : InitializationListener {
override fun onInitialized(status: InitializationStatus) {
status.adapterStatusMap.forEach { (adNetworkName, adapterStatus) ->
Log.d(TAG, "name: ${adapterStatus.name}, state: ${adapterStatus.state}")
}
}
})
}
}
After (v6)
- Java
- Kotlin
import com.azerion.bluestack.MobileAds;
import com.azerion.bluestack.initialization.InitializationListener;
import com.azerion.bluestack.initialization.SDKInitializationStatus;
class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MobileAds.INSTANCE.initialize(this, "YOUR_APP_ID", initializationStatus -> {
initializationStatus.getMediationAdapterStatusMap().forEach((adNetworkName, adapterStatus) ->
Log.d(TAG, "name: " + adapterStatus.getName() + ", state: " + adapterStatus.getState())
);
});
}
}
import com.azerion.bluestack.MobileAds
import com.azerion.bluestack.initialization.InitializationListener
import com.azerion.bluestack.initialization.SDKInitializationStatus
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MobileAds.initialize(this, "YOUR_APP_ID", object : InitializationListener {
override fun onInitialized(status: SDKInitializationStatus) {
status.mediationAdapterStatusMap.forEach { (adNetworkName, adapterStatus) ->
Log.d(TAG, "name: ${adapterStatus.name}, state: ${adapterStatus.state}")
}
}
})
}
}
Privacy Settings
The privacy settings class has been renamed
from BlueStackPrivacySettings to PrivacySettings.
Before (v5)
- Java
- Kotlin
BlueStackPrivacySettings.setIsAgeRestrictedUser(true, context);
BlueStackPrivacySettings.setIsUserOptOut(true, context);
BlueStackPrivacySettings.setIsAgeRestrictedUser(true, context)
BlueStackPrivacySettings.setIsUserOptOut(true, context)
After (v6)
- Java
- Kotlin
PrivacySettings.setIsAgeRestrictedUser(true, context);
PrivacySettings.setIsUserOptOut(true, context);
PrivacySettings.setIsAgeRestrictedUser(true, context)
PrivacySettings.setIsUserOptOut(true, context)
Error Handling
The error class AdError and all error constant names remain unchanged in v6.
All existing error constants from v5 work exactly the same way in v6.
Error Constants (Unchanged)
| Error Constant | Error Code | Description |
|---|---|---|
AdError.WRONG_PLACEMENT_ERROR | 0 | Invalid placement ID |
AdError.NO_INTERNET_ERROR | 1 | No internet connection |
AdError.SDK_UNINITIALIZED_ERROR | 2 | SDK not initialized |
AdError.CAPPED_REQUEST_ERROR | 3 | Request limit reached |
AdError.LOCKED_PLACEMENT_ERROR | 4 | Placement locked by another factory |
AdError.BUSY_FACTORY_ERROR | 5 | Factory is busy |
AdError.NO_AD_ERROR | 7 | No ad available |
AdError.INTERSTITIAL_COOLDOWN_ERROR | 8 | Interstitial cooldown active |
AdError.INTERSTITIAL_ALREADY_SHOWN_ERROR | 9 | Interstitial already shown |
AdError.TIME_OUT_ERROR | 10 | Ad request timed out |
AdError.ADAPTER_NOT_FOUND_ERROR | 11 | Mediation adapter not found |
AdError.BLOCKED_BY_GDPR | 12 | Request blocked by GDPR |
AdError.AD_EXPIRED | 13 | Ad has expired |
New Error in v6
| Error Constant | Error Code | Description |
|---|---|---|
AdError.NO_ADAPTER_FOUND_FOR_PLACEMENT_ID | 14 | No adapter configured for specific placement ID |
Since error constants are unchanged, your existing error handling code will work without modifications in v6.
Native Ads
The native ad classes have been renamed
to remove the MNG prefix.
The ad loading, rendering, and interaction logic remains the same.
Class Renames
| v5 (Old) | v6 (New) |
|---|---|
MNGAdsFactory | AdsFactory |
MNGNativeObject | NativeObject |
MNGPreference | Preference |
MNGGender | Gender |
Factory Initialization
Before (v5)
- Java
- Kotlin
MNGAdsFactory mngAdsNativeAdsFactory = new MNGAdsFactory(getActivity());
mngAdsNativeAdsFactory.setPlacementId("/YOUR_APP_ID/PLACEMENT_ID");
val mngAdsNativeAdsFactory = MNGAdsFactory(activity)
mngAdsNativeAdsFactory.setPlacementId("/YOUR_APP_ID/PLACEMENT_ID")
After (v6)
- Java
- Kotlin
AdsFactory adsNativeAdsFactory = new AdsFactory(getActivity());
adsNativeAdsFactory.setPlacementId("/YOUR_APP_ID/PLACEMENT_ID");
val adsNativeAdsFactory = AdsFactory(activity)
adsNativeAdsFactory.setPlacementId("/YOUR_APP_ID/PLACEMENT_ID")
Loading with Preferences
Before (v5)
- Java
- Kotlin
MNGPreference mngPreference = new MNGPreference();
mngPreference.setAge(28);
mngPreference.setGender(MNGGender.MNGGenderFemale);
mngAdsNativeAdsFactory.loadNative(mngPreference);
val mngPreference = MNGPreference()
mngPreference.setAge(28)
mngPreference.setGender(MNGGender.MNGGenderFemale)
mngAdsNativeAdsFactory.loadNative(mngPreference)
After (v6)
- Java
- Kotlin
Preference preference = new Preference();
preference.setAge(28);
preference.setGender(Gender.GenderFemale);
adsNativeAdsFactory.loadNative(preference);
val preference = Preference()
preference.setAge(28)
preference.setGender(Gender.GenderFemale)
adsNativeAdsFactory.loadNative(preference)
Native Ad Callbacks
Before (v5)
- Java
- Kotlin
mngAdsNativeAdsFactory.setNativeListener(new NativeListener() {
@Override
public void nativeObjectDidLoad(MNGNativeObject nativeObject) {
Log.d(TAG, "Native ad loaded");
// Use nativeObject to render your custom ad view
}
@Override
public void nativeObjectDidFail(Exception adsException) {
Log.e(TAG, "Native ad failed to load: " + adsException.toString());
}
});
mngAdsNativeAdsFactory.setNativeListener(object : NativeListener {
override fun nativeObjectDidLoad(nativeObject: MNGNativeObject) {
Log.d(TAG, "Native ad loaded")
// Use nativeObject to render your custom ad view
}
override fun nativeObjectDidFail(adsException: Exception) {
Log.e(TAG, "Native ad failed to load: $adsException")
}
})
After (v6)
- Java
- Kotlin
adsNativeAdsFactory.setNativeListener(new NativeListener() {
@Override
public void nativeObjectDidLoad(NativeObject nativeObject) {
Log.d(TAG, "Native ad loaded");
// Use nativeObject to render your custom ad view
}
@Override
public void nativeObjectDidFail(Exception adsException) {
Log.e(TAG, "Native ad failed to load: " + adsException.toString());
}
});
adsNativeAdsFactory.setNativeListener(object : NativeListener {
override fun nativeObjectDidLoad(nativeObject: NativeObject) {
Log.d(TAG, "Native ad loaded")
// Use nativeObject to render your custom ad view
}
override fun nativeObjectDidFail(adsException: Exception) {
Log.e(TAG, "Native ad failed to load: $adsException")
}
})
AdChoice Position
Before (v5)
- Java
- Kotlin
mngPreference.setAdChoicePosition(MNGPreference.TOP_LEFT);
mngPreference.setAdChoicePosition(MNGPreference.TOP_LEFT)
After (v6)
- Java
- Kotlin
preference.setAdChoicePosition(Preference.TOP_LEFT);
preference.setAdChoicePosition(Preference.TOP_LEFT)
Other Ad Format Classes
The other ad format classes (InterstitialAd, RewardedAd,
BannerView) and their listener interfaces remain unchanged
in v6. No migration is needed for those formats.
Quick Find-and-Replace Summary
For most projects, the migration can be completed with a few find-and-replace operations:
| Find | Replace With |
|---|---|
BlueStack.INSTANCE (Java) | MobileAds.INSTANCE |
BlueStack. (Kotlin) | MobileAds. |
BlueStackPrivacySettings | PrivacySettings |
MNGAdsFactory | AdsFactory |
MNGNativeObject | NativeObject |
MNGPreference | Preference |
MNGGender | Gender |
MNGGender.MNGGenderUnknown | Gender.GenderUnknown |
MNGGender.MNGGenderMale | Gender.GenderMale |
MNGGender.MNGGenderFemale | Gender.GenderFemale |
AdSize (banner package) | BannerAdSize |
After running find-and-replace, build your project and fix any remaining compiler errors. The Android Studio compiler will flag any references to the old class names that were missed.
Need Help?
If you encounter issues during migration, please reach out to us. The v5 documentation is still available at Android v5 for reference.
