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

修复插件中获取ApplicationInfo实现的bug #46

Merged
merged 6 commits into from
Jul 17, 2019

Conversation

shifujun
Copy link
Collaborator

@shifujun shifujun commented Jul 13, 2019

由于#38 发现#40 所以有了这个PR。

首先Review了 84f55d2 当时的改动原因。当时主要是为了解决继承PackageManager实现时,不得不兼容OEM厂商对PackageManager添加的hide方法。这违背了Shadow的设计原则。于是找出了不需要继承PackageManager实现的方法。所以当时实现完就应该把存在兼容OEM系统方法的类删除,当时漏删了,因此有 8be2a83 提交。

接下来为了较为可靠的重构这个实现,首先需要为ApplicationInfo做一个自动化测试。因为要拿到原本宿主不应该关心的信息,所以加一个TestManager模块,让动态加载的Manager和Loader都有能力向宿主中的类塞数据。这样单元测试就可以在宿主这一侧拿到一些内部信息了。这里暂时需要的是插件的uuid。因此有提交 623d26e

提交 921f071 撰写单元测试,将#38 #40 的问题先通过单元测试暴露出来。见com.tencent.shadow.test.cases.plugin_main.application_info.ApplicationInfoTest

提交 27b9f5c 是为了厘清PluginPackageManager的作用,简化了代码。

然后发现PackageManagerTransform中也写了PackageItemInfo的处理,虽然处理手段是完全一样的。但是这里的设计是希望按功能将文件分开,因此先将这两部分修改分成了两个文件。以保证本次重构对PackageItemInfo没有影响。因此有提交 15baf69

最后通过提交 0757192 重构ApplicationInfo获取的实现。主要设计如下:

  1. 插件的ApplicationInfo来自于最初通过android.content.pm.PackageManager#getPackageArchiveInfo获得的PackageInfo,代码在com/tencent/shadow/core/loader/blocs/LoadPluginBloc.kt:63。然后将这个ApplicationInfo保存在插件专有的PluginPackageManager中。

  2. 每个插件都有自己的PluginPackageManager,但这个PluginPackageManager不会直接交给插件中的代码使用,插件中的代码拿不到这个PackageManager,也就不会把它交给系统,系统也就不会对这个PackageManager调用hide方法。

  3. 每个插件的PluginPackageManager都能向ShadowPluginLoader要到当前已经加载的所有插件的PackageInfo,这样在PluginPackageManager中就能查询其他插件的ActivityInfo等信息了。

  4. 每个插件的PluginPackageManager还持有宿主的PackageManager,在当前插件和其他插件中都找不到所需信息时,最后从宿主的PackageManager中查找。

  5. 专门在PackageManagerTransform转调到Runtime层的PackageManagerInvokeRedirect时,将原本被调用的PackageManager对象从参数中删去。这个对象确实是宿主的PackageManager,但传过来没有用,因为PluginPackageManager在构造时就拿到宿主的PackageManager了。把这个参数传过来对后续维护造成困扰。我这次就花了些时间专门确认了这个参数是什么,有什么用。

fix #40

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.

getApplicationInfo有两处实现,且实现不一致。
1 participant