插件化框架Shadow分析之插件进程初始化

714 阅读2分钟

进程初始化

  1. bindService
  2. setUuidManager
  3. loadRuntime
  4. loadPluginLoader
  5. getPluinLoader

1. bindService 和 onServiceConnected

此方法是Android Service的标准使用姿势(为了拿到binder)

也就是上图中插件进程中的PpsBinder,和插件管理进程中的PpsController

下面的方法都是和插件管理进程中的PpsController调用插件进程的PpsBinder

2. setUuidManager(IBinder)

setUuidManager方法目的让插件管理进程统一维护安装的插件,插件进程通过传过来的binder来getPlugin拿到已安装的InstallApk。

3. loadRuntime(String uuid)

loadRuntime目的是加载插件启动必须的类,hack到了宿主PathClassLoader之上。这里主要有个hack是因为runtime部分也是个动态apk,宿主进程通过className启动Activity时是需要能够找到类的,所以动态的runtime是需要hack到宿主ClassLoader之上,不过如果宿主直接接入runtime代码,就不需要hack了。

4. loadClassLoader(String uuid)

loadClassLoader 通过ApkClassLoader加载loader.apk,构建出PluginLoader相关实现。后续插件apk的加载到插件进程都是通过PluginLoader来加载的

5. getPluginLoader

插件管理进程就可以通过最后拿到的PluginLoader去loadPlugin了 PluginLoader 后续分析。

总结

插件进程的初始化目前主要做2个事情

  1. runtime的hack(这里的runtime只是说宿主部分的依赖(也就是源码中的activity-container),动态化需要,插桩入口Activity是注册在宿主中的,插件Activity的启动需要走宿主的这个Activity,所以这些类必须支持宿主ClassLoader能访问。如果runtime改成宿主直接依赖,就不需要hack了,因为直接依赖的宿主ClassLoader能直接访问到)
  2. pluginLoader的初始化(后续进程中所有的插件加载,都是通过PluginLoader来加载的,这块内部细节后续再说)