shadow-core: loader / load-parameters
2022-03-16 12:15:54 0 举报
腾讯 shadow 分析
作者其他创作
大纲/内容
PluginContentProviderManager::createContentProviderAndCallOnCreate1、通过 pluginParts!!.appComponentFactory 获取到 font color=\"#7b1fa2\
plugin service 的委托类所有插件 service 都会被 ASM 进行字节码继承关系:ShadowService
1
plugin service 管理类负责插件框架内所有 service 启动,销毁,生命周期管理
用于返回 ContentProvider 的委托对象
ShadowAppComponentFactory
+ if (appComponentFactory != null) { val clazz = pluginClassLoader.loadClass(appComponentFactory) ShadowAppComponentFactory::class.java.cast(clazz.newInstance()) } else ShadowAppComponentFactory()
LoadPluginBloc
DelegateProvider shadow-core: activity container
+ HostActivityDelegate getHostActivityDelegate(Class<? extends HostActivityDelegator> delegator);
执行加载
7
LoadApkBloc 负责创建 PluginClassLoader
UriConverter.UriParseDelegateshadow-core: runtime
PluginParts
+ val appComponentFactory: font color=\"#7b1fa2\
TmpShadowDelegate
+ fun getPluginApplication(): ShadowApplication+ fun getAppComponentFactory(): ShadowAppComponentFactory+ fun getPluginClassLoader(): PluginClassLoader+ fun getPluginResources(): Resources+ fun getComponentManager(): ComponentManager
Parcelable
ShadowPluginLoader
+ val mExecutorService = Executors.newCachedThreadPool()- val mLock = ReentrantLock()- val mPluginServiceManagerLock = ReentrantLock()- val font color=\"#d32f2f\
+ fun getPluginServiceManager(): PluginServiceManager font color=\"#b71c1c\
CheckPackageNameBloc 负责检查宿主和插件的包名
实现
CreateApplicationBloc
1 :1
ShadowDelegate
- lateinit var _appComponentFactory: ShadowAppComponentFactory- lateinit var _pluginApplication: ShadowApplication- lateinit var _pluginClassLoader: PluginClassLoader- lateinit var _pluginResources: Resources- lateinit var _componentManager: ComponentManager
+ fun inject(shadowApplication: ShadowApplication)+ fun inject(appComponentFactory: ShadowAppComponentFactory)+ fun inject(pluginClassLoader: PluginClassLoader)+ fun inject(resources: Resources)+ fun inject(componentManager: ComponentManager)
这里表示创建 ShadowAppComponentFactory 哈
DI
UnsafePluginServiceManager
- val mPluginLoader: ShadowPluginLoader- val mHostContext: Contextfont color=\"#d32f2f\
插件组件管理主要功能是管理组件和宿主中注册的壳子之间的配对关系
相互持有1 :1
CreatePluginApplicationInfoBloc
加载插件1 :1
plugin loader 类的基类
3
LoadPluginBloc 负责 插件加载
PluginContentProviderManager
font color=\"#b71c1c\
+ fun addContentProviderInfo( font color=\"#b71c1c\
ContentProviderDelegateProvidershadow-core: common
+ HostContentProviderDelegate getHostContentProviderDelegate();
plugin content provider 管理类
PluginPackageManagershadow-core: runtime
CreateApplicationBloc 负责 plugin application 创建通过 pms 的 getResourcesForApplication 获取资源
LoadParameters
+ String businessName;+ String partKey;+ String[] dependsOn;+ String[] hostWhiteList;
委托1 : 1
6
CheckPackageNameBloc
PluginPackageManagerImpl
- val font color=\"#7b1fa2\
PluginServiceManager
+ mPluginLoader: ShadowPluginLoader+ mHostContext: Context- val delegate = font color=\"#b71c1c\
依赖注入
LoadApkBloc
CreatePluginApplicationInfoBloc 负责创建 ApplicationInfo
实例化 Service
5
PluginPackageManagerImpl 负责插件包管理
CreateResourceBloc
实例化插件的四大组件对象
LoadPluginBloc::loadPlugin1、执行 任务 buildClassLoader: 通过 LoadApkBloc.loadPlugin 创建插件类加载器 PluginClassLoader2、执行 任务 buildPluginManifest: 通过 PluginClassLoader 加载 com.tencent.shadow.core.manifest_parser.PluginManifest 类,并创建 PluginManifest 实例。 通过 CheckPackageNameBloc.check 校验包名 dependOn 任务 buildClassLoader3、执行 任务 buildPluginApplicationInfo:通过 CreatePluginApplicationInfoBloc.create 创建 plugin 的 ApplicationInfo 信息 dependOn 任务 buildPluginManifest4、执行 任务 buildPackageManager:创建 plugin 的包管理对象 PluginPackageManagerImpl dependOn 任务 buildPluginApplicationInfo5、执行 任务 buildResources:通过 CreateResourceBloc.create 创建 plugin 的资源管理对象 Resources6、执行 任务 buildAppComponentFactory:创建 plugin 的四大组件实力化工厂对象 ShadowAppComponentFactory dependOn 任务 buildClassLoader dependOn 任务 buildPluginManifest7、执行 任务 buildApplication:通过 CreateApplicationBloc.createShadowApplication 创建 plugin 的 ShadowApplication 对象 dependOn 任务 buildClassLoader dependOn 任务 buildResources dependOn 任务 buildAppComponentFactory dependOn 任务 buildPluginManifest dependOn 任务 buildPluginApplicationInfo8、执行 任务 buildRunningPlugin:根据依赖任务的输出,创建 PluginParts 对象,将其 添加到 componentManager、ShadowPluginLoader.mPluginPartsMap、PluginPartInfoManager 中 dependOn 任务 buildPackageManager dependOn 任务 buildClassLoader dependOn 任务 buildResources dependOn 任务 buildApplication dependOn 任务 buildAppComponentFactory dependOn 任务 buildPluginManifest
<abs>ComponentManager
font color=\"#b71c1c\
+ fun setPluginContentProviderManager(pluginContentProviderManager: PluginContentProviderManager)+ fun setPluginServiceManager(pluginServiceManager: PluginServiceManager)+ fun font color=\"#b71c1c\
plugin 加载信息
4
ShadowAppComponentFactoryshadow-core: runtime
+ font color=\"#b71c1c\
参数传递
InstalledApkshadow-core: common
+ final String apkFilePath;+ final String oDexPath;+ String libraryPath;+ byte[] parcelExtras;
+ getLoadParameters()
newServiceInstance创建
继承
PluginManifest.ProviderInfoshadow-core: runtime
+ final String authorities;
用于返回 Activity 的委托对象
ContainerProviderInfo
+ var className: String+ var authority: String
CreateResourceBloc 负责资源管理通过 pms 的 getResourcesForApplication 获取资源
UnsafePluginServiceManager::newServiceInstance1、通过 intent 获取到 service 的 componentName;2、通过 mPluginLoader.mComponentManager 获取到 service 所属的 plugin 的 partKey;3、创建了一个 TmpShadowDelegate 对象;4、调用 ShadowPluginLoader.inject 方法,根据 partKey 查询对应的插件的 PluginParts然后将 PluginParts 的数据设置到 TmpShadowDelegate 中;5、通过 ShadowAppComponentFactory 创建 ShadowService 实例;6、设置 tmpShadowDelegate 内部的成员(来自 inject)到 ShadowService 中;7、返回 Service;
loadPlugin
2
0 条评论
回复 删除
下一页