web-dev-qa-db-ja.com

クラッシュ:Java.lang.NoClassDefFoundError:Android.support.v7.appcompat.R $ layout

私のアプリの一部のユーザーはこのクラッシュを経験しています。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>

フラグメントは単純なリストフラグメントです。

14
afollestad

次の構成でProguardを使用して問題を修正しました。

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

新しいバージョンのGradleでProguardを有効にするには(Android Studio):

Android {

    ...

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

proguard-rules.proは、上部のプロパティが移動する場所です。

8
afollestad

問題が解決したことは知っていますが、このスレッドにたどり着いた場合、特定の組み合わせで問題が解決しない可能性があります。

  • すべて5.0デバイスで動作します
  • 4.xでは機能しません
  • MultiDexを有効にすると思います
  • Proguardは問題ではないようです

それは私に起こり、私は3時間検索しました。私はそれがいくつかの助けになることを願っています。 4.xデバイスでMultiDexを有効にするには、ビルドを変更するだけでは不十分です。Applicationクラスをサブクラス化する必要があります。 thatthat に従ってください

それが役に立てば幸い。

24
Laurent Meyer

アプリケーションでmultidexを使用する場合は、MultiDexApplicationからApplicationクラスを拡張します。

3
Gurgen Hakobyan

api compat support-v7を使用している場合、それへの参照をマークする必要があるライブラリは、モジュールを除外します: 'support-v4'

例えば:

compile( 'com.Android.support:cardview-v7:22.2.0'){exclude module: 'support-v4'}

1
Anton R