虚拟应用 (Virtual App, VA): Android 系统沙盒,轻量级Android虚拟机
一句话:通过拦截应用的全部系统请求,实现对app的全面控制。
源码及官方文档介绍
https://github.com/asLody/VirtualApp
(2017/12后开源代码停止更新)
(1)宿主App: 真正安装的系统上的应用, 集成了 VA libs (用户是在这个App 上添加其它应用的分身)
(2)宿主插件:在使用宿主App拓展功能时用到的,例如64位插件
(3)虚拟App(VA App) : 安装并运行在(1)宿主上的app
(4)外部App : 安装在手机真实环境上的app
(1) VA Space: 隔离的空间,VA App运行在这个虚拟空间
(2) VA Framework: 瞒天过海
(3) VA Native
IO重定向: VA App访问绝对路径,但是没有安装到系统,需要转向VA 内部安装的路径
hook jni 函数
通过上面技术架构可以看到,VA内部的APP实际是跑在VA自己的VA Framework之上。
VA已将其内部APP的全部系统请求进行拦截,通过这项技术也能对APP进行全面控制,而不仅仅只是多开。
并且为了方便开发者,VA还提供了SDK以及Hook SDK。
由于官网的代码已经很旧,编译难免各种问题,找到如下Github 大神的更新贴( 2022/07)
https://github.com/ServenScorpion/VirtualApp
其中,根据编译提示, cmake 需下载对应 3.6 版本
实测
(1) 在Android 11真机上运行OK,
(2) android 12/13 会FC ,调用栈如下, 原因有待分析(初步看是 VA lib 里出错)
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)
VA 的历史与版权纠纷参考
https://www.zhihu.com/question/48269910