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
fuente
Respuestas:
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.
fuente
Properties
? Parece que no puedo encontrarlo en ningún lado.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:
mi orden básica es: proyecto src, proyecto gen, android 4.0.3, dependencias de android.
este problema generalmente ocurre cuando usa bibliotecas.
fuente
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
.apk
archivo 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
.apk
dentro del proyecto de la biblioteca, entonces probablemente haya hecho algo mal. CreoClassNotFoundException
que 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.
fuente
Para Eclipse Kepler (Mac): Control-clic en proyecto -> Herramientas de Android -> agregar biblioteca de soporte
fuente
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:
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:
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 folder
se dirige a la carpeta de salida predeterminada, que esMyProject/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.
fuente
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) :)
fuente
Leer más: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA
Intente ir a
Project -> Properties -> Java Build Path -> Order & Export
Y 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
fuente
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>
.fuente
eliminar classes.dex de bin y reconstruir el proyecto
fuente
¿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.
fuente
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
fuente
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.
fuente
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.
fuente
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!
fuente
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 :)fuente