2014-12-23 9 views
14

Alcuni utenti della mia app stanno vivendo questo arresto anomalo, sembra possibilmente essere correlato ai dispositivi Samsung. Qualcun altro ha riscontrato questo problema e trovato una soluzione?

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) 

La riga 160 imposta la vista del contenuto dell'attività. La visualizzazione del contenuto è la seguente:

<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> 

Il frammento è un semplice frammento di elenco.

+1

può mostrare il codice? in sostanza, fai un commento su MainActivity.java:160? –

+0

Hai usato l'offuscamento? (Proguard) –

+0

@ MagicalPhoenixϡ Non ho, no – afollestad

risposta

7

Ho risolto il problema utilizzando Proguard con la seguente configurazione:

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

Per abilitare Proguard con le nuove versioni di Gradle (in Android Studio):

android { 

    ... 

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

proguard-rules.pro è dove vanno le proprietà in alto.

+1

, puoi per favore spiegarmi il motivo per cui questo tipo di problema si verifica? e perché è necessario inserirlo nel file proguard per risolverlo. Ho solo bisogno di spiegazioni. Grazie –

+0

GRAZIE!Sono stato alla ricerca di una soluzione a questo problema per un'ora e questo è il modo più semplice per implementare proguard senza dover includere tutte le mie librerie. – mo13

1

se si sta utilizzando API compat supporto-v7, le librerie il cui riferimento ad esso deve essere contrassegnato escludono modulo: 'supporto-v4'

ad esempio:

compilazione ('com.android. supporto: CardView-v7: 22.2.0') { esclude modulo: 'supporto-v4' }

+2

Questo è stato già risolto l'anno scorso. Lol – afollestad

24

so che problema è stato risolto, ma se si arriva in questa discussione, potrebbe essere che non risolve il tuo problema in una particolare combinazione:

  • Tutto funziona su dispositivi 5.0
  • Non funziona su 4.x
  • Pensi si attiva MultiDex
  • Proguard non sembra essere un problema

E 'successo a io e io abbiamo cercato per 3 ore. Spero possa essere d'aiuto. Per abilitare MultiDex su dispositivi 4.x, non è sufficiente modificare la build: è necessario creare una sottoclasse della classe Application. Basta seguire that e that

Spero che sia d'aiuto.

+2

ha aiutato. Venerato! – kiddouk

+0

Hai mostrato una buona risposta. Grazie Laurent. – Thirumalvalavan

3

Se si utilizza multidex nell'applicazione, estendere la classe di applicazione da MultiDexApplication