爱奇艺动态化框架Qigsaw

在2018年上半年,我们就进行动态组件化方案的调研。起初方案是基于Instant App方案实现,当整体功能基本实现后,Google于2018年Google IO大会上推出Android App Bundle。在调研Android App Bundle之后,我们发现Android App Bundle完全符合最初的需求。

依据我们最初设计初衷和Android App Bundle特点,总结出Qigsaw应满足以下核心特点。

  • 利用Android App Bundle开发套件,体验原生极速开发体验。
  • 少量私有Api访问,保证框架稳定性。
  • 如果您的应用有出海需求,可无缝切换至Android App Bundle方案。 关于私有Api访问应该是大家比较关心的,最近一段时间某大厂开源了号称零反射插件化框架,但是通过阅读其源码,我们发现它还是做了PathClassLoader的parent ClassLoader反射替换。另外它也调用了Resources构造方法创建Resources实例,虽然这样做并没有任何私有Api访问,但是通过查看Resources构造方法源码,我们可知该方法属于过时方法,且注释写明第三方应用不应该创建Resources实例。
  1. /**
  2. * Create a new Resources object on top of an existing set of assets in an
  3. * AssetManager.
  4. *
  5. * @deprecated Resources should not be constructed by apps.
  6. * See {@link android.content.Context#createConfigurationContext(Configuration)}.
  7. *
  8. * @param assets Previously created AssetManager.
  9. * @param metrics Current display metrics to consider when
  10. * selecting/computing resource values.
  11. * @param config Desired device configuration to consider when
  12. * selecting/computing resource values (optional).
  13. */
  14. @Deprecated
  15. public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config) {
  16. this(null);
  17. mResourcesImpl = new ResourcesImpl(assets, metrics, config, new DisplayAdjustments());
  18. }

所以插件化框架不应该仅仅以是否零反射为目标,我们应该从开发流程及产品形态选取合适方案,助力开发效率。