Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core.gradle-plugin,core.loader):优化从AndroidManifest中解析Receiver的action信息的性能 #696

Closed
wants to merge 4 commits into from

Conversation

xuedizi
Copy link
Contributor

@xuedizi xuedizi commented Nov 30, 2021

从运行期解析修改为编译期解析

ComponentManager子类不再需要手动配置静态广播。
…tion信息的性能,从运行期解析修改为编译期解析
…tion信息的性能,从运行期解析修改为编译期解析,修复冲突
@shifujun
Copy link
Collaborator

仔细看了一下这个优化。

实现方式是在构建期间修改合并后的Manifest,把actionreceiver的对应关系,用meta-data存储在receiver标签里。
这样在packageManager.getPackageArchiveInfo()得到的PackageArchiveInfo中就可以从receiver中取出meta-data了。

这个实现也挺巧妙的。也建议提PR的时候能简要说明一下这个关键实现原理。

不过其实这里特别需要优化的不是单独Receiver的解析,而是getPackageArchiveInfo()调用本身就很耗时。而且它解析出的很多信息对我们来说是没用的。

我比较希望重构这个实现,在构建期间将整个XML中需要的信息转换成普通Java类。从根本上避免getPackageArchiveInfo()调用。

@xuedizi
Copy link
Contributor Author

xuedizi commented Dec 14, 2021

仔细看了一下这个优化。

实现方式是在构建期间修改合并后的Manifest,把actionreceiver的对应关系,用meta-data存储在receiver标签里。 这样在packageManager.getPackageArchiveInfo()得到的PackageArchiveInfo中就可以从receiver中取出meta-data了。

这个实现也挺巧妙的。也建议提PR的时候能简要说明一下这个关键实现原理。

不过其实这里特别需要优化的不是单独Receiver的解析,而是getPackageArchiveInfo()调用本身就很耗时。而且它解析出的很多信息对我们来说是没用的。

我比较希望重构这个实现,在构建期间将整个XML中需要的信息转换成普通Java类。从根本上避免getPackageArchiveInfo()调用。

OK,构建期间将整个XML中需要的信息转换成普通Java类,此方案我整理一下思路和方案,后续持续优化

@shifujun
Copy link
Collaborator

shifujun commented Dec 16, 2021

https://github.com/shifujun/Shadow/tree/manifest-parser
我开始写这个实现了。

  • 解析xml文件到内存map中
  • 从map生成java源文件
  • 写一个单独的gradle plugin为任意apk工程生成PluginManifest.java
  • 从Loader中读取插件中的PluginManifest类,替换部分PluginInfo场景
  • 逐步替换所有PluginInfo,彻底删除getPackageArchiveInfo()调用

shifujun added a commit to shifujun/Shadow that referenced this pull request Dec 29, 2021
通过PluginClassLoader新增方法loadPluginManifest可加载该类。

Tencent#696
shifujun added a commit to shifujun/Shadow that referenced this pull request Dec 29, 2021
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢,
而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它,
而是依赖编译期生成好的PluginManifest类。

另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。

在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法
获取MetaData等插件框架本身不需要的信息。

close Tencent#696
shifujun added a commit to shifujun/Shadow that referenced this pull request Dec 30, 2021
通过PluginClassLoader新增方法loadPluginManifest可加载该类。

Tencent#696
shifujun added a commit to shifujun/Shadow that referenced this pull request Dec 30, 2021
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢,
而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它,
而是依赖编译期生成好的PluginManifest类。

另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。

在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法
获取MetaData等插件框架本身不需要的信息。

close Tencent#696
shifujun added a commit that referenced this pull request Dec 31, 2021
通过PluginClassLoader新增方法loadPluginManifest可加载该类。

#696
shifujun added a commit that referenced this pull request Dec 31, 2021
由于PackageManager.getPackageArchiveInfo方法在解析较大的Manifest时速度很慢,
而且加载插件过程中只依赖很少量的字段,如className,theme等,所以在主路径不再依赖它,
而是依赖编译期生成好的PluginManifest类。

另一原因是getPackageArchiveInfo的返回类型没有公开API告诉我们Receiver的action字段。

在插件代码主动通过PackageManager获取信息时,再依赖getPackageArchiveInfo方法
获取MetaData等插件框架本身不需要的信息。

close #696
@zhuqichao
Copy link

这个重构之后就不能兼容老版本的插件了

@shifujun
Copy link
Collaborator

这个重构之后就不能兼容老版本的插件了

loader和插件版本是一对一的。它们一起更新,所以不存在loader需要兼容老版本插件的情况。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants