一、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.<init>(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)
3. Android 12
14:11:23.267 27303 27303 AndroidRuntime: FATAL EXCEPTION: main
14:11:23.267 27303 27303 AndroidRuntime: Process: com.serven.scorpion, PID: 27303
14:11:23.267 27303 27303 AndroidRuntime: java.lang.RuntimeException: transact remote server failed
14:11:23.267 27303 27303 AndroidRuntime: at com.scorpion.splash.LoadingActivityO00OOOOO0000OO00000O0OOOO00O0OO00OO0OO0000OOO000O00OO000O00OO00OOOOOO00OOO000OO0O0OO00OOOOOOOOO00OO000OOOO00O0OOO0OO00O00O0O000000O0OO00O000O0O0O0OOO0000O0O00OOO0OO00O0OO0OO000000O00OOO0O00OOOOOO00O0O00OOO00O0OO0OO0OOO0O00OO0O00OO0000000O00OO0O0OOOO00000O0OOOO00O00O0OOO0O0O0O0OO00OOOO0O000O0O000000$O00OOOOO0000OO00000O0OOOO00O0OO00OO0OO0000OOO000O00OO000O00OO00OOOOOO00OOO000OO0O0OO00OOOOOOOOO00OO000OOOO00O0OOO0OO00O00O0O000000O0OO00O000O0O0O0OOO0000O0O00OOO0OO00O0OO0OO000000O00OOO0O00OOOOOO00O0O00OOO00O0OO0OO0OOO0O00OO0O00OO0000000O00OO0O0OOOO00000O0OOOO00O00O0OOO0O0O0O0OO00OOOO0O000O0O000000.getActivityInfo(Unknown Source:40)
14:11:23.267 27303 27303 AndroidRuntime: at com.lody.virtual.client.ipc.VPackageManager.getActivityInfo(Unknown Source:4)
4. Android 11 OK
VA 的历史与版权纠纷参考
https://www.zhihu.com/question/48269910
网友评论