一、VirtualApp 初识

1. VirtualApp 是一款支持应用多开的框架

虚拟应用 (Virtual App, VA): Android 系统沙盒,轻量级Android虚拟机
一句话:通过拦截应用的全部系统请求,实现对app的全面控制。

源码及官方文档介绍
https://github.com/asLody/VirtualApp
(2017/12后开源代码停止更新)

2. VA术语

(1)宿主App: 真正安装的系统上的应用, 集成了 VA libs (用户是在这个App 上添加其它应用的分身)
(2)宿主插件:在使用宿主App拓展功能时用到的,例如64位插件
(3)虚拟App(VA App) : 安装并运行在(1)宿主上的app
(4)外部App : 安装在手机真实环境上的app

3.VA技术架构

(1) VA Space: 隔离的空间,VA App运行在这个虚拟空间

(2) VA Framework: 瞒天过海

  • 修改VA App请求参数:改成宿主App 的参数信息
  • 拦截系统返回结果 :还原VA App请求时的参数

(3) VA Native
IO重定向: VA App访问绝对路径,但是没有安装到系统,需要转向VA 内部安装的路径
hook jni 函数

4. 官方总结:

通过上面技术架构可以看到,VA内部的APP实际是跑在VA自己的VA Framework之上。
VA已将其内部APP的全部系统请求进行拦截,通过这项技术也能对APP进行全面控制,而不仅仅只是多开。
并且为了方便开发者,VA还提供了SDK以及Hook SDK。

二、实践

由于官网的代码已经很旧,编译难免各种问题,找到如下Github 大神的更新贴( 2022/07)
https://github.com/ServenScorpion/VirtualApp

1. 下载代码编译

其中,根据编译提示, cmake 需下载对应 3.6 版本
实测
(1) 在Android 11真机上运行OK
(2) android 12/13 会FC ,调用栈如下, 原因有待分析(初步看是 VA lib 里出错)

2. Android 13 FC

15:04:03.178 16115 16115 AndroidRuntime: FATAL EXCEPTION: main
15:04:03.178 16115 16115 AndroidRuntime: Process: com.serven.scorpion, PID: 16115
15:04:03.178 16115 16115 AndroidRuntime: java.lang.NullPointerException: Attempt to read from fieldjava.lang.String com.lody.virtual.server.pm.parser.VPackage.packageName on a null object reference in method int com.scorpion.utils.InstallTools.checkAPKProcess(java.io.File)
15:04:03.178 16115 16115 AndroidRuntime: at com.scorpion.utils.InstallTools.checkAPKProcess(Unknown Source:10)
15:04:03.178 16115 16115 AndroidRuntime: at io.virtualapp.home.adapters.CloneAppListAdapter.(CloneAppListAdapter.java:47)
15:04:03.178 16115 16115 AndroidRuntime: at io.virtualapp.home.ListAppFragment.onViewCreated(ListAppFragment.java:105)
15:04:03.178 16115 16115 AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1430)

4. Android 11 OK

VA 的历史与版权纠纷参考
https://www.zhihu.com/question/48269910

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