Skip to content
galen edited this page Jan 4, 2016 · 22 revisions
  1. 插件是否一定得内置到APK中,如果一定要内置,那这个框架仅仅是为了开发工程中解耦?

内置是为了首次启动更快,如果不内置也行,可以在启动页下载插件。

  1. 目前开源的插件开发框架有很多,Small 跟这些框架的区别是什么,优缺点呢?:
  2. 百度工程师开发的 Dynamic-load-apk
  3. melbcat开源的 Direct-Load-apk
  4. limpoxe开源的 Android-Plugin-Framework
  5. 阿里工程师开发的 ACDD
  6. 360工程师开发的 DroidPlugin
  1. dynamic-load-apk使用代理的方式实现Activity生命周期,插件中不能用this,不够透明;
  2. Direct-Load-apk对dynamic-load-apk进行了改进,支持this。但也是用代理Activity,实现较为繁琐;
  3. Android-Plugin-Framework是一个相对完整的框架,但资源分区方案还不够理想,不支持加载.so插件;
  4. ACDD 使用了osgi,没有细看。。坑点是资源分区要使用修改aapt源码再重新编译的方案;
  5. DroidPlugin支持对完整apk的动态加载,但是没有考虑实际场景:怎么把插件包做到最小。

Small的开发其实是跟随1、2、3走过来的。从实际场景出发,基于“轻量、透明、极小化、跨平台”的理念:

  • 把核心代码量控制在了一个文件(ApkBundleLauncher)500行以内
  • 不修改aapt源码,实现了资源id PP段的再分配
  • 通过对aapt生成的二进制文件的后期加工,最大化分离无用的资源,使得插件包最小达到4k左右
  • 支持对本地化网页进行插件打包,实现跨平台

资源分区的原理与方案对比见Dynamic load resources

  1. 目前大多插件框架对Service的支持不太好,Small是否支持,支持度怎么样。

实际场景中,Service的更新频度较低,可以预埋在宿主的manifest文件中。

  1. 插件与宿主必须运行在同一个进程吗? 是否支持插件运行在单独的进程中。

在同一个进程。

  1. 当插件与宿主共有一个控件时(比方说自己写了一个下拉刷新的控件),开发过程中是不是要插件和宿主里面都含有这个控件? 同样,是否允许插件访问宿主的资源(比如说res)以及数据(SharedPreferences中的数据)。

插件中所有的公共资源、类将会被分离。宿主、各个插件之间的资源可以互相访问,支持SharedPreferences,完全透明。