feat(core.gradle-plugin,core.loader):优化从AndroidManifest中解析Receiver的action信息的性能#696
feat(core.gradle-plugin,core.loader):优化从AndroidManifest中解析Receiver的action信息的性能#696xuedizi wants to merge 4 commits into
Conversation
ComponentManager子类不再需要手动配置静态广播。
…tion信息的性能,从运行期解析修改为编译期解析
…tion信息的性能,从运行期解析修改为编译期解析,修复冲突
|
仔细看了一下这个优化。 实现方式是在构建期间修改合并后的Manifest,把 这个实现也挺巧妙的。也建议提PR的时候能简要说明一下这个关键实现原理。 不过其实这里特别需要优化的不是单独Receiver的解析,而是 我比较希望重构这个实现,在构建期间将整个XML中需要的信息转换成普通Java类。从根本上避免 |
OK,构建期间将整个XML中需要的信息转换成普通Java类,此方案我整理一下思路和方案,后续持续优化 |
|
https://github.com/shifujun/Shadow/tree/manifest-parser
|
通过PluginClassLoader新增方法loadPluginManifest可加载该类。 Tencent#696
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢, 而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它, 而是依赖编译期生成好的PluginManifest类。 另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。 在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法 获取MetaData等插件框架本身不需要的信息。 close Tencent#696
通过PluginClassLoader新增方法loadPluginManifest可加载该类。 Tencent#696
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢, 而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它, 而是依赖编译期生成好的PluginManifest类。 另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。 在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法 获取MetaData等插件框架本身不需要的信息。 close Tencent#696
通过PluginClassLoader新增方法loadPluginManifest可加载该类。 #696
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢, 而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它, 而是依赖编译期生成好的PluginManifest类。 另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。 在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法 获取MetaData等插件框架本身不需要的信息。 close #696
|
这个重构之后就不能兼容老版本的插件了 |
loader和插件版本是一对一的。它们一起更新,所以不存在loader需要兼容老版本插件的情况。 |
从运行期解析修改为编译期解析