Подтвердить что ты не робот

Класс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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

-keep public class * extends android.content.ContentProvider

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

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

Ответ 5

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

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

android:exported="true"

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