КлассNotFoundException для ContentProvider

У меня есть класс 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> 

Он работает хорошо на большинстве устройств, но Market говорит, что некоторые пользователи страдают от ошибок. Трассировка стека:

 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 

Я совершенно не знаю, что происходит, и я не могу воспроизвести его ни на одном из моих телефонов. Я также старался чистить и строить, но отчет по-прежнему появляется. Кто-нибудь может помочь? Благодаря!

Ответы относительно proguard неверны. Это может привести к легко воспроизводимой ошибке на каждом телефоне каждый раз, потому что класс ContentProvider будет полностью отсутствовать. Разработчик четко заявляет, что они не могут воспроизвести ошибку, что означает, что класс ContentProvider присутствует, но по какой-то причине не найден на одном из телефонов своих пользователей.

У меня такой же крах, что и на рынке для моего приложения. Трассировки стека выглядят одинаково, и ошибка возникает у installProvider. У меня около 15 тестовых телефонов в моем офисе, и никто из них не может воспроизвести эту проблему. Любые другие идеи будут оценены.

Полноценные имена в манифесте необходимы только в том случае, если имена пакетов java не совпадают с вашим именем пакета Android. Если полное имя не указано, ОС автоматически добавит имя пакета android к имени класса, указанному в манифесте.

Убедитесь, что у вас есть правильное имя класса, указанное в AndroidManifest.xml, оно должно читать примерно следующее:

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

Обратите внимание, что @name полностью соответствует требованиям.

Это похоже на проблему, которая была вызвана проблемой с ClassLoader, см. Здесь: Необычное поведение при использовании Apache Commons lib в Android

В этой ошибке иногда возникает ошибка, связанная с загрузчиком класса. Исправить для меня было добавить эту строку:

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

В конструкторе класса, который вызывал код, который терпел неудачу.

Proguard по умолчанию отключает все унаследованные поставщики контента (убедитесь, что он находится в вашем cfg):

 -keep public class * extends android.content.ContentProvider 

Если у вас есть дополнительное наследование, вы должны его исключить или исключить свой конкретный класс Content Provider, например:

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

Это старый поток, и у ОП не было такого же объявления ContentProvider, как у меня, но у меня была такая же точная ошибка, поэтому я хочу поделиться своими выводами, если это кому-то поможет.

Для меня проблема заключалась в том, что в объявлении ContentProvider в AndroidManifest.xml атрибут exported был равен true :

android:exported="true"

Убрав это, я решил проблему. (Мне это действительно не нужно)