Flutter Integration (Android)

MAS supports Android version 4.4.+ (Android API level: 19+) and above

1. Open Your Project-Level build.gradle  and Add the repositories in allprojects section

mavenCentral()
maven { url "https://artifact.bytedance.com/repository/pangle" }
maven { url "https://android-sdk.is.com" }
maven { url "https://sdk.tapjoy.com/" }

Use the code bellow if you need to comply with the Google Family Policy.

mavenCentral()
maven { url "https://android-sdk.is.com" }
maven { url "https://sdk.tapjoy.com/" }

2. Open Your App-Level build.gradle and Add the Relevant Code

1. If you’re only targeting children under 13 years of age, please add this Gradle dependency:

implementation 'com.yodo1.mas:google:4.3.2'

2. If you’re targeting all ages, or 13+, use this Gradle dependency:

implementation 'com.yodo1.mas:full:4.3.2'


3. Add MultiDex property to the defaultConfig Section

defaultConfig {
    ...
    multiDexEnabled true
    ...
}


4. Make sure that minSdkVersion is at least 19 in the defaultConfig Section.

defaultConfig {
   ...
   minSdkVersion 19
   ...
}

3. Support AndroidX

Add this content to the gradle.properties file:

android.useAndroidX=true
android.enableJetifier=true

4. Update your AndroidManifest.xml file

  1. Add your AdMob App ID to your app’s AndroidManifest.xml file by including the <meta-data> tag. Your AdMob App ID can be found under the “details” of your app on MAS Dashboard. Please replace android:value with your own AdMob App ID:
<manifest>
	<application>
	<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
	<meta-data
		android:name="com.google.android.gms.ads.APPLICATION_ID"
		android:value="YOUR_ADMOB_APP_ID"/>
	</application>
</manifest>
  1. Add the following line to the manifest tag. 
xmlns:tools="http://schemas.android.com/tools"
  1. Add the following lines to the application tag.
tools:replace="android:label"
tools:targetApi="n"

5. Open the gradle.properties file and add following

  1. which is in the android folder and place your JDK path. Make sure to use JDK 11.
org.gradle.java.home=C:\\Program Files\\Java\\jdk-11.0.10

2. Add following line

android.enableDexingArtifactTransform=false

6. Create a new java file FlutterYodo1Mas.java under the same directory as MainActivity.java

  1. Add the following line at the top of the newly created java file. Make sure to replace the package name.
package com.companyname.projectname;
  1. Add the following code in the file.
import android.app.Activity;
import android.util.Log;

import androidx.annotation.NonNull;

import com.google.gson.JsonObject;
import com.yodo1.mas.Yodo1Mas;
import com.yodo1.mas.error.Yodo1MasError;
import com.yodo1.mas.event.Yodo1MasAdEvent;
import com.yodo1.mas.helper.model.Yodo1MasAdBuildConfig;

import java.util.HashMap;
import java.util.Map;

import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.Result;

public class FlutterYodo1Mas {

   private static FlutterYodo1Mas helper;
   public static FlutterYodo1Mas getInstance() {
       if (helper == null) {
           synchronized (Yodo1Mas.class) {
               if (helper == null) {
                   helper = new FlutterYodo1Mas();
               }
           }
       }
       return helper;
   }

   private static final String CHANNEL = "com.yodo1.mas/sdk";
   private static final String METHOD_NATIVE_INIT_SDK = "native_init_sdk";
   private static final String METHOD_NATIVE_IS_AD_LOADED = "native_is_ad_loaded";
   private static final String METHOD_NATIVE_SHOW_AD = "native_show_ad";

   private static final String METHOD_FLUTTER_INIT_EVENT = "flutter_init_event";
   private static final String METHOD_FLUTTER_AD_EVENT = "flutter_ad_event";
   private static final String DISMISS_BANNER = "dismiss_banner";

   private MethodChannel channel;
   private Activity activity;

