I wondered that why a receiver can be instantiated(by cl.loadClass(component).newInstance())before *packageInfo.makeApplication(false, mInstrumentation);* and *instrumentation.callApplicationOnCreate(app);*.
Everything works well if *handleBindApplication()* is first called,which will internally call Application app = data.info.makeApplication(data.restrictedBackupMode, null); and mInstrumentation.callApplicationOnCreate(app);, then a receiver be instantiated. On Sunday, July 13, 2014 9:48:38 PM UTC+8, Sérgio Faria wrote: > > On Dalvik you'll get that error if you use a custom ClassLoader that > loads classes from other ClassLoader(s) (eg. the API of a plugin). > If you're using this, you have two options: either dont export the > symbols or remove them at runtime[1] (you'll need to move the class > definitions and zero out the remaining space). > > [1]: https://source.android.com/devices/tech/dalvik/dex-format.html > > 2014-07-13 14:00 GMT+01:00 shiqun.shi <shiqun...@163.com <javascript:>>: > > > >> I notice this two methods, handleReceiver() and makeApplication()。 > >> > >> In which case,packageInfo.makeApplication(false, mInstrumentation); was > >> called and mApplication == null? Which will make a receiver be > >> instantiated(by cl.loadClass(component).newInstance())before > >> packageInfo.makeApplication(false, mInstrumentation); and > >> instrumentation.callApplicationOnCreate(app);. > >> > >> > >> > >> private void handleReceiver(ReceiverData data) { > >> > >> // If we are getting ready to gc after going to the background, > >> well > >> > >> // we are back active so skip it. > >> > >> unscheduleGcIdler(); > >> > >> > >> > >> String component = data.intent.getComponent().getClassName(); > >> > >> > >> > >> LoadedApk packageInfo = getPackageInfoNoCheck( > >> > >> data.info.applicationInfo, data.compatInfo); > >> > >> > >> > >> IActivityManager mgr = ActivityManagerNative.getDefault(); > >> > >> > >> > >> BroadcastReceiver receiver; > >> > >> try { > >> > >> java.lang.ClassLoader cl = packageInfo.getClassLoader(); > >> > >> data.intent.setExtrasClassLoader(cl); > >> > >> data.setExtrasClassLoader(cl); > >> > >> receiver = > >> (BroadcastReceiver)cl.loadClass(component).newInstance(); > >> > >> } catch (Exception e) { > >> > >> if (DEBUG_BROADCAST) Slog.i(TAG, > >> > >> "Finishing failed broadcast to " + > >> data.intent.getComponent()); > >> > >> data.sendFinished(mgr); > >> > >> throw new RuntimeException( > >> > >> "Unable to instantiate receiver " + component > >> > >> + ": " + e.toString(), e); > >> > >> } > >> > >> > >> > >> try { > >> > >> Application app = packageInfo.makeApplication(false, > >> mInstrumentation); > >> > >> > >> > >> if (localLOGV) Slog.v( > >> > >> TAG, "Performing receive of " + data.intent > >> > >> + ": app=" + app > >> > >> + ", appName=" + app.getPackageName() > >> > >> + ", pkg=" + packageInfo.getPackageName() > >> > >> + ", comp=" + > data.intent.getComponent().toShortString() > >> > >> + ", dir=" + packageInfo.getAppDir()); > >> > >> > >> > >> ContextImpl context = (ContextImpl)app.getBaseContext(); > >> > >> sCurrentBroadcastIntent.set(data.intent); > >> > >> receiver.setPendingResult(data); > >> > >> receiver.onReceive(context.getReceiverRestrictedContext(), > >> > >> data.intent); > >> > >> } catch (Exception e) { > >> > >> if (DEBUG_BROADCAST) Slog.i(TAG, > >> > >> "Finishing failed broadcast to " + > >> data.intent.getComponent()); > >> > >> data.sendFinished(mgr); > >> > >> if (!mInstrumentation.onException(receiver, e)) { > >> > >> throw new RuntimeException( > >> > >> "Unable to start receiver " + component > >> > >> + ": " + e.toString(), e); > >> > >> } > >> > >> } finally { > >> > >> sCurrentBroadcastIntent.set(null); > >> > >> } > >> > >> > >> > >> if (receiver.getPendingResult() != null) { > >> > >> data.finish(); > >> > >> } > >> > >> } > >> > >> > >> > >> > >> > >> public Application makeApplication(boolean forceDefaultAppClass, > >> > >> Instrumentation instrumentation) { > >> > >> if (mApplication != null) { > >> > >> return mApplication; > >> > >> } > >> > >> > >> > >> Application app = null; > >> > >> > >> > >> String appClass = mApplicationInfo.className; > >> > >> if (forceDefaultAppClass || (appClass == null)) { > >> > >> appClass = "android.app.Application"; > >> > >> } > >> > >> > >> > >> try { > >> > >> java.lang.ClassLoader cl = getClassLoader(); > >> > >> ContextImpl appContext = new ContextImpl(); > >> > >> appContext.init(this, null, mActivityThread); > >> > >> app = mActivityThread.mInstrumentation.newApplication( > >> > >> cl, appClass, appContext); > >> > >> appContext.setOuterContext(app); > >> > >> } catch (Exception e) { > >> > >> if (!mActivityThread.mInstrumentation.onException(app, e)) > { > >> > >> throw new RuntimeException( > >> > >> "Unable to instantiate application " + appClass > >> > >> + ": " + e.toString(), e); > >> > >> } > >> > >> } > >> > >> mActivityThread.mAllApplications.add(app); > >> > >> mApplication = app; > >> > >> > >> > >> if (instrumentation != null) { > >> > >> try { > >> > >> instrumentation.callApplicationOnCreate(app); > >> > >> } catch (Exception e) { > >> > >> if (!instrumentation.onException(app, e)) { > >> > >> throw new RuntimeException( > >> > >> "Unable to create application " + > >> app.getClass().getName() > >> > >> + ": " + e.toString(), e); > >> > >> } > >> > >> } > >> > >> } > >> > >> > >> > >> return app; > >> > >> } > >> > >> > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Android Developers" group. > > To post to this group, send email to android-d...@googlegroups.com > <javascript:> > > To unsubscribe from this group, send email to > > android-developers+unsubscr...@googlegroups.com <javascript:> > > For more options, visit this group at > > http://groups.google.com/group/android-developers?hl=en > > --- > > You received this message because you are subscribed to the Google > Groups > > "Android Developers" group. > > To unsubscribe from this group and stop receiving emails from it, send > an > > email to android-developers+unsubscr...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en --- You received this message because you are subscribed to the Google Groups "Android Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.