Actividad de Android ClassNotFoundException - probé todo

82

Acabo de refactorizar una aplicación en una biblioteca de marco y una aplicación, pero ahora, cuando intento iniciar la aplicación en el emulador, obtengo el siguiente seguimiento de pila de errores:

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586):  ... 11 more

Por lo general, esto significa que el archivo de manifiesto es incorrecto de alguna manera, pero he verificado todo lo que se me ocurre.

Aquí está mi clase de actividad:

package com.matthewrathbone.eastersays;

import android.os.Bundle;

import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;

    public class EasterSimonSaysActivity extends SimonSaysActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      }

      @Override
      protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
      }

      @Override
      public SeasonPicker getSeasonPicker() {
       return new SeasonPicker(){
        @Override
        public Season getSeason() {
          // TODO Auto-generated method stub
          return Season.EASTER;
        }
       };
      }
    }

Como puede ver, aparece correctamente en el manifiesto:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.matthewrathbone.eastersays"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".EasterSimonSaysActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

No tengo idea de cómo solucionar este problema y agradecería cualquier ayuda. He escaneado muchas preguntas similares sobre SO sin ver este comportamiento en particular.

Más información:

  • Revisé el APK generado y la clase tiene una entrada en el archivo classes.dex
  • Intenté limpiar / construir el proyecto en eclipse
  • Intenté usar una imagen de dispositivo totalmente nueva que aún no tiene una copia del APK
  • Cambié el proyecto de la biblioteca a un java normal, luego volví a cambiar a un proyecto de Android, no hay diferencia
  • Agregar el SimonSaysActivity abstracto al manifiesto no hace ninguna diferencia.
  • Intenté hacer de cada dependencia un proyecto de biblioteca de Android, y sincronizar la versión de Android que requieren, no ayudó

Encontré la solución (ver más abajo). Para todos los que publicaron una respuesta / comentario: Todos ustedes son geniales, ¡gracias por ayudarme a resolver los problemas!

Parece que esto se introduce mediante una actualización de las herramientas del SDK. Gracias a @Nick a continuación en los comentarios de este enlace: http://iqadd.com/item/noclassdeffounderror-adt-fix

Matthew Rathbone
fuente
1
¿Tu actividad está en la biblioteca o en la aplicación?
Jeshurun
Está en la aplicación. Extiende una actividad base en el proyecto de biblioteca.
Matthew Rathbone
¿Construyes con hormiga o con ADT? parece que los archivos dex no contienen clases de biblioteca.
Tomasz Gawel
El error implica que la ubicación de su actividad es com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - claramente no es correcto. Intente agregar un nivel de paquete al paquete del proyecto que no existe en la biblioteca, por ejemplo ... eastersays.myapp.EasterSimonSaysActivity y especifique com.matthewrathbone.eastersays.myapp como paquete en el manifiesto. Pero no agregue el nivel 'myapp' a la biblioteca para mantener la ruta del proyecto en el manifiesto distinta de la ruta del marco de la biblioteca.
Gunnar Karlsson
1
iqadd.com/item/noclassdeffounderror-adt-fix : Enlace roto: /
Nishant.

Respuestas:

148

Pasé un tiempo jugando con mi propio proyecto, y puedo replicar su problema y obtener exactamente el mismo seguimiento de pila de excepciones cuando intento ejecutar mi proyecto principal, así que creo que esta podría ser la causa:

Al igual que lo que pensé, se trata de cómo hace referencia a su proyecto de biblioteca de Android en el proyecto principal de Android, una configuración simple de Eclipse.

The Wrong Way:
haga clic con el botón derecho en el proyecto principal, elija Properties -> Java Build Path -> Projects -> Add..., esto agrega el Proyecto de biblioteca de Android como un proyecto de dependencia en la ruta de compilación del proyecto principal de Android, esto no funciona. Si todos los recursos necesarios relacionados con Android están definidos en el proyecto principal, no obtendrá ningún error en el momento de la compilación, pero cuando ejecute la aplicación, obtendrá la excepción descrita en la pregunta.