   private FlutterYodo1Mas() {
       Yodo1Mas.getInstance().setRewardListener(new Yodo1Mas.RewardListener() {
           @Override
           public void onAdOpened(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdError(@NonNull Yodo1MasAdEvent event, @NonNull Yodo1MasError error) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdClosed(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdvertRewardEarned(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }
       });

       Yodo1Mas.getInstance().setInterstitialListener(new Yodo1Mas.InterstitialListener() {
           @Override
           public void onAdOpened(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdError(@NonNull Yodo1MasAdEvent event, @NonNull Yodo1MasError error) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdClosed(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }
       });
       Yodo1Mas.getInstance().setBannerListener(new Yodo1Mas.BannerListener() {
           @Override
           public void onAdOpened(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdError(@NonNull Yodo1MasAdEvent event, @NonNull Yodo1MasError error) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }

           @Override
           public void onAdClosed(@NonNull Yodo1MasAdEvent event) {
               if (channel != null) {
                   channel.invokeMethod(METHOD_FLUTTER_AD_EVENT, event.getJSONObject().toString());
               }
           }
       });
   }

   public void build(FlutterEngine flutterEngine, Activity activity) {
       this.activity = activity;
       this.channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL);
       this.channel.setMethodCallHandler(
               new MethodChannel.MethodCallHandler() {
                   @Override
                   public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
                       switch (call.method) {
                           case METHOD_NATIVE_INIT_SDK: {
                               String appKey = call.argument("app_key");
                               if (appKey != null) {
                                   initSdk(appKey);
                               }
                               result.success(null);
                               break;
                           }
                           case METHOD_NATIVE_IS_AD_LOADED:{
                               boolean isAdLoaded = false;
                               String type = call.argument("ad_type");
                               if (type != null) {
                                   switch (type) {
                                       case "Reward": {
                                           isAdLoaded = Yodo1Mas.getInstance().isRewardedAdLoaded();
                                           break;
                                       }
                                       case "Interstitial": {
                                           isAdLoaded = Yodo1Mas.getInstance().isInterstitialAdLoaded();
                                           break;
                                       }
                                       case "Banner": {
                                           isAdLoaded = Yodo1Mas.getInstance().isBannerAdLoaded();
                                           break;
                                       }
                                   }
                               }
                               result.success(isAdLoaded);
                               break;
                           }
                           case METHOD_NATIVE_SHOW_AD: {
                               String type = call.argument("ad_type");
                               if (type != null) {
                                   switch (type) {
                                       case "Reward": {
                                           Yodo1Mas.getInstance().showRewardedAd(FlutterYodo1Mas.this.activity);
                                           break;
                                       }
                                       case "Interstitial": {
                                           Yodo1Mas.getInstance().showInterstitialAd(FlutterYodo1Mas.this.activity);
                                           break;
                                       }
                                       case "Banner": {
                                           Yodo1Mas.getInstance().showBannerAd(FlutterYodo1Mas.this.activity);
                                           break;
                                       }
                                   }
                               }
                               result.success(null);
                               break;
                           }
                           case DISMISS_BANNER: {
                               Yodo1Mas.getInstance().dismissBannerAd();
                               result.success(null);
                               break;
                           }
                       }
                   }
               }
       );
   }

   private void initSdk(@NonNull String appKey) {
       Yodo1MasAdBuildConfig config = new Yodo1MasAdBuildConfig.Builder().enableUserPrivacyDialog(true).build();
       Yodo1Mas.getInstance().setAdBuildConfig(config);
       Yodo1Mas.getInstance().init(activity, appKey, new Yodo1Mas.InitListener() {
           @Override
           public void onMasInitSuccessful() {
               if (channel != null) {
                   JsonObject json = new JsonObject();
                   json.addProperty("successful", true);
                   Log.d(FlutterYodo1Mas.CHANNEL, "调用Flutter方法 - " + METHOD_FLUTTER_INIT_EVENT);
                   Map<String, String> args = new HashMap<>();
                   args.put("successful", "true");
                   channel.invokeMethod(METHOD_FLUTTER_INIT_EVENT, args);
               }
           }

           @Override
           public void onMasInitFailed(@NonNull Yodo1MasError error) {
               if (channel != null) {
                   JsonObject json = new JsonObject();
                   json.addProperty("successful", false);
                   json.addProperty("error", error.getJsonObject().toString());
                   channel.invokeMethod(METHOD_FLUTTER_INIT_EVENT, json.toString());
               }
           }
       });
   }
}

7. In your MainActivity.java file add the following

  1. Add these libraries at the top
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;

2. Add these methods in the MainActivity class

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
}

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
   super.configureFlutterEngine(flutterEngine);
   FlutterYodo1Mas.getInstance().build(flutterEngine, this);
}

8. Create a new Dart file named ‘Yodo1Mas’ under the same directory as main.dart

Put the following code in the newly created dart file.

import 'package:flutter/services.dart';
import 'dart:convert';

