四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之重,Activity插件化主要有三种实现方式:

  • 反射实现 (反射实现会对性能有所影响,主流的插件化框架没有采用此方式)

  • 接口实现

  • Hook技术实现

关于接口实现可以阅读dynamic-load-apk的源码。

Hook技术实现主要有两种解决方案:

  • 通过Hook IActivityManager来实现,

  • Hook Instrumentation实现

Activity的启动过程主要分为两种:

  • 根Activity的启动过程

    首先Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序进程。应用程序进程启动后,AMS会请求应用程序进程创建并启动根Activity。

  • 普通Activity的启动过程

    在应用程序进程中的Activity向AMS请求创建普通Activity(步骤1),AMS会对 这个Activty的生命周期和栈进行管理,校验Activity等等。如果Activity满足AMS的校验,AMS就会请求应用程序进程中的ActivityThread去创建并启动普通Activity

我们在startActivity之后系统最终会调用 Instrumentation 的 execStartActivity 方法,然后再通过 ActivityManagerProxy 与 AMS 进行交互。

以上知识参考链接:


VirtualAPK 大致方案如下:

  • Activity:在宿主 Apk 中提前占坑,然后通过 Hook Activity 的启动过程,“欺上瞒下”启动插件 Apk 中的 Activity,因为 Activity 存在不同的 LaunchMode 以及一些特殊的熟悉,所以需要多个占坑的“李鬼” Activity。

  • Service:通过代理 Service 的方式去分发;主进程和其他进程,VirtualAPK 使用了两个代理Service。

  • BroadcastReceiver:静态转动态。

  • ContentProvider:通过一个代理Provider进行分发。

results matching ""

    No results matching ""