2015-12-04 10 views
8

Uso la libreria TinyBus per inviare eventi nella mia app. MinSDK è 15, l'SDK di compilazione è 23.Come evitare java.lang.NoClassDefFoundError: android/os/PersistableBundle su pre-L?

Su dispositivi pre-21, sto affrontando il problema che sembra interessare molte app che usano la riflessione. Appena provo a registrare sul bus nella mia base Activity classe (che eredita dalla AppCompatActivity), ottengo il seguente registro blocchi:

E/AndroidRuntime: java.lang.NoClassDefFoundError: android/os/PersistableBundle 
E/AndroidRuntime:  at java.lang.Class.getDeclaredMethods(Native Method) 
E/AndroidRuntime:  at java.lang.Class.getPublicMethodsRecursive(Class.java:955) 
E/AndroidRuntime:  at java.lang.Class.getMethods(Class.java:938) 
E/AndroidRuntime:  at de.halfbit.tinybus.impl.ObjectsMeta.<init>(ObjectsMeta.java:58) 
E/AndroidRuntime:  at de.halfbit.tinybus.TinyBus.processQueue(TinyBus.java:346) 
E/AndroidRuntime:  at de.halfbit.tinybus.TinyBus.register(TinyBus.java:178) 
E/AndroidRuntime:  at com.package.name.activities.InitializedActivity.onStart(InitializedActivity.java:62) 
E/AndroidRuntime:  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166) 
E/AndroidRuntime:  at android.app.Activity.performStart(Activity.java:5264) 
E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2047) 
E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2099) 
E/AndroidRuntime:  at android.app.ActivityThread.access$600(ActivityThread.java:138) 
E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:4929) 
E/AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
E/AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method) 

So che questo errore è causato da Dalvik non riuscendo a inizializzare un classe che non può trovare nel file dex. C'è un sacco di informazioni e domande relative a questo problema (poiché riguarda anche Otto e altri), ma finora ho visto solo una soluzione: rimuovere l'uso di PersistableBundle dall'app. Tuttavia, Non faccio riferimento alloPersistableBundle in nessun punto del mio codice, ma il sistema sembra apparentemente.

C'è qualche altra soluzione nota al problema?

+0

Usi proguard? – fisher3421

+0

@ fisher3421 sry per aver perso tempo, ha già trovato l'errore (più o meno stupido) (vedi la mia risposta). Sì, ho lavorato molto con proguard config per un bel po ', il problema non era legato a questo, anche se – Droidman

+0

http://stackoverflow.com/questions/17973970/how-to-solve-java-lang-noclassdeffounderror/ 41669190 # 41669190 cerca la mia risposta a questo post. – Michael

risposta

6

Bene, il problema è risolto ora. Dopo aver esaminato tutto il mio codice (che avrei dovuto fare secoli fa) ho scoperto che avevo effettivamente i riferimenti allo PersistableBundle. Si trovavano in metodi che lasciavo generare l'IDE come onPostCreate(PersistableBundle bundle) e non prestavo attenzione a questo. Sostituire tutto PersistableBundle con Bundle risolto il problema.

Per persone con problemi simili, posso solo suggerire di esaminare da vicino le cose generate quando si utilizza l'API più recente.

-1

Se si utilizza Android Studio per creare il progetto, tenta aggiungere seguente metodo per Application classe:

protected void attachBaseContext(Context base){ 
    super.attachBaseContext(base); 
    MultiDex.install(this); 
} 

Ricordate non dimenticare aggiungere multiDexEnabled true a gradle file. Aiutalo. Buona fortuna !.

+0

Lo scopo di multidex è di abilitare un'app a fare riferimento a più di metodi '0xFFFF'. Non riesco a pensare a come può aiutare a risolvere il problema descritto nella domanda. – Droidman

+0

Oh. Il mio problema come te, quando eseguo il mio dispositivo è la versione <21. Dopo aver aggiunto il metodo 'attachBaseContext' nella classe Application, il mio prolem ha risolto. –

+0

bene ho provato a abilitare il supporto mdex, ma la magia non è successo e il problema persiste ancora. – Droidman

Problemi correlati