class Yodo1Mas {
 static const _CHANNEL = "com.yodo1.mas/sdk";
 static const _METHOD_NATIVE_INIT_SDK = "native_init_sdk";
 static const _METHOD_NATIVE_IS_AD_LOADED = "native_is_ad_loaded";
 static const _METHOD_NATIVE_SHOW_AD = "native_show_ad";
 static const _METHOD_FLUTTER_INIT_EVENT = "flutter_init_event";
 static const _METHOD_FLUTTER_AD_EVENT = "flutter_ad_event";
 static const _METHOD_DISMISS_BANNER = "dismiss_banner";


 static const AD_TYPE_REWARD = 1;
 static const AD_TYPE_INTERSTITIAL = 2;
 static const AD_TYPE_BANNER = 3;

 static const AD_EVENT_OPENED = 1001;
 static const AD_EVENT_CLOSED = 1002;
 static const AD_EVENT_ERROR = 1003;
 static const AD_EVENT_EARNED = 2001;

 static const _channel = const MethodChannel(_CHANNEL);

 Yodo1Mas._privateConstructor();
 static final Yodo1Mas instance = Yodo1Mas._privateConstructor();

 Function(bool successful)? _initCallback;
 Function(int event, String message)? _rewardCallback;
 Function(int event, String message)? _interstitialCallback;
 Function(int event, String message)? _bannerCallback;

 void init(String appKey, Function(bool successful)? callback) {
   _initCallback = callback;

   _channel.setMethodCallHandler((call) {
     switch(call.method) {
       case _METHOD_FLUTTER_INIT_EVENT: {
         bool successful = call.arguments["successful"];
         if (_initCallback != null) {
           _initCallback!(successful);
         }
         return Future<bool>.value(true);
       }
       case _METHOD_FLUTTER_AD_EVENT: {
         Map<String, dynamic> map = json.decode(call.arguments);
         int type = map["type"];
         int code = map["code"];
         String message = map["message"];
         switch (type) {
           case AD_TYPE_REWARD:
             if (_rewardCallback != null) {
               _rewardCallback!(code, message);
             }
             break;
           case AD_TYPE_INTERSTITIAL:
             if (_interstitialCallback != null) {
               _interstitialCallback!(code, message);
             }
             break;
           case AD_TYPE_BANNER:
             if (_bannerCallback != null) {
               _bannerCallback!(code, message);
             }
             break;
         }

         return Future<bool>.value(true);
       }
     }
     return Future<bool>.value(true);
   });
   _channel.invokeMethod(_METHOD_NATIVE_INIT_SDK, {"app_key": appKey});
 }

 void setRewardListener(Function(int event, String message)? callback) {
   _rewardCallback = callback;
 }

 void setInterstitialListener(Function(int event, String message)? callback) {
   _interstitialCallback = callback;
 }

 void setBannerListener(Function(int event, String message)? callback) {
   _bannerCallback = callback;
 }

 Future<bool?> isRewardAdLoaded() {
   return _channel.invokeMethod<bool>(_METHOD_NATIVE_IS_AD_LOADED, {"ad_type" : "Reward"});
 }

 void showRewardAd() {
   _channel.invokeMethod(_METHOD_NATIVE_SHOW_AD, {"ad_type" : "Reward"});
 }

 Future<bool?> isInterstitialAdLoaded() {
   return _channel.invokeMethod<bool>(_METHOD_NATIVE_IS_AD_LOADED, {"ad_type" : "Interstitial"});
 }

 void showInterstitialAd() {
   _channel.invokeMethod(_METHOD_NATIVE_SHOW_AD, {"ad_type" : "Interstitial"});
 }

 Future<bool?> isBannerAdLoaded() {
   return _channel.invokeMethod<bool>(_METHOD_NATIVE_IS_AD_LOADED, {"ad_type" : "Banner"});
 }

 void showBannerAd() {
   _channel.invokeMethod(_METHOD_NATIVE_SHOW_AD, {"ad_type" : "Banner"});
 }

 void dismissBannerAd() {
   _channel.invokeMethod(_METHOD_DISMISS_BANNER);
 }
}

9. Comply With Legal Frameworks

Please comply with all legal frameworks that apply to your game and its users. You can find references to major legal frameworks and details about how to comply with them while using MAS through these links:

If you’re using MAS 4.3.0+, you can enable the built-in privacy compliance dialog in the SDK to collect user information:

  1. Enable (Before the initialization)
