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 <[email protected] <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 [email protected] > <javascript:> > > To unsubscribe from this group, send email to > > [email protected] <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 [email protected] <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 [email protected] To unsubscribe from this group, send email to [email protected] 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 [email protected]. For more options, visit https://groups.google.com/d/optout.

