2011-06-10 18 views
12

tengo una clase ContentProvider y se declara en AndroidMenifest.xml así:ClassNotFoundException para un ContentProvider

<provider android:name=".MediaSearchProvider" 
    android:authorities="org.iii.romulus.meridian.mediasearch"> 
    <path-permission android:path="/search_suggest_query" 
     android:readPermission="android.permission.GLOBAL_SEARCH" /> 
</provider> 

funciona bien en la mayoría de los dispositivos, pero el mercado me dice que algunos usuarios están sufriendo de error con ella. El seguimiento de la pila es:

java.lang.RuntimeException: Unable to get provider org.iii.romulus.meridian.MediaSearchProvider: java.lang.ClassNotFoundException: org.iii.romulus.meridian.MediaSearchProvider in loader dalvik.system.PathClassLoader[/mnt/asec/org.iii.romulus.meridian-1/pkg.apk] 
at android.app.ActivityThread.installProvider(ActivityThread.java:4509) 
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4281) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4237) 
at android.app.ActivityThread.access$3000(ActivityThread.java:125) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071) 
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:878) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: org.iii.romulus.meridian.MediaSearchProvider in loader dalvik.system.PathClassLoader[/mnt/asec/org.iii.romulus.meridian-1/pkg.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.ActivityThread.installProvider(ActivityThread.java:4494) 
... 12 more 

No tengo ni idea de lo que ocurre y no puedo reproducirlo en ninguno de mis teléfonos. También probé limpiar y construir, pero el informe aún aparece. ¿Alguien puede ayudar? ¡Gracias!

+2

¿Está ejecutando la ofuscación de Proguard al crear un lanzamiento? Eso a veces puede causar este tipo de problema porque cambia los nombres de clase que luego no se resuelven en el tiempo de ejecución. Cualquier cosa que se declare en el manifiesto, o se haga referencia a ella utilizando la reflexión, debe excluirse de la ofuscación de proguard. –

+0

Sí, estoy ejecutando Proguard. Lo comprobaré, muchas gracias. –

+0

La tarjeta SD se retira o se monta en un PC http://stackoverflow.com/questions/4820554/android-unable-to-instantiate-activity-classnotfoundexception http://stackoverflow.com/ preguntas/5483947/android-intermitente-class-not-found-run-time-exception – Dante

Respuesta

5

Las respuestas con respecto a proguard son incorrectas. Esto causaría un error fácilmente reproducible en cada teléfono, todas las veces, porque la clase ContentProvider faltaría por completo. El desarrollador indica claramente que no puede reproducir el error, lo que significa que la clase ContentProvider está presente, pero que por alguna razón no se encuentra en uno de sus teléfonos.

Tengo el mismo bloqueo informado en el mercado para mi aplicación. Los rastreos de pila se ven idénticos, y el error se está produciendo en installProvider. Tengo alrededor de 15 teléfonos de prueba en mi oficina y ninguno de ellos puede reproducir este problema. Cualquier otra idea sería apreciada.

Los nombres completamente calificados en el manifiesto solo son necesarios si los nombres de sus paquetes java no son los mismos que los de su paquete de Android. Si no se especifica un nombre completo, el sistema operativo antepondrá automáticamente el nombre del paquete de Android al nombre de clase especificado en el manifiesto.

+1

Me encontré con un artículo interesante. Este error se discute en la parte inferior de la página: [ContentProvider Class Not Found] (http://nolanlawson.com/2011/04/06/army-of-testers/) – OldSchool4664

+0

También he visto esto informado en el mercado, y acordó que no está relacionado con Proguard. Si lo fuera, siempre sería reproducible. Por lo general, entra en erupción en torno al tiempo de actualización. –

+0

se puede comprobar fácilmente si es un problema de proguard - funciona en modo de depuración/no funciona en modo de lanzamiento = su problema de protección – AndroidGecko

4

Asegurar el doble que tienes nombre de la clase correcta cualificado especificado en AndroidManifest.xml, debe leer algo como esto:

<provider 
    android:authorities="org.iii.romulus.meridian.mediasearch" 
    android:name="org.iii.romulus.meridian.MediaSearchProvider"> 
</provider> 

en cuenta que @Name es completo.

+1

¿Por qué es necesario estar totalmente calificado? Algunos dispositivos tienen un error que no reconoce el nombre completo no calificado. –

+0

Este fue mi problema. Pensé que tenía todo lo especificado, pero el atributo "nombre" era ".BlahMyProvider" y no estaba en el paquete de nivel superior de la aplicación, obteniendo un ClassNotFound – davenpcj

0

Proguard excluye a todos los proveedores de contenido heredado por defecto con esta línea (asegúrese de que está en su cfg):

-keep public class * extends android.content.ContentProvider 

Si tiene alguna herencia adicional que debería excluirlo así o excluir la clase de proveedor de contenidos específicos , por ejemplo:

-keep public class org.iii.romulus.meridian.MediaSearchProvider 
2

Esto suena similar a un problema que tuve que fue causado por un problema con el cargador de clases, ver aquí: Bizarre behaviour when using Apache Commons lib in Android

This bug discute un error relacionado con el cargador de clases no a veces. La corrección para mí fue la de añadir esta línea:

Thread.currentThread().setContextClassLoader(this.getClassLoader());

en el constructor de la clase que se llama el código que fue fallando.

+0

no funcionó para mí – AVEbrahimi

0

Este es un hilo antiguo, y el OP no tenía la misma declaración ContentProvider que yo, pero tuve el mismo error exacto, por lo que quiero compartir mis hallazgos, en caso de que ayude a alguien.

Para mí, lo que causó el problema fue que la declaración ContentProvider en el AndroidManifest.xml tenía un atributo exported establecido en true:

android:exported="true"

Extracción lo arreglen el problema para mí. (Realmente no lo necesitaba)

Cuestiones relacionadas