ClassNotFoundException: Не найден класс "com.google.android.gms.ads.AdView"
Я провел много исследований, и это, похоже, распространенная ошибка для многих пользователей, но по совершенно разным причинам. Ни одна из них, которую я обнаружил, не сработала для меня.
Я получаю
java.lang.RuntimeException: Unable to start activity ComponentInfo{
[...]/[...].activities.StartActivity}: android.view.InflateException:
Binary XML file line #173: Error inflating class [...].BannerAd
[...]
Caused by: android.view.InflateException: Binary XML file line #8: Error
inflating class com.google.android.gms.ads.AdView
[...]
Caused by: java.lang.ClassNotFoundException: Didn't find class
"com.google.android.gms.ads.AdView" on path: DexPathList[[zip file
"/data/app/[...]-1.apk"],nativeLibraryDirectories=[/data/app-lib/[...]-1,
/vendor/lib, /system/lib]]
У меня установлены новейшие версии пакетов ADT и SDK. Я скопировал google-play-services_lib в свою рабочую область и импортировал его как проект Android. Я добавил его как библиотеку в свой проект приложения. Я проверил все в разделе "Заказ и экспорт".
У меня проблема banner_ad.xml:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
android:orientation="vertical" >
<com.google.android.gms.ads.AdView
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ads:adSize="BANNER"
ads:adUnitId="[...]" />
</LinearLayout>
И a BannerAd.java который я использую:
package [...];
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import [...].R;
import [...].general.Settings;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
public class BannerAd extends LinearLayout {
public BannerAd(Context context, AttributeSet attrs) {
super(context, attrs);
if (!Settings.PRO) {
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mInflater.inflate(R.layout.banner_ad, this, true);
AdView adView = (AdView) this.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
}
}
}
Может ли это иметь какое-то отношение к proguard? Понятия не имею, это мой файл proguard-project.txt Однако:
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-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;
}
Есть идеи, что я мог бы попробовать исправить это?
Редактировать: иногда я также получаю такой вывод в консоли (но не каждый раз, когда я компилирую, только иногда):
[2014-07-24 12:49:05 - [...]] Dx
trouble processing:
[2014-07-24 12:49:05 - [...]] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing com/google/android/gms/internal/mb.class
...while processing com/google/android/gms/internal/mb.class
[2014-07-24 12:49:05 - [...]] Dx
trouble processing:
[2014-07-24 12:49:05 - [...]] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing com/google/android/gms/internal/mc.class
...while processing com/google/android/gms/internal/mc.class
[2014-07-24 12:49:05 - [...]] Dx
[...]
[Lots of similar warnings here]
[...]
trouble processing:
[2014-07-24 12:49:25 - [...]] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing com/google/ads/mediation/customevent/CustomEventAdapter$a.class
...while processing com/google/ads/mediation/customevent/CustomEventAdapter$a.class
[2014-07-24 12:49:25 - [...]] Dx
trouble processing:
[2014-07-24 12:49:25 - [...]] Dx bad class file magic (cafebabe) or version (0033.0000)
...while parsing com/google/ads/mediation/customevent/CustomEventServerParameters.class
...while processing com/google/ads/mediation/customevent/CustomEventServerParameters.class
[2014-07-24 12:49:25 - [...]] Dx 2786 warnings
Переведено автоматически
Ответ 1
Это из-за ProGuard. Чтобы безопасно использовать ProGuard с мобильной рекламой Google, добавьте следующее в конфигурацию ProGuard:
-keep public class com.google.android.gms.ads.** {
public *;
}
-keep public class com.google.ads.** {
public *;
}
Ответ 2
Я, наконец, решил свои проблемы с помощью
- установка новейшей версии инструментов сборки Android SDK (не знал, что у меня их еще нет)
- переключение с уровня соответствия компилятору 1.6 на 1.7 (Window - Preferences - Java - Compiler - Уровень соответствия компилятору)
Спасибо всем.
Ответ 3
Я сделал то, что сказал @User (обновил инструменты сборки Android SDK; изменил компилятор на 1.7), но у меня не сработало. Я написал решение, которое нашел, на случай, если оно может помочь кому-либо с такой же проблемой:
На шаге 3 настройки сервисов Google Play говорится:
В вашем проекте приложения обратитесь к проекту библиотеки сервисов Google Play. Дополнительные сведения о том, как это сделать, см. в разделе Ссылка на проект библиотеки для Eclipse.
Примечание: Вы должны ссылаться на копию библиотеки, которую вы скопировали в свое рабочее пространство разработки — вы не должны ссылаться на библиотеку непосредственно из каталога Android SDK.
Решение: не копируйте вручную. Вместо этого просто установите флажок в Eclipse с надписью "Копировать проекты в workspace".
Я сделал это так, и все снова заработало.
Благодаря этому вопросу StackOverflow: Как исправить установку библиотеки Google Play Services 2 в Eclipse (Admob является частью сервисов Google Play)