NoClassDefFoundError:解析失败:Landroid/support/v7/appcompat/R$styleable

Posted

技术标签:

【中文标题】NoClassDefFoundError:解析失败:Landroid/support/v7/appcompat/R$styleable【英文标题】:NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable 【发布时间】:2014-10-15 08:03:38 【问题描述】:

新手尝试完成 Google 提供的“我的第一个应用程序”教程。在通往这个致命异常的路上,我确实导入了很多随机包,以消除许多事情的“无法解决”错误,ActionBarActivity、EditText、Fragment、LayoutInflater 等,但不确定这是否重要。无论如何,当我单击主活动中的“发送”按钮时,我的应用程序崩溃并产生致命异常。这是我的代码和 logcat 文件。

MyActivity.java(又名本教程的 MainActivity.java)

package magiccoupons.tutapp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;


public class MyActivity extends Activity 
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);



@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.my, menu);
    return true;


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) 
        return true;
    
    return super.onOptionsItemSelected(item);


/** Called when the user clicks the Send button */
public void sendMessage(View view) 
    // Do something in response to button
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);


DisplayMessageActivity.java:

package magiccoupons.tutapp;

import android.widget.*;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.*;
import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;

public class DisplayMessageActivity extends ActionBarActivity 

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    // Set the text view as the activity layout
    setContentView(textView);


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) 
        return true;
    
    return super.onOptionsItemSelected(item);


/**
 * A placeholder fragment containing a simple view.
 *
public static class PlaceholderFragment extends Fragment 

    public PlaceholderFragment()  

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        View rootView = inflater.inflate(R.layout.activity_display_message,
                container, false);
        return rootView;
    

*/

build.gradle:

 apply plugin: 'com.android.application'

android 
    compileSdkVersion 'android-L'
    buildToolsVersion '20'

    defaultConfig 
        applicationId "magiccoupons.tutapp"
        minSdkVersion 20
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    
    buildTypes 
        release 
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:20.0.0'
    //compile 'com.android.support:appcompat-v7:21.0.0-rc1'

activity_my.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="magiccoupons.tutapp.MainActivity">

    <EditText android:id="@+id/edit_message"
        android:layout_weight="1"
        android:layout_
        android:layout_
        android:hint="@string/edit_message" />
    <Button
        android:layout_
        android:layout_
        android:text="@string/button_send"
        android:onClick="sendMessage" />

</LinearLayout>

activity_display_message.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="magiccoupons.tutapp.DisplayMessageActivity">

<TextView
    android:text="@string/hello_world"
    android:layout_
    android:layout_ />

</RelativeLayout>

和logcat:

08-21 11:24:36.088    3645-3645/magiccoupons.tutapp I/Process﹕ Sending signal. PID: 3645 SIG: 9
08-21 11:37:33.584    4149-4149/magiccoupons.tutapp W/Resources﹕ Preloaded drawable resource #0x1080093 (android:drawable/sym_def_app_icon) that varies with configuration!!
08-21 11:37:33.676    4149-4149/magiccoupons.tutapp I/am_on_resume_called﹕ [0,magiccoupons.tutapp.MyActivity]
08-21 11:37:33.905    4149-4149/magiccoupons.tutapp D/gralloc_goldfish﹕ Emulator without GPU emulation detected.
08-21 11:37:38.139    4149-4149/magiccoupons.tutapp I/am_on_paused_called﹕ [0,magiccoupons.tutapp.MyActivity]
08-21 11:37:38.218    4149-4149/magiccoupons.tutapp I/Choreographer﹕ Skipped 75 frames!  The application may be doing too much work on its main thread.
08-21 11:37:38.356    4149-4149/magiccoupons.tutapp D/AndroidRuntime﹕ Shutting down VM
08-21 11:37:38.369    4149-4149/magiccoupons.tutapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: magiccoupons.tutapp, PID: 4149
    java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/appcompat/R$styleable;
            at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:106)
            at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57)
            at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:99)
            at magiccoupons.tutapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:15)
            at android.app.Activity.performCreate(Activity.java:5720)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
            at android.app.ActivityThread.access$800(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5070)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.appcompat.R$styleable" on path: DexPathList[[zip file "/data/app/magiccoupons.tutapp-1.apk"],nativeLibraryDirectories=[/data/app-lib/magiccoupons.tutapp-1, /vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at android.support.v7.app.ActionBarActivityDelegate.onCreate(ActionBarActivityDelegate.java:106)
            at android.support.v7.app.ActionBarActivityDelegateICS.onCreate(ActionBarActivityDelegateICS.java:57)
            at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:99)
            at magiccoupons.tutapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:15)
            at android.app.Activity.performCreate(Activity.java:5720)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1102)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2317)
            at android.app.ActivityThread.access$800(ActivityThread.java:143)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5070)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
    Suppressed: java.lang.ClassNotFoundException: android.support.v7.appcompat.R$styleable
            at java.lang.Class.classForName(Native Method)
            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 18 more
     Caused by: java.lang.NoClassDefFoundError: Class "Landroid/support/v7/appcompat/R$styleable;" not found
            ... 22 more

