广播的注册分为静态注册和动态注册两种,android关于广播的源码分析可以参照此文 :
https://www.jianshu.com/writer#/notebooks/11066526/notes/28225946
广播的插件化指的是插件能够接受到外部的广播,即插件apk里的Receiver对象能够响应对应的广播。动态注册的广播指的是在插件apk中调用registerReceiver进行注册的广播,这种场景不需要进行特别处理。
插件中静态注册的广播,VirtualApk处理的方式也很简单:将插件apk的AndroidManifest.xml中静态注册的Receiver通过动态registerReceiver注册到宿主Context中即可。
在加载插件Apk的时候通过PackageParser对Apk进行解析,生成LoadedPlugin对象,该对象内部有个 PackageParser.Package类型的变量mPackage,mPackager保存了插件apk的AndroidManifest.xml中注册的四大组件信息,通过读取mPackage里面的receivers,动态进行广播注册即可。代码如下:
mPackage.receivers在解析Apk的时候生成的,生成的主要代码如下:
PackageParser.parseBaseApplication通过解析AndroidManifest.xml中的<receiver>标签,生产Receiver对象,parseActivity为生成静态广播对象的函数。
获取到receivers之后,通过插件ClassLoader(DexClassLoader)就可以加载对应的Receiver对象,最后通过mHostContext.registerReceiver就可以对静态广播动态注册。
至此,就完成静态广播的插件化。