La forma correcta:
haga clic con el botón derecho en el proyecto principal, elija Properties -> Android, en la sección Biblioteca, agregue su proyecto de biblioteca de Android aquí. Consulte la guía de desarrollo oficial que hace referencia a un proyecto de biblioteca . Esto debería solucionar todo su problema. También tenga en cuenta que debe usar la referencia de ruta relativa al proyecto de biblioteca de Android real, como se indica en el Proyecto de biblioteca: consideraciones de desarrollo .

Espero que esto ayude.

yorkw
fuente
1
Tú, mi amigo, eres un genio. Lo interesante de esto es que siempre estaba incluyendo una biblioteca "de la manera incorrecta", y funcionó. Entonces, cuando refactoricé en dos bibliotecas, pensé que era algo que hice de manera diferente. Me acaba de ahorrar horas y horas de trabajo.
Matthew Rathbone
Lo curioso es que estaba funcionando antes, supongo que actualizar mis herramientas SDK cambió el comportamiento. Fue muy no obvio.
Matthew Rathbone
3
Sí, actualizar las herramientas del SDK a> ADT 17 introduce este error debido a un cambio en la forma en que la versión actual de ADT maneja las bibliotecas. Echa un vistazo a: iqadd.com/item/noclassdeffounderror-adt-fix
Nick
2
La actualización a ADT 22 produjo un problema similar: stackoverflow.com/questions/16596969/…
Niels
7
¿Alguien podría decirme dónde puedo encontrar el Properties? Parece que no puedo encontrarlo en ningún lado.
2017
8

He probado el código que me ha proporcionado y funciona bien. intente cambiar "extiende SimonSaysActivity" por simplemente "extiende Actividad" y compruebe usted mismo que funciona.

la razón por la que no funciona es que SimonSaysActivity no extiende la actividad (que no creo que hayas cometido este error) o el orden de la ruta de compilación es incorrecto.

para ir al orden de la ruta de construcción, vaya a:

project->properties->Java build path->order and export .

mi orden básica es: proyecto src, proyecto gen, android 4.0.3, dependencias de android.

este problema generalmente ocurre cuando usa bibliotecas.

desarrollador de Android
fuente
Entonces tienes razón, si extiendo la Actividad directamente, funciona. Mi orden de construcción coincide con el tuyo, así que no puedo encontrar una manera de solucionarlo de esa manera. ¿Alguna otra idea?
Matthew Rathbone
eso es realmente extraño. intente actualizar sdk & adt. Además, dígame si hay varios proyectos de biblioteca (o archivos jar, o ambos) que usa su aplicación. si es así, intente jugar un poco con el orden de la ruta de construcción (trataría de poner las bibliotecas antes). Además, tengo otra pregunta: ¿creaste una clase que se llama "Actividad" y quizás la hayas extendido en lugar de la de Android?
desarrollador de Android
Hay 2 proyectos de biblioteca, el segundo (motor) depende tanto de simonSays como del proyecto de Android. Probé todas las combinaciones de órdenes de construcción, exportando el proyecto del motor de SimonSays. Responda a su pregunta: No tengo una clase llamada actividad en ninguna parte.
Matthew Rathbone
el motor es el núcleo. otros proyectos deberían utilizarlo y no al revés. solo el proyecto que es un proyecto de Android (lo que significa que no es un proyecto de biblioteca) debe tener el manifiesto que incluye la eliminación de todas las actividades, servicios, etc ... el manifiesto en proyectos de biblioteca de Android (actualmente) no tiene muchos propósitos (vea esto para obtener más información: stackoverflow.com/a/10445630/878126 )
desarrollador de Android
1
Ellos deben tener . es solo que el archivo de manifiesto puede ser muy corto y no incluir casi nada. también verifique el archivo project.properties (en cada uno de los proyectos) que su sdk objetivo es 15 ya que esta es la última versión actualmente. si lo desea, puede enviarme un mensaje de correo electrónico y arreglaré los proyectos.
desarrollador de Android
2