Yodo1MasAdBuildConfig config = new Yodo1MasAdBuildConfig.Builder().enableUserPrivacyDialog(true).build();    
Yodo1Mas.getInstance().setAdBuildConfig(config);
  1. Custom user agreement (optional)
Yodo1MasAdBuildConfig config = new Yodo1MasAdBuildConfig.Builder().enableUserPrivacyDialog(true).userAgreementUrl("Your user agreement url").build();    
Yodo1Mas.getInstance().setAdBuildConfig(config);
  1. Custom privacy policy (optional)
Yodo1MasAdBuildConfig config = new Yodo1MasAdBuildConfig.Builder().enableUserPrivacyDialog(true).privacyPolicyUrl("Your privacy policy url").build();    
Yodo1Mas.getInstance().setAdBuildConfig(config);

IMPORTANT! Failure to comply with these frameworks can lead to Google Play Store rejecting your game, as well as a negative impact of your game’s monetization.

10. Initialize the SDK

Initialize the SDK by using the onCreate method of Activity.

protected void onCreate() {
    super.onCreate();
    Yodo1Mas.getInstance().init(this, "Your Appkey", new Yodo1Mas.InitListener() {
      @Override
      public void onMasInitSuccessful() {
    }

    @Override
    public void onMasInitFailed(@NonNull Yodo1MasError error) {
    }
    });
}
  • Note: Please use your Appkey for initialization, not the Admob App ID. Your Appkey can be found under the “details” of your app on MAS Dashboard.

11. Show the ads

You can use the following methods for the different types of ads.

Show a banner

Yodo1Mas.instance.showBannerAd();

Hide a banner

Yodo1Mas.instance.dismissBannerAd();

Show an interstitial

Yodo1Mas.instance.showInterstitialAd();

Show a rewarded video

Yodo1Mas.instance.showRewardAd();

12. Set Delegates

For the banners

Yodo1Mas.instance.setBannerListener((event, message) {
 switch(event) {
   case Yodo1Mas.AD_EVENT_OPENED:
     print('Banner AD_EVENT_OPENED');
     break;
   case Yodo1Mas.AD_EVENT_ERROR:
     print('Banner AD_EVENT_ERROR' + message);
     break;
   case Yodo1Mas.AD_EVENT_CLOSED:
     print('Banner AD_EVENT_CLOSED');
     break;
 }
});

For the interstitials

Yodo1Mas.instance.setInterstitialListener((event, message) {
 switch(event) {
   case Yodo1Mas.AD_EVENT_OPENED:
     print('Interstitial AD_EVENT_OPENED');
     break;
   case Yodo1Mas.AD_EVENT_ERROR:
     print('Interstitial AD_EVENT_ERROR' + message);
     break;
   case Yodo1Mas.AD_EVENT_CLOSED:
     print('Interstitial AD_EVENT_CLOSED');
     break;
 }
});

For the rewarded videos

Yodo1Mas.instance.setRewardListener((event, message) {
 switch(event) {
   case Yodo1Mas.AD_EVENT_OPENED:
     print('RewardVideo AD_EVENT_OPENED');
     break;
   case Yodo1Mas.AD_EVENT_ERROR:
     print('RewardVideo AD_EVENT_ERROR' + message);
     break;
   case Yodo1Mas.AD_EVENT_CLOSED:
     print('RewardVideo AD_EVENT_CLOSED');
     break;
   case Yodo1Mas.AD_EVENT_EARNED:
     print('RewardVideo AD_EVENT_EARNED');
     break;
 }
});

13. ProGuard

If you’re using ProGuard with the MAS SDK, add the following code to your ProGuard file (Android Studio: proguard-rules.pro or Eclipse: proguard-project.txt):

