Android 进阶解密阅读笔记18

插件化

说起插件化,可能大家还会想到「组件化」,这两个的关系后面再说,先说说它和「热修复」的关系。其实他们都属于动态加载技术范畴,在程序运行时,动态加载一些内容来满足原本不支持的需求。

像这样的动态加载技术,更多的是服务于业务,特别是那种时效性高,技术实现又不过于复杂的场景。官方是没有正面的支持,所以如果要深入的了解这块,我觉得要基于实际需求去考虑。

例如,像现在一些大厂应用的流量很大,而其他一些业务为了接入这个流量就可以用这种方式实现低耦合,高内聚的开发。

插件化的实现主要有宿主和插件两部分,就像一个插座和插在插座上的设备,插座是事先预备好的,就像事先安装在手机上的应用,具体用什么设备,就根据情况来定。

插件化框架
  • VirtualApk(滴滴)
    全面些,通用性强。
  • RePlugin(360)
    插件与宿主没有任何耦合,也不通信。

如果要上手使用,我觉得这两个就够了。

具体插件化原理

插件化的实现最终还是要落实到代码实现上,而这实现就会涉及平常我们开发常接触的一些 Android 组件或者概念上,

  • Activity 插件化
  • Service 插件化
  • ContentProvider 插件化
  • BroadcastReceiver 插件化
  • 资源插件化
  • so 文件插件化

Activity 插件化
先从 Activity 说起,书中重点介绍了 Hook 实现(Hook 技术知道吗?不知道的话来这里看看 Hook 技术介绍),当然还有接口实现方式,另外用反射实现的我觉得可以不用管了,因为影响性能。

插件化的整体思路是通过预装的应用启动插件 Activity,但因为 Activity 的启动都要通过 xml 注册,所以 Hook 实现的首要任务就是让插件 Activity 通过系统校验,思路是用现有已注册的 Activity 来完成校验,等真正启动的时候再启动插件 Activity。

  • Hook IActivityManager 方式
    在准备启动插件 Activity 的时候,替换成 xml 配置文件中已经注册的某个 Activity,同时保留插件 Activity 的相关信息。
    接着在 ActivityThread.H 处理启动 Activity 消息时 Hook H 的 callback,当启动的是用来做校验的 Activity 时,就把它转为启动插件 Activity。
    这里我觉得,这个用来做校验的 Activity 其实应该是个固定 Activity(意思就是这个 Activity 的功能就是用来做校验的,不做其他用途)。这样一来,想启动谁就启动谁,专业带路。
    要知道的是,通过这种方式启动的 Activity,生命周期和正常方式启动的 Activity 无异

  • Hook Instrumentation 方式
    我们知道启动 Activity 的时候会经过 Instrumentation 的 execStartActivity() 方法,因此可以在这个位置进行校验替换(就是用专职校验的 Activity 来过检查)。而在 ActivityThread 的 performLaunchActivity() 方法里真正的去创建插件 Activity,并启动。

两种方式实现虽不同,但整体思路还是一致的,关键点就是两步,一步是过校验(需要用到已注册的 Activity,就是需要人带才能过),一步是在真的要启动时进行还原启动。

剩下的插件化过程后面再整理。

你可能感兴趣的:(Android 进阶解密阅读笔记18)