Acabo de refactorizar una aplicación en una biblioteca de marco y una aplicación.

No estoy del todo seguro de lo que está tratando de decir aquí, pero el hecho de que haya usado la palabra "refactorizado" aquí me lleva a creer que está malinterpretando el concepto de un proyecto de biblioteca.


Qué proyectos de biblioteca son :

Un proyecto de biblioteca es un proyecto de desarrollo que contiene código fuente y recursos compartidos. Otros proyectos de Android pueden hacer referencia al proyecto de la biblioteca e incluir sus fuentes compiladas en sus archivos .apk en tiempo de compilación.

Qué proyectos de biblioteca no son :

Un proyecto de biblioteca se diferencia de un proyecto estándar de Android en que no puede compilarlo directamente en un solo .apkarchivo y ejecutarlo en un dispositivo Android. No puede usar un proyecto de Android como un proyecto de biblioteca y luego hacer que otro proyecto de Android extienda el proyecto de biblioteca. No funciona de esa manera.


Dicho esto, investigaría la estructura de su proyecto de biblioteca y me aseguraría de que lo haya configurado correctamente . Está bien usar su biblioteca para almacenar código / recursos compartidos, pero si su biblioteca intenta comportarse como si fuera una separada .apkdentro del proyecto de la biblioteca, entonces probablemente haya hecho algo mal. Creo ClassNotFoundExceptionque se lanzaría una si este fuera el caso. Para solucionar el problema, simplemente crearía el proyecto de la biblioteca desde cero, en lugar de intentar convertir el proyecto de Android en un proyecto de biblioteca. Eso evitará que te encuentres con pequeños y molestos errores.

No dude en publicar más código si aún tiene problemas. También debería elaborar un poco más sobre la estructura (y el propósito) de su proyecto de biblioteca ... por qué decidió usar uno, cómo lo creó, etc.

Alex Lockwood
fuente
Sí, estaba tratando absolutamente los proyectos individuales correctamente, fue la forma en que estaba haciendo referencia a los proyectos de la biblioteca lo que realmente causó el problema. ¡Gracias por la increíble ayuda!
Matthew Rathbone
np ... valió la pena intentarlo, jaja
Alex Lockwood
2

Para Eclipse Kepler (Mac): Control-clic en proyecto -> Herramientas de Android -> agregar biblioteca de soporte

PSchuette
fuente
Esto me lo arregló. incluir solo v4-support.jar como biblioteca no funcionó.
águila blanca
2

Tuve este problema con un proyecto en el que estaba trabajando, aunque mi caso era diferente. Si alguien aún no puede encontrar la solución a su problema, intente verificar esto:

En Eclipse:

Project properties -> Java Build Path -> Source tab

En el interior, encontrará una lista con todas las carpetas de origen que se compilarán y colocarán en el apk generado cada vez que construya su proyecto (y / gen ). Típicamente:

>MyProject/gen
>MyProject/src

De lo que querrá estar seguro es que dentro de cada una de sus carpetas de origen (excluir / gen , por lo que solo / src en este caso) el elemento Output folderse dirige a la carpeta de salida predeterminada, que es MyProject/bin/classes. Para ello, seleccione Carpeta de salida y haga clic en Eliminar del conjunto de botones de la derecha (esto hará que apunte a la carpeta predeterminada).

Si no puede ver la carpeta de salida del subelemento, marque "Permitir carpetas de salida para las carpetas de origen" justo debajo de la lista.

Gonzalo
fuente
1

Si siguió todas las sugerencias (verificó las bibliotecas privadas, etc.) y aún tiene el error. Verifique su manifiesto para esta línea de código en la etiqueta de la aplicación

    android:hasCode="false" 

Quítelo y sea feliz. (Finalmente estaba) :)

Corona
fuente
¡¡Muchas gracias!! Me estaba volviendo loco. Esto funcionó para mí, tenía una MainActivity ficticia que estaba cargando un so. ¡Tomó 2 días encontrar su comentario!
AdrianTut
1

