在上一篇文章Android插件化之ClassLoader我们已经可以成功加载apk,但是还没有办法启动插件中的Activity。我们知道,如果要启动一个Activity,那么这个Activity必须在AndroidManifest.xml中注册。因此,如果我们要启动插件中的Activity,那么这个Activity事先必须在宿主的AndroidManifest.xml中预注册。这样一来就会有两个问题:
- 插件中的Activity在宿主的AndroidManifest.xml中注册,开发不太友好。
- 只能启动插件中事先定义好的Activity,没有办法动态增加Activity
因此,现有的插件化框架都会有一套越过AndroidManifest.xml注册而启动Activity的机制。本文的目的就是分析这套机制。
Activity的启动流程
不考虑多进程的情况,Activity的启动是Binder双向通信的一个过程,它由我们的app进程和AMS所在的system_server进程共同完成。system_server是一个系统级的进程,其内部的AMS负责管理所有app的Activity状态。因此,Android是不允许我们对AMS进行修改的。那么,插件化技术只能在我们app进程里做文章了。
下图我根据6.0的源码画出了Activity的启动流程图,我省略了我们不需要关心的AMS部分。