对不起,如果我错过了什么,这个问题完全没有必要和/或被骗了。谢谢。

【问题讨论】:

为什么com.android.support:appcompat-v7在build.gradle中被注释掉了?您正在使用 android.support.v7.app.ActionBarActivity 因此您应该包含支持 v7 库。 显然没有区别,当我取消注释时收到的消息是“在 minSdkVersion >= 14 没有必要时使用 appcompact 库”。此外,通过将其留在我得到一个 UNEXPECTED TOP-LEVEL EXCEPTION 但是如果你的 minSdkVersion >= 14 那么你根本不需要使用支持库。只需使用 Activity 即可。 是的,我又回到了这个,刚刚完全重新开始。如教程中所述,使用 Activity 而不是 ActionBarActivity 是第一次工作。谢谢。 【参考方案1】:

只是 Build -&gt; Clean Project 然后Build -&gt; Rebuild Project。就是这样。

【讨论】:

【参考方案2】:

您收到该错误的原因如下:

在您的 Gradle 构建文件中,您的应用将使用仍在开发中的 Android 测试版进行定位和编译:

compileSdkVersion 'android-L'
buildToolsVersion '20'

还有

minSdkVersion 20
targetSdkVersion 20

首先要注意的是,这个应用程序在没有 android-L 的任何设备上都无法正常运行(此时)。

问题的真正症结在于 DisplayMessageActivity,它通过继承扩展 [ActionBarActivity]:(https://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html) 这是 AppCompat 的支持库类之一。

要解决此问题,请将最小 SDK 更改为 10(或 14,即冰淇淋三明治),将最大 SDK 更改为 19 (Kit Kat),并取消注释依赖项中的 appcompat-v7 库。

附带说明一下,当您在各自的活动/片段中声明小部件时,将它们的范围置于任何方法之外通常是一种好习惯:

EditText editText;
Button sendMessageButton;

// Then in your onCreate() method
editText = (EditText) findViewById(R.id.editText);
sendMessageButton = (Button) findViewById(R.id.sendMessageButton);

这有助于减少内存重新分配并使您的代码更具可读性。有时你可能不得不稍微改变一下规则,但这是常见的做法。

【讨论】:

是的,我最终回到了这个,并且刚刚完全重新开始。像你说的那样有针对性的 KitKat 而不是 L,并使用 Activity 而不是 ActionBarActivity。完美运行,谢谢。【参考方案3】:

我删除了“yourAppName\app”文件夹中的“build”文件夹

一切正常。如果上述解决方案不起作用,请尝试此操作。 build 文件夹将在您再次构建项目时自动生成。

【讨论】:

这是 Android Studio 的一个已知错误。最好使用 File->Invalidate Caches / Restart... @Alex 不知道!大多数时候,我处理的是 Android Studio 的错误,而不是我的应用程序中的错误!大声笑【参考方案4】:

在我的情况下,问题发生在 Android Studio 4.0 中。我想 Gradle 缓存有问题。

很遗憾,Invalidate Сaches / RestartBuild -&gt; Clean ProjectBuild -&gt; Rebuild Project 都没有帮助我,所以我不得不采取严厉措施。

    关闭 Android Studio。

    打开终端并导航到项目的根目录。

    删除所有 Gradle 模块的构建目录,所有模块很快就会重新编译。

    find . -wholename "*/build" -exec rm -rf  \;
    

    但如果你只有一个模块,那么只需:

    rm -rf app/build
    

    清除 Gradle 缓存。默认情况下,它位于您的主目录中。

    rm -rf ~/.gradle
    

    再次打开 Android Studio。它将开始构建项目。这需要很长时间,因为我们刚刚删除了缓存,但问题应该得到解决。

【讨论】:

感谢您的回答。无效缓存/重启对我来说也不够。清理 ~/.gradle 然后再次启动 Android Studio 为我修复了它。【参考方案5】:

在我的例子中,我有一个为 720p 定义但没有为默认分辨率定义的布局,所以它崩溃了。添加该布局文件解决了这个问题,logcat 不会说谎。

【讨论】:

以上是关于NoClassDefFoundError:解析失败:Landroid/support/v7/appcompat/R$styleable的主要内容,如果未能解决你的问题,请参考以下文章

测试错误 - NoClassDefFoundError:解析失败:Lorg/hamcrest/Matchers

java.lang.NoClassDefFoundError:解析失败:Ljavax/naming/directory/InitialDirContext;

Java.lang.NoClassDefFoundError:解析失败:Lcom/google/firebase/FirebaseApp

java.lang.NoClassDefFoundError:解析失败:Landroidx/core/app/ActivityManagerCompat

java.lang.NoClassDefFoundError: 解析失败:Lorg/apache/http/ProtocolVersion

NoClassDefFoundError:解析失败:Landroid/support/v7/appcompat/R$styleable