2011-06-13 18 views
8

Después de convertir una aplicación que funciona perfectamente en una biblioteca (incluida su clase de actividad), intento crear una aplicación que use toda esa biblioteca simplemente superclasificando la actividad de la biblioteca:No se pudo instanciar la actividad ... Causado por ClassNotFoundException

package com.example.baseapp.paid; 

import android.os.Bundle; 
import com.example.baseapp.LibActivity; 


public class PaidActivity extends LibActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 
} 

Eclipse se basa esta aplicación recién "rediseñado" sin ningún error, pero cuando intento ejecutarlo, me sale una excepción:

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

no tengo ni idea de por qué esto está ocurriendo ya que el error para "Clase no encontrada" cuando th La clase e es exactamente la clase derivada construida (¡sin errores!) y ahora intenta ejecutarse.

¿Cómo soluciono esto?

¿Qué me estoy perdiendo?

EDITAR (respondiendo a la pregunta por @CaspNZ):

Ésta es la AndroidManifest.xml del proyecto de biblioteca:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.baseapp" 
     android:versionCode="5" 
     android:versionName="1.1.2"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 
</manifest> 

y este es el AndroidManifest.xml de la aplicación, utilizando el Proyecto de biblioteca:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.baseapp.paid" 
     android:versionCode="5" 
     android:versionName="1.1.2"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-library android:name="AppLibrary" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 

    <application android:icon="@drawable/icon"> 
     <activity android:name=".PaidActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="com.example.baseapp.LibActivity" android:label="com.example.baseapp.LibActivity:string/rx_label"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="EditPreferences" 
       android:label="com.example.baseapp.LibActivity:string/app_name"> 
     </activity> 
    </application> 
</manifest> 

Agradecería cualquier sugerencia al intentar solucionar este problema ya que esta es la primera vez que pruebo ng para usar un proyecto de biblioteca y no estoy familiarizado con los "trucos" involucrados para que esto funcione.

+1

¿Utiliza proguard? ¿Está tu clase dentro de tu archivo dex? (Puede usar dexdump de la distribución de Android para averiguarlo, classes.dex está en su apk). – Snicolas

+0

@Snicolas Esto está en modo de depuración, entonces no ProGuard. No sé (todavía) qué buscar en dexdump. Sin embargo, hice algunos progresos desde que publiqué y descubrí que el factoring de Eclipse funciona para mí la mayor parte del tiempo, pero también funciona en mi contra de vez en cuando, al igual que en este caso en el que inyectó algo de basura en el AndroidManifest de la biblioteca. .xml. Lo arreglé pero todavía recibo el error. – an00b

+0

@Snicolas Esto está relacionado con mi intento de implementar su primera sugerencia en [el otro hilo] (http://stackoverflow.com/questions/6324234/converting-an-existing-application-to-a-library). ¿Tengo que duplicar AndroidManifest.xml de la biblioteca para la aplicación derivada? – an00b

Respuesta

1

Finalmente resolví el problema. Resulta que yo tenía 2 ajustes críticos en las propiedades de ambos proyectos no está correctamente instalada:

  1. En el proyecto de la biblioteca, "es la biblioteca" se no marcada por alguna razón. Juraría que he comprobado, pero saber cómo caprichosa del entorno de desarrollo Android bajo Eclipse puede ser, sospecho que fue desactivada de Eclipse (o el plugin ADT ) como resultado de algún problema técnico.
  2. En el proyecto de aplicación, I omití agregar mi proyecto de biblioteca como referencia a través del botón Add... . (¿Qué tan tonto podría ser?)

Espero que a otros novatos como yo les resulte útil esta información. A veces, un problema extremadamente difícil de depurar, oculta un error de configuración cuando el programador insensible inocente asume que esto ya se ha solucionado ...

1

Esto puede suceder si enumera las actividades en el manifiesto de la biblioteca en lugar de en el manifiesto de la aplicación. No es necesario tener < actividad> etiquetas en un manifiesto de biblioteca. (Ver, por ejemplo, this thread.)

+0

Gracias por esta información (no sabía esto). Moví todos '' y '' de la biblioteca al manifiesto de la aplicación derivada, pero todavía no tuve suerte. Estoy buscando a tientas en la oscuridad. :( – an00b

0

Tuve el mismo error en uno de mis proyectos y pensé que puede compartir cómo he arreglado el mío

En algún momento de mi proyecto tuve que cambiar uno de los nombres de paquete que estoy usando donde están todas mis clases de actividad. Cuando lo hice, olvidé actualizar el AndroidManifest que me causó el mismo error. Actualizar esto lo solucionó.

10

Para cualquiera que se haya actualizado a ADT 22, asegúrese de haber verificado las bibliotecas privadas de Android en la ruta de compilación de Java> pestaña Ordenar y exportar. Para obtener más información, lea this. Esto funciona para mí Tal vez poca fuerza para mover usuarios a Android Studio en lugar de Eclipse :))

+1

Oh Dios mío, 4 horas de luchar más tarde y me di cuenta de que me había perdido la parte "incluso en el proyecto de la aplicación final. Gracias por esto, me hizo volver a leerlo correctamente y solucionar mi problema. – Ruddles

+0

tuve el mismo error: ** No se pudo crear una instancia de la actividad ComponentInfo ** y ** java.lang.ClassNotFoundException: No encontré clase **. Estaba extendiendo FragmentActivity. Esto funcionó para mí. – vovahost

+0

Gracias - eso solucionó mi problema. No hay nada ¡como una buena "actualización" para volar todos tus proyectos fuera del agua! – ccbunney

Cuestiones relacionadas