Получение java.lang.NoClassDefFoundError для рекламных вставок на некоторых устройствах - PullRequest
1 голос
/ 22 марта 2019

Play Store сообщает о сбоях в новейшей версии AdMob на некоторых устройствах:

java.lang.NoClassDefFoundError: 
  at jq.b (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):3)
  at jp.a (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):3)
  at jr.a (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):19)
  at com.google.android.gms.ads.internal.util.ar.a (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):15)
  at iu.a (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):20)
  at iu.run (com.google.android.gms.dynamite_adsdynamite@15090081@15.0.90 (100400-231259764):8)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:134)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
  at ad.loadClass (com.google.android.gms.dynamite_dynamiteloader@15090081@15.0.90 (100400-231259764):4)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)

Я обновил свой файл Gradle, чтобы использовать новейшую targetSdkVersion 28 и новейший AdMob SDK 17.2.0. Но у меня были конфликты с разными версиями библиотек com.android.support. Мне удалось правильно скомпилировать, «форсируя» библиотеки com.android.support в версии 28.0.0. Может быть, это вызывает проблему? Я не делаю ничего особенного, только включая admob, facebook, firebase, ... Этот же код приложения работает без сбоев для более старой targetSdkVersion.

Также я заметил, что есть возможность добавлять рекламу через firebase, которая использует другую реализацию lib 'com.google.firebase: firebase-ads: 17.2.0' и различные классы и запрашивает разные данные в манифесте.

Вот мой файл Gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 373
        versionName "4.0.6"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    flavorDimensions "tier"
    productFlavors {
       playStoreFree {
            ...
            dimension "tier"
        }

repositories {
    mavenCentral()
    maven {
        url "https://maven.google.com"
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':SliderPreference')
    implementation 'com.android.support:customtabs:28.0.0'
    implementation 'com.android.support:animated-vector-drawable:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:gridlayout-v7:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.google.android.gms:play-services-ads:17.2.0'
    implementation 'com.google.android.gms:play-services-analytics:16.0.8'
    implementation 'com.google.firebase:firebase-core:16.0.8'
    implementation 'com.anjlab.android.iab.v3:library:1.0.44'
    implementation 'com.facebook.android:facebook-android-sdk:4.31.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

apply plugin: 'com.google.gms.google-services'

В Манифесте у меня есть

<application ...
        <meta-data
            android:name="com.google.android.gms.ads.AD_MANAGER_APP"
            android:value="true"/>
...

Основная деятельность:

InterstitialAd mInterstitialAd;

@Override
protected void onPostCreate(Bundle savedInstanceState) {
MobileAds.initialize(context, BuildConfig.AD_APP_ID);
        MobileAds.setAppMuted(true);

        mInterstitialAd = new InterstitialAd (this);
        mInterstitialAd.setAdUnitId(BuildConfig.AD_UNIT_ID);

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdFailedToLoad(int errorCode) {
                Log.d("AD", "onAdFailedToLoad: "+String.valueOf(errorCode));
                super.onAdFailedToLoad(errorCode);
            }

            @Override
            public void onAdLoaded() {
                Log.d("AD", "onAdLoaded: ");
                super.onAdLoaded();
            }

            @Override
            public void onAdClosed() {
                    requestNewInterstitial();
            }
        });
        requestNewInterstitial();
    }
}


private void requestNewInterstitial() {
        AdRequest adRequest = new AdRequest.Builder().build();
        mInterstitialAd.loadAd(adRequest);
}       

1 Ответ

2 голосов
/ 29 марта 2019

Ответ от Admob:

Спасибо, что обратились к нам.Наша команда исправила эту проблему.Исправление должно быть доступно в будущих выпусках SDK.Следите за обновлениями на нашей странице истории релизов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...