classNotFoundException en Java es una subclase de java.lang.Exception y viene cuando Java Virtual Machine intenta cargar una clase en particular y no encuentra la clase solicitada en classpath.

Leer más: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Intente ir a Project -> Properties -> Java Build Path -> Order & ExportY confirme que las Bibliotecas privadas de Android están marcadas para su proyecto y para todos los demás proyectos de biblioteca que está utilizando en su Aplicación.

Cómo lidiar con la ClassNotFoundException

  1. Verifique que el nombre de la clase solicitada sea correcto y que exista el archivo .jar apropiado en su classpath . De lo contrario, debe agregarlo explícitamente a la ruta de clases de su aplicación.
  2. En caso de que el archivo .jar especificado exista en su ruta de clases, la ruta de clases de su aplicación se anula y debe encontrar la ruta de clases exacta utilizada por su aplicación.
  3. En caso de que la excepción sea causada por una clase de terceros, debe identificar la clase que genera la excepción y luego, agregar los archivos .jar que faltan en su classpath .
IntelliJ Amiya
fuente
1

Si bien esto no será aplicable para todos, recientemente tuve este problema porque mi proyecto no se vinculaba con una biblioteca compartida presente en el dispositivo. Me había olvidado de especificar en mi manifiesto que mi aplicación <uses-library>.

lase
fuente
1

eliminar classes.dex de bin y reconstruir el proyecto

Afzaal Iftikhar
fuente
0

¿Qué interfaces o clases principales usa / extiende SimonSaysActivity y están disponibles en la versión de Android que estás usando? He visto problemas similares en los que mi actividad implementó una interfaz API que no estaba disponible en la versión de Android que estaba usando.

En mi caso, mi actividad implementó la interfaz PopupMenu.OnDismissListener que solo está disponible en API 14, pero cuando ejecuté la aplicación en mi dispositivo 2.3 recibí una excepción java.lang.NoClassDefFoundError para la actividad.

Charles Harley
fuente
todas las versiones son iguales, Android 2.2.
Matthew Rathbone
0

Tuve el mismo problema y desperdicié la mayor parte del día probando todo tipo de cosas. La aplicación ejecutó buscar cuando se implementó desde una computadora, pero no en esta. ¡Al final terminó siendo una naturaleza java perdida! Es extraño cómo me mostró las rutas de compilación de Java, el pedido / exportación y todo eso, pero aún no tenía una naturaleza de Java. :( Espero que esto le ahorre a otra persona mucho tiempo

Luke
fuente
0

La solución proporcionada por @yorkw es absolutamente correcta. Tuve un problema adicional, en uno de los archivos de diseño, había mencionado el nombre absoluto incorrectamente. Debería haber sido

<android.support.v4.view.ViewPager xmlns:android="...

más bien lo había puesto

<android.support.v4.app.view.ViewPager xmlns:android="...

después de resolverlos, funcionó bien.

Pantalón Himadri
fuente
0

Lo crea o no, la solución para mí fue eliminar la versión anterior (2.0) de la biblioteca de Google Analytics de mi proyecto, después de probar todo durante al menos 4 horas. Por supuesto, una actualización de esta biblioteca también podría ser la solución. Por lo tanto, podría ser un problema de versiones de jar de dependencia.

Criss
fuente
0

Recibí este tipo de error y lo intenté todo pero no obtuve la solución. luego descubrí que si está usando la biblioteca como archivo aar, entonces debe agregar todas las dependencias de su biblioteca aar a su archivo gradle.build de la aplicación. Si alguien no encontró la solución, ¡intente esto!

Junaid Bashir
fuente
-1

Estaba teniendo el mismo problema. Pero luego verifiqué la estructura actual de la aplicación y encontré que la estructura de la aplicación anterior (no sé la hora en que los desarrolladores del marco de Android la cambian) tiene un nombre de carpeta "lib"que es ahora "libs". Migro todos mis archivos jar a "libs" y el error desaparece. Espero que esto pueda ayudar a alguien :)

kaushal trivedi
fuente