-ignorewarnings
-keeppackagenames com.yodo1.**
-keep class com.yodo1.** { *; }
-keep class com.yodo1.mas.** { *; }
-keep class com.yodo1.mas.ads.** {*;}
-keep class com.yodo1.mas.error.** { *; }
-keep class com.yodo1.mas.event.** { *; }
-keep public class * extends com.yodo1.mas.mediation.Yodo1MasAdapterBase -keep class com.google.ads.** { *; } -keepclassmembers class com.ironsource.sdk.controller.IronSourceWebView$JSInterface { public *; } -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keep public class com.google.android.gms.ads.** { public *; } -keep class com.ironsource.adapters.** { *; } -dontwarn com.ironsource.mediationsdk.** -dontwarn com.ironsource.adapters.** -dontwarn com.moat.** -keep class com.moat.** { public protected private *; } -keepattributes SourceFile,LineNumberTable -keepattributes JavascriptInterface -keep class android.webkit.JavascriptInterface { *; } -keep class com.unity3d.ads.** { *; } -keep class com.unity3d.services.** { *; } -dontwarn com.google.ar.core.** -dontwarn com.unity3d.services.** -dontwarn com.ironsource.adapters.unityads.** -keepattributes Signature,InnerClasses,Exceptions,Annotation -keep public class com.applovin.sdk.AppLovinSdk{ *; } -keep public class com.applovin.sdk.AppLovin* { public protected *; } -keep public class com.applovin.nativeAds.AppLovin* { public protected *; } -keep public class com.applovin.adview.* { public protected *; } -keep public class com.applovin.mediation.* { public protected *; } -keep public class com.applovin.mediation.ads.* { public protected *; } -keep public class com.applovin.impl.*.AppLovin { public protected *; } -keep public class com.applovin.impl.**.*Impl { public protected *; } -keepclassmembers class com.applovin.sdk.AppLovinSdkSettings { private java.util.Map localSettings; } -keep class com.applovin.mediation.adapters.** { *; } -keep class com.applovin.mediation.adapter.**{ *; } -keep class com.chartboost.** { *; } -dontwarn com.facebook.ads.internal.** -keeppackagenames com.facebook.* -keep public class com.facebook.ads.** {public protected *;} -keep class com.tapjoy.** { *;} -keep class com.moat.** { *;} -keepattributes JavascriptInterface -keepattributes *Annotation* -keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; } -keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; } -keep class com.google.android.gms.ads.identifier.** { *;} -dontwarn com.tapjoy.** -keep class com.vungle.warren.** { *;} -dontwarn com.vungle.warren.error.VungleError$ErrorCode -keep class com.moat.** { *;} -dontwarn com.moat.** -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement -dontwarn okio.** -dontwarn retrofit2.Platform$Java8 -keepattributes Signature -keepattributes *Annotation* -dontwarn sun.misc.** -keep class com.google.gson.examples.android.model.** { *;} -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer -keep class com.google.android.gms.internal.** { *;} -dontwarn com.google.android.gms.ads.identifier.** -keepattributes SourceFile,LineNumberTable -keep class com.my.target.** {*;} -keep class com.yandex.mobile.ads.** {*;} -dontwarn com.yandex.mobile.ads.** -keepattributes *Annotation* -keep public class com.bytedance.sdk.openadsdk.*{ public *;} -dontwarn com.tencent.bugly.** -keep public class com.tencent.bugly.**{*;} -dontwarn com.sensorsdata.analytics.android.** -keep class com.sensorsdata.analytics.android.** { *; } -keep class com.yodo1.sensor.** { *; } -keep class **.R$* { <fields>; } -keep public class * extends android.content.ContentProvider -keepnames class * extends android.view.View -keep class * extends android.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } -keep class android.support.v4.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } -keep class * extends android.support.v4.app.Fragment { public void setUserVisibleHint(boolean); public void onHiddenChanged(boolean); public void onResume(); public void onPause(); } -dontwarn org.json.** -keep class org.json.**{*;} -keep public class com.bytedance.sdk.openadsdk.*{ public *; } -keepattributes SourceFile,LineNumberTable -keep class com.inmobi.** { *; } -keep public class com.google.android.gms.** -dontwarn com.google.android.gms.** -dontwarn com.squareup.picasso.** -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient{ public *; } -keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info{ public *; } # skip the Picasso library classes -keep class com.squareup.picasso.** {*;} -dontwarn com.squareup.okhttp.** # skip Moat classes -keep class com.moat.** {*;} -dontwarn com.moat.** # skip IAB classes -keep class com.iab.** {*;} -dontwarn com.iab.** -keep class com.umeng.** {*;} -keep class com.uc.** {*;} -keepclassmembers class * { public <init> (org.json.JSONObject); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class com.zui.** {*;} -keep class com.miui.** {*;} -keep class com.heytap.** {*;} -keep class a.** {*;} -keep class com.vivo.** {*;} -keep class com.uc.crashsdk.** { *; } -keep interface com.uc.crashsdk.** { *; }

For next step please test your integration.

Updated on November 26, 2021

Was this article helpful?

Related Articles