ContentProvider的ClassNotFoundException

时间:2011-06-10 07:31:51

标签: android

我有一个ContentProvider类,并在AndroidMenifest.xml中声明如下:

<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>

它适用于大多数设备,但市场告诉我一些用户正在遭遇错误。堆栈跟踪是:

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

我完全不知道发生了什么,我无法在任何手机上重现它。我也试过干净和构建,但报告仍然出现。 有人可以帮忙吗?谢谢!

6 个答案:

答案 0 :(得分:5)

有关proguard的答案不正确。这样每次都会在每部手机上产生容易重现的错误,因为ContentProvider类会完全丢失。开发人员明确指出他们无法重现错误,这意味着ContentProvider类存在但由于某种原因在用户的某个手机上找不到。

我在我的应用程序市场上报告了相同的崩溃。堆栈跟踪看起来完全相同,并且错误发生在installProvider上。我办公室里有大约15部测试手机,但没有一部可以重现这个问题。任何其他想法将不胜感激。

只有当您的java包名称与您的Android包名称不同时,才需要清单中的完全限定名称。如果未指定完全限定名称,操作系统将自动将android包名称添加到清单中指定的类名称。

答案 1 :(得分:4)

确保两次在AndroidManifest.xml中指定了正确的限定类名,它必须读取如下内容:

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

请注意,@ name是完全限定的。

答案 2 :(得分:2)

这听起来类似于我遇到的问题,这是由ClassLoader的问题引起的,请参阅此处:Bizarre behaviour when using Apache Commons lib in Android

This bug讨论了有时类加载器失败的错误。我的修复是添加这一行:

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

在调用失败代码的类的构造函数中。

答案 3 :(得分:0)

Proguard默认使用此行排除所有继承的内容提供者(确保它在您的cfg中):

-keep public class * extends android.content.ContentProvider

如果您有任何其他继承,您也应该将其排除或排除您的特定Content Provider类,例如:

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

答案 4 :(得分:0)

这是一个旧线程,OP没有和我一样的ContentProvider声明,但我有同样的确切错误,所以我想分享我的发现,以防它对任何人都有帮助。

对我来说,导致问题的原因是AndroidManifest.xml中的ContentProvider声明的exported属性设置为true

android:exported="true"

删除它为我解决了问题。 (我真的不需要它)

答案 5 :(得分:0)

如果您的应用程序已经足够大以至于需要进行Multidexing,并且您的应用程序未正确设置为Multidex应用程序,则会出现此错误。要将您的应用设置为multidex应用,请按照以下说明进行操作:

Setup multidex app