VirtualApp原理解析(1)--初始化及注入流程

VirtualApp原理解析(1)–初始化及注入流程

VirtualApp是一款可以达到应用双开效果的开源项目。

源码地址:https://github.com/asLody/VirtualApp

这一系列简要分析其原理。

先来看下VirtualApp整体流程,包含启动双开应用Activity的过程。如下图:

VirtualApp的运行存在如下进程:

  • MainProcess即io.virtualapp:这是VirtualApp的宿主界面存在的进程。负责显示已安装目标应用,选择及启动需要双开的目标应用等。

  • ServiceProcess即io.virtualapp:x:后台服务进程,运行VirtualApp的后台重要服务。如:BinderProvider、DaemonService等。

  • ClientProcess即io.virtualapp:p*:目标应用运行进程,这个进程提供StubActivity/StubDialog/StubContentProvider子类负责启动目标应用对应的组件。

初始化及注入流程如下图所示:

1.VApp继承Application是应用程序入口,因为存在多进程所以VApp会调用多次,所以在VApp代码中存在对当前进程的判断逻辑。

  • 在覆写函数attachBase()中直接调用VirtualCore.startUp()做初始化操作。

2.VirtualCore.startUp()中主要有以下几个步骤:

  • 首先反射获取当前进程的ActivityThread对象保存,接着获取所在进程的unHookPackageManager。因为后面会对该PackageManager做hook所以这里先做备份。

  • 获取InvocationStubManager单例引用,调用到InvocationStubManager.init()。

  • 完成初始化之后调用InvocationStubManager.injectAll()执行对系统manager注入。

3.InvocationStubManager.init()函数的逻辑:

  • init函数内部又会调用到InvocationStubManager.injectInternal()该函数会根据当前进程类型执行不同初始化操作。这里假设是一个ServiceProcess或者ClientProcess去初始化ActivityManagerStub操作。

  • InvocationStubManager.injectInternal()只有两个操作,首先新建一个ActivityManagerStub对象,接着调用addInjector()将这个对象加入到map的mInjectors对象中。

那么在新建ActivityManagerStub对象时发生了什么?

  • 在ActivityManagerStub构造函数中,首先新建了一个MethodInvocationStub对象,参数传入通过反射获取的AMN中IActivityManager的getDefault对象。接着调用MethodInvocationStub两个参数的构造函数,在这里重点来了,首先保存一个传入的getDefault对象,接着获取这个getDefault对应的Class对象所有的接口。这里的一切都是为了使用Proxy.newProxyInstance()构建一个IActivityManager动态代理对象mProxyInterface。

  • 接着将上述步骤构建的MethodInvocationStub对象传入ActivityManagerStub父类MethodInvocationProxy的构造函数中。这里首先需要保存传入MethodInvocationStub对象,接着调用子类的ActivityManagerStub.onBindMethods(),在该函数中先去调用父类对应实现。在父类的onBindMethods()中获取自身的class对象,判断是否存在@Inject注解,读取其注解内部class对象构建对象后使用mInvocationStub.addMethodProxy()添加到MethodInvocationProxy中的一个map的Map

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
virtual-serial-port-control.msi是一种软件安装文件,用于安装并控制虚拟串口。虚拟串口是通过软件仿真的串口,可以模拟物理串口的功能。virtual-serial-port-control.msi可以创建、修改和删除虚拟串口,以及管理串口的通信参数和流控制选项。 使用virtual-serial-port-control.msi,用户可以方便地模拟串口通信环境,测试串口设备和应用程序的交互。虚拟串口在开发嵌入式系统、调试串口设备和编写串口通信程序时非常有用。通过virtual-serial-port-control.msi,用户可以在一台计算机上模拟多个串口设备,从而简化串口调试和测试的过程。 安装virtual-serial-port-control.msi后,用户可以打开虚拟串口管理界面,通过简单操作来创建虚拟串口和设置其属性。用户可以选择虚拟串口的名称、波特率、数据位、停止位、奇偶校验等通信参数。虚拟串口还支持硬件流控制和软件流控制选项,以确保数据传输的可靠性。 通过virtual-serial-port-control.msi,用户可以在应用程序中使用虚拟串口进行串口通信。虚拟串口与物理串口具有相同的通信接口,应用程序无需修改即可与虚拟串口进行通信。用户可以通过读取和写入虚拟串口,实现数据的收发功能。 总之,virtual-serial-port-control.msi提供了一个方便易用的界面,用于创建、配置和控制虚拟串口,帮助用户简化串口调试和测试的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值