2014-12-23 1 views
14

Некоторые пользователи моего приложения испытывают этот крах, возможно, это связано с устройствами Samsung. Кто-нибудь еще испытал эту проблему и нашел решение?

java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$layout 
     at android.support.v7.app.ActionBarActivityDelegateBase.ensureSubDecor(ActionBarActivityDelegateBase.java:297) 
     at android.support.v7.app.ActionBarActivityDelegateBase.setContentView(ActionBarActivityDelegateBase.java:225) 
     at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:102) 
     at com.afollestad.impression.ui.MainActivity.onCreate(MainActivity.java:160) 
     at android.app.Activity.performCreate(Activity.java:5451) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2359) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2453) 
     at android.app.ActivityThread.access$900(ActivityThread.java:173) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5579) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

Линия 160 устанавливает представление содержания деятельности. Представление содержания таково:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.afollestad.lessen.ui.MainActivity" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent" 
      android:minHeight="?attr/actionBarSize" 
      android:background="?colorPrimary" 
      app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
      app:popupTheme="?popup_theme" /> 

     <FrameLayout 
      android:id="@+id/content_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

    </LinearLayout> 

    <FrameLayout 
     android:layout_width="@dimen/navigation_drawer_width" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     android:layout_gravity="start"> 

     <fragment 
      android:id="@+id/navigation_drawer" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:name="com.afollestad.impression.fragments.NavDrawerFragment" 
      tools:layout="@layout/fragment_navdrawer" 
      android:tag="NAV_DRAWER" /> 

    </FrameLayout> 

</android.support.v4.widget.DrawerLayout> 

Фрагмент - это простой фрагмент списка.

+1

Можете ли вы показать код? в основном, укажите, что такое MainActivity.java:160? –

+0

Вы использовали обфускацию? (Proguard) –

+0

@ MagicalPhoenixϡ У меня нет, нет – afollestad

ответ

7

Я исправил проблему с помощью Proguard со следующей конфигурацией:

-keep class !android.support.v7.internal.view.menu.**,** {*;} 
-dontwarn 
-ignorewarnings 
-dontshrink 

Чтобы включить Proguard с новыми версиями Gradle (в Android Studio):

android { 

    ... 

    buildTypes { 
     debug { 
      ... 
     } 
     release { 
      ... 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

proguard-rules.pro является где свойства вверху идут.

+1

, не могли бы вы объяснить мне, как это происходит? и зачем нужно помещать это в файл proguard, чтобы разрешить его. Мне просто нужно объяснение. Спасибо –

+0

СПАСИБО!Я искал решение этой проблемы в течение часа, и это самый простой способ реализовать proguard без необходимости включать все мои библиотеки. – mo13

1

если вы используете апи Compat поддержки-v7, любые библиотеки, чьи ссылки на него должны быть маркированы исключить модуль: 'Опорно-v4'

, например:

компиляции ('com.android. поддержка: cardview-v7: 22.2.0') { исключить модуль: „поддержка-v4“ }

+2

Это уже было решено в прошлом году. Lol – afollestad

24

Я знаю, что проблема была решена, но если вы прибываете на эту тему, это может быть, что это не решает ваша проблема в одной конкретной комбинации:

  • Все работает на 5.0 устройств
  • Это не работает на 4.x
  • Вы думаете, что позволит MultiDex
  • Proguard не кажется проблемой

Это случилось с я и я искали 3 часа. Надеюсь, это поможет. Чтобы включить MultiDex на 4.x устройствах, недостаточно модифицировать сборку: вам нужно подклассифицировать класс Application. Просто следуйте that и that

Надеюсь, это поможет.

+2

это действительно помогло. Поддерживается! – kiddouk

+0

Вы показали хороший ответ. Спасибо, Лоран. – Thirumalvalavan

3

Если вы используете multidex в приложении, расширить класс приложений от MultiDexApplication