java - Actividad de Android ClassNotFoundException: intenté todo
android-fragments android-library (15)
Acabo de refactorizar una aplicación en una biblioteca de framework y una aplicación.
No estoy del todo seguro de lo que está tratando de decir aquí, pero el hecho de que utilizó 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 difiere de un proyecto estándar de Android en que no se puede compilar directamente en un solo archivo .apk
y ejecutarlo en un dispositivo Android. No puede usar un proyecto de Android como un proyecto de biblioteca, y luego tener otro proyecto de Android para extender el proyecto de biblioteca. No funciona de esa manera.
Dicho esto, investigaría la estructura de su proyecto de biblioteca y me aseguraré 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 .apk
separada dentro del proyecto de la biblioteca, entonces probablemente haya hecho algo incorrecto. Creo que se lanzaría una ClassNotFoundException
si este fuera el caso. Para solucionar el problema, me gustaría construir el proyecto de la biblioteca desde cero, en lugar de intentar convertir el proyecto de Android a un proyecto de biblioteca. Eso evitará que te encuentres con bichos pequeños y molestos.
Siéntase libre de publicar más código si todavía tiene problemas. También debe 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.
Acabo de refactorizar una aplicación en una biblioteca de marcos y una aplicación, pero ahora, cuando intento iniciar la aplicación en el emulador, obtengo el siguiente seguimiento de la 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 está mal de alguna manera, pero he comprobado dos veces 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, está listado 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 esto, y agradecería cualquier ayuda. He escaneado muchas preguntas similares en SO sin ver este comportamiento en particular.
Más información:
- Revisé dentro de la APK generada y la clase tiene una entrada en el archivo classes.dex
- He intentado limpiar / construir el proyecto en eclipse
- Intenté usar una imagen de dispositivo totalmente nueva que ya no tiene una copia del APK
- Cambié el proyecto de la biblioteca a una versión java normal, luego cambié de nuevo a un proyecto de Android, sin diferencia
- Agregar el resumen SimonSaysActivity al manifiesto no hace diferencia.
- Intenté hacer de cada dependencia un proyecto de la biblioteca de Android y sincronizar la versión de Android que requieren, no ayudó
Encontré la solución (ver a continuación). A todos los que publicaron una respuesta / comentario: ¡Todos ustedes, gracias por ayudarme a superar los problemas!
Parece que esto es introducido por una actualización de herramientas SDK. Gracias a @Nick a continuación en los comentarios para este enlace: http://iqadd.com/item/noclassdeffounderror-adt-fix
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
Pruebe 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 ClassNotFoundException
- Verifique que el nombre de la clase solicitada sea el correcto y que exista el archivo .jar apropiado en su classpath . De lo contrario, debe agregarlo explícitamente al classpath de su aplicación.
- En caso de que exista el archivo .jar especificado en su classpath, la ruta de clase de su aplicación será sobrescrita y deberá encontrar el classpath exacto utilizado por su aplicación.
- En caso de que la excepción sea causada por una clase de terceros, debe identificar la clase que arroja la excepción y luego agregar los archivos .jar faltantes en su classpath .
¿Qué interfaces o clases principales utiliza SimonSaysActivity / extends y están disponibles en la versión de Android que está utilizando? 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 la API 14, pero cuando ejecuté la aplicación en mi dispositivo 2.3, recibí una excepción java.lang.NoClassDefFoundError para la actividad.
Créanlo 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 control de versiones de jar de dependencia.
Estaba teniendo el mismo problema. Pero luego verifiqué la estructura actual de la aplicación. Encontré que la estructura de la aplicación anterior (no sé la hora en que la cambiaron los desarrolladores de Android Framework) tiene un nombre de carpeta "lib"
que ahora es "libs"
. Migro todos mis archivos jar a "libs" y el error se ha ido. Espero que esto pueda ayudar a alguien :)
Intenta hacer que tu manifestación sea algo como esto.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="zvjezdan.veselinovic.yahtzee_"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".YahtzeeActivity"
android:label="@string/app_name" >
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name = ".Scoring_Page" />
</application>
</manifest>
La razón detrás de esto es que:
public class EasterSimonSaysActivity extends SimonSaysActivity {
usa otra actividad. Entonces, si tiene 2 actividades, entonces necesita agregarlas. Concedido que los importaste, pero tu manifiesto también necesita saber esto. Así es como "cambié de página" para mi proyecto yahtzee. Sobre el cual todavía necesito ayuda. = /
La solución proporcionada por @yorkw es absolutamente correcta. Tuve un problema adicional, en uno de los archivos de diseño, mencioné incorrectamente el nombre absoluto. 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 resolver esto, funcionó bien.
Para Eclipse Kepler (Mac): proyecto de control y clic -> herramientas de Android -> agregar biblioteca de soporte
Pasé algún tiempo jugando con mi propio proyecto, y puedo replicar tu problema y obtener exactamente el mismo rastro de pila de excepción cuando intento ejecutar mi proyecto principal, así que creo que esta podría ser la causa:
Al igual 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 de configuración simple de Eclipse.
La forma incorrecta:
Haga clic con el botón secundario en el proyecto principal, elija Properties -> Java Build Path -> Projects -> Add...
esto agrega el proyecto de la biblioteca de Android como 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 tiempo de compilación, pero cuando ejecuta la aplicación, obtiene la excepción que se describe 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 aquí su proyecto de biblioteca Android. Consulte la guía de desarrollo oficial referente a un proyecto de biblioteca . Esto debería arreglar todo tu problema. También tenga en cuenta que debe usar la referencia de ruta relativa del proyecto real de la biblioteca Android, como se indica en el Proyecto de biblioteca: consideraciones de desarrollo .
Espero que esto ayude.
Probé el código que me diste, y funciona bien. intente cambiar el "extends SimonSaysActivity" para simplemente "extends Activity" y vea usted mismo que funciona.
la razón por la que no funciona es SimonSaysActivity no extiende la actividad (que no creo que haya cometido este error), o el orden de la ruta de compilación es incorrecto.
para ir al orden de la ruta de compilación, vaya a:
project->properties->Java build path->order and export .
Mi orden básica es: project src, project gen, android 4.0.3, dependencias de android.
este problema generalmente ocurre cuando usa bibliotecas.
Si bien esto no será aplicable para todos, recientemente tuve este problema porque mi proyecto no pudo vincular con una biblioteca compartida presente en el dispositivo. Me olvidé de especificar en mi manifiesto que mi aplicación <uses-library>
.
Si siguió todos los consejos (revisó las bibliotecas privadas, etc.) y aún tiene el error. Compruebe su manifiesto para esta línea de código en la etiqueta de la aplicación
android:hasCode="false"
Quítalo y sé feliz. (Yo estaba finalmente) :)
Tuve el mismo problema y perdí la mayor parte del día probando todo tipo de cosas. La aplicación funcionó find cuando se implementó desde una pc pero no en esta pc. ¡Al final terminó siendo una naturaleza java perdida! Extraño cómo me mostró Java build paths, order / export y todo eso, pero aún no tenía una naturaleza java. :( Espero que esto le ahorre a alguien más mucho tiempo
Tuve este problema con un proyecto en el que estaba trabajando, aunque mi caso era diferente. Si alguien por ahí todavía no puede encontrar la solución a su problema, intente comprobar 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 para construir su proyecto (y / gen ). Típicamente:
>MyProject/gen
>MyProject/src
De lo que querrá asegurarse es de que dentro de cada una de sus carpetas de origen (exclude / gen , por lo que solo / src en este caso) la Output folder
del elemento se está conectando a la carpeta de salida predeterminada, que es MyProject/bin/classes
. Haga esto seleccionando la carpeta de Salida y haciendo clic en Eliminar en el conjunto de botones derecho (esto hará que apunte a la carpeta predeterminada).
Si no puede ver la carpeta de salida del subtema, marque "Permitir carpetas de salida para las carpetas de origen" justo debajo de la lista
eliminar classes.dex del bin y reconstruir el proyecto