Vraag ClassNotFoundException voor een ContentProvider


Ik heb een ContentProvider-klasse en wordt zo verklaard in 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>

Het werkt goed op de meeste apparaten, maar de Market vertelt me ​​dat sommige gebruikers er fouten mee maken. Het stacktracering is:

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

Ik heb geen idee wat er aan de hand is en ik kan het niet reproduceren op een van mijn telefoons. Ik heb ook geprobeerd schoon te maken en te bouwen, maar het rapport komt nog steeds naar voren. Iedereen kan helpen? Bedankt!


12
2018-06-10 07:31


oorsprong


antwoorden:


De antwoorden over proguard zijn onjuist. Dit zou op elke telefoon een eenvoudig reproduceerbare fout veroorzaken, omdat de klasse ContentProvider volledig zou ontbreken. De ontwikkelaar geeft duidelijk aan dat ze de fout niet kunnen reproduceren, wat betekent dat de klasse ContentProvider aanwezig is maar om een ​​of andere reden niet wordt gevonden op een van de telefoons van hun gebruiker.

Ik heb dezelfde crash gemeld op de markt voor mijn app. De stacktraces zien er identiek uit en de fout treedt op bij installProvider. Ik heb ongeveer 15 testtelefoons in mijn kantoor en geen van hen kan dit probleem reproduceren. Alle andere ideeën worden op prijs gesteld.

Volledig gekwalificeerde namen in het manifest zijn alleen nodig als uw java-pakketnamen niet hetzelfde zijn als de naam van uw Android-pakket. Als er geen volledig gekwalificeerde naam is opgegeven, wordt de naam van het Android-pakket automatisch vervangen door de OS-naam in de klassenaam die is opgegeven in het manifest.


5
2017-08-29 18:19



Zorg ervoor dat u twee keer weet dat u de juiste gekwalificeerde klassenaam hebt opgegeven in AndroidManifest.xml, deze moet zoiets als dit lezen:

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

Merk op dat @name volledig gekwalificeerd is.


4
2018-06-16 15:21



Dit lijkt op een probleem dat ik had en dat werd veroorzaakt door een probleem met de ClassLoader, zie hier: Bizar gedrag bij het gebruik van Apache Commons lib in Android

Deze bug bespreekt een fout met betrekking tot de klassenlader die soms faalde. De oplossing voor mij was om deze regel toe te voegen:

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

in de constructor van de klasse die de code aan het bellen was die faalde.


2
2017-11-08 06:59



Proguard sluit standaard alle overgenomen contentproviders uit met deze regel (zorg ervoor dat deze in uw cfg staat):

-keep public class * extends android.content.ContentProvider

Als u aanvullende overerving heeft, moet u deze uitsluiten of uw specifieke Content Provider-klasse uitsluiten, bijvoorbeeld:

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

0
2017-08-04 20:18



Dit is een oude thread, en de OP had niet dezelfde ContentProvider-verklaring als ik, maar ik had dezelfde exacte fout, dus ik wil mijn bevindingen delen, voor het geval iemand het helpt.

Wat voor mij het probleem veroorzaakte, was dat de ContentProvider-verklaring in AndroidManifest.xml een exported attribuut ingesteld op true:

android:exported="true"

Het verwijderen ervan heeft het probleem voor mij opgelost. (Ik had het niet echt nodig)


0
2018-05-20 23:13