VirtualApp 安卓沙盒多开实战教程:从读懂架构到提交第一个贡献的完整指南
【免费下载链接】VirtualAppVirtual Engine for Android(Support 14.0 in business version)项目地址: https://gitcode.com/GitHub_Trending/vi/VirtualApp
VirtualApp 是一款运行在 Android 上的沙盒引擎(轻量级「Android 虚拟机」),让未安装到系统的 App 也能在容器内运行,实现应用双开、多开与移动办公数据隔离。参与它的开发,你将直接上手 Android Framework Hook(拦截并替换系统方法)、IO 重定向与 Native Hook 等底层技术,是从 Java 层走向系统底层的高价值练手项目。
🗺️ 项目全景:三层技术架构与模块地图
VirtualApp 的核心思路是「欺骗」系统:VA 内部的 App 并没有真正安装到 Android 系统,Framework 层拦截其全部系统请求、改写参数后放行,再在返回时还原,App 便能在沙盒内跑通。整个技术栈分三层:
- VA Space:提供系统隔离的内部空间,存放安装在容器内的 App
- VA Framework:核心代理层,拦截并修改虚拟 App 与 Android 系统之间的所有请求
- VA Native:Native 层 Hook,完成 IO 重定向(把 App 写死的绝对路径转向沙盒内路径)和 JNI 函数拦截
仓库采用 Gradle 多模块结构,核心模块如下:
| 模块/目录 | 一句话职责 |
|---|---|
| 示例主包 app | Demo 宿主 App,演示如何集成并调用 VA 的三大 API |
| 核心库 lib | VA 全部框架代码:client Hook、server 服务端、mirror 反射工具 |
| Native 层 jni | 沙盒文件系统(Foundation)、Hook 框架(HookZz、Substrate)、fbjni |
| 开发文档 doc | 源码结构说明 + SDK 使用指南,读代码前的最佳入口 |
VirtualApp 三层技术架构图:VA Space、VA Framework 与 VA Native 的分工关系
🛠️ 环境搭建:克隆、构建到首次运行的最小路径
先说明一句实话:仓库公开代码停留在早期版本,构建脚本使用 Gradle 4.1 + AGP 3.0.1,建议使用较老的 Android Studio(如 3.x 系列)或 JDK 8 环境编译;新版 IDE 直接打开大概率报错,这本身就是很好的版本适配练习素材。
git clone https://gitcode.com/GitHub_Trending/vi/VirtualApp cd VirtualApp/VirtualApp ./gradlew :app:assembleDebug构建产物在app/build/outputs/apk/,安装到设备后启动,即可在首页克隆外部已安装的 App(如微信、QQ)并在沙盒内打开。
影响「能不能跑起来」的关键配置只有三处:
- app/build.gradle 中的
applicationId "io.virtualapp":宿主包名,插件包必须与其匹配,改了包名要同步改 Manifest - VApp.java 中
VASettings.ENABLE_IO_REDIRECT = true:IO 重定向开关,关闭后文件隔离失效,部分 App 会打不开 minSdkVersion 15/targetSdkVersion 22:Demo 面向老版本 Android,真机测试建议同时覆盖 Android 8 与 12 两台设备
🧭 代码地图:五类进程中谁在哪个包里干活
VA 运行时涉及 5 类进程:VA Host Main(主包 UI 进程)、VA Host Plugin(64 位插件包进程)、VAPP Client(虚拟 App 进程)、VA Server(处理安装等不交给系统的请求)、CHILD(保活等其他子进程)。
VirtualApp 五类进程架构图:主包、插件包、VAPP Client 与 VA Server 的协作关系
按「看哪个包做什么事」来定位代码,建议顺序如下:
| 包路径 | 运行进程 | 职责 |
|---|---|---|
| com.lody.virtual.client | VAPP Client | 各系统 Service 的 Hook 与代理,hook/proxies/下按 am、pm、notification 等分目录 |
| com.lody.virtual.server | VA Server | App 安装、包管理(pm/)、活动调度(am/)等虚拟系统服务 |
| mirror | 全部 | 对系统隐藏类的静态反射引用,是减少反射代码的工具层 |
| jni 目录 | VAPP Client | 沙盒文件系统SandboxFs、IO 重定向与 ARM/X86 的 Hook 实现 |
| DelegateApplication64Bit.java | VA Host Plugin | 插件包加载主包代码的入口 |
插件包通过 DelegateApplication 加载主包代码的进程结构
一个实用技巧:遇到「某系统 API 在沙盒里行为不对」,先按包名在client/hook/proxies/下找到对应 Service 的 Stub 类,再看mirror下对应版本分支类(如IActivityManagerN.java对应 Android 8.0),问题范围能立刻缩小一半。
🚀 实战演练:用三步 API 完成你的第一个任务
你的第一个贡献任务不妨就选「跑通安装—启动—卸载全链路,并写一份可复现的验证记录」。VA 屏蔽了复杂细节,三个 API 即可完成基础使用。
第一步,在宿主 Application 中启动引擎。可对照 VApp.java 的写法:
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); VASettings.ENABLE_IO_REDIRECT = true; VirtualCore.get().startup(base); }第二步,安装并启动目标 App:
// 双开外部已安装的应用(package 协议) VAppInstallerParams params = new VAppInstallerParams(VAppInstallerParams.FLAG_INSTALL_OVERRIDE_NO_CHECK); VirtualCore.get().installPackage( Uri.parse("package:com.tencent.mobileqq"), params); // 启动 / 卸载 VActivityManager.get().launchApp(0, "com.tencent.mobileqq"); VirtualCore.get().uninstallPackageAsUser("com.tencent.mobileqq", 0);注意package协议是「双开」(跟随外部版本升级/卸载),file协议则是把 APK 拷入容器内部安装的「免安装」模式,二者对应PackageSetting中dynamic标志的不同取值,理解这个区别是后续排查安装类 Bug 的基础。
做完这一步,你具备了独立复现任何「App 装不上 / 打不开」问题的能力——而这正是该项目最高频的贡献场景。
📮 从 Issue 到 PR:贡献流程与提交前自检清单
完整链路建议按四步走:
- 认领:在 Issues 列表中挑选带明确崩溃日志(含 Android 版本、App 包名与版本)的问题;先在本地复现并定位到具体 Hook 或代理类
- 编码:遵循项目既有风格——Java 侧优先复用
mirror包的静态引用而非裸反射;Native 侧改动保持 ARM32/64 与 X86 多架构同步 - 自测:至少覆盖一个低版本(8.x 及以下)与一个高版本(12 及以上)设备,并回归「启动主包 → 克隆 App → 杀进程重启」主链路
- 提交:分支名用
fix/或feat/前缀(如fix/pm-query-crash),提交信息写清「现象—根因—修改点」三要素
提交前自检清单:
- 改动未破坏
client与server两端参数改写的对称性(请求改了什么,返回就要还原什么) - 新增系统 API 处理时,检查
mirror下是否已有对应版本的隐藏类引用可复用 - 32 位主包与 64 位插件包路径均验证通过
- 无
VLog之外的调试输出残留,日志带统一 tag - 本地
assembleDebug全量编译通过
🔍 高频贡献场景:兼容性适配、Hook 修复与文档补全
新 Android 版本适配:系统升级后大量 API 参数变化是最高频的问题来源。思路是拿到崩溃堆栈,定位到mirror中缺失的版本分支类(如 N 与 O 之间的差异),补上字段引用并在对应 Stub 中处理。
特定 App 打不开的 Hook 修复:先判断卡在哪一层——Framework 层请求被拦下看client/hook/proxies/,路径找不到则是 IO 重定向问题,去看Foundation/SandboxFs与VMPatch。
文档补全:仓库文档以 doc/VADev.md 为核心,其中部分截图引用的是外部链接,替换为仓库内图片、补全模块说明都是低风险且容易合并的贡献。
🤝 社区协作与贡献者成长阶梯
问题与讨论主要通过仓库的 Issues 区进行:提交 Bug 时附上 Android 版本、设备、目标 App 版本和完整 logcat,维护者与社区才能快速判断;对已有 Issue 补充复现信息同样是有效贡献。
成长路径可以分三步走:
- 初级:修复一个空指针或补齐一个缺失的 Stub 方法,熟悉 client/server/mirror 三层分工
- 中级:独立完成某 App 或某 Android 版本的适配,能自主判断问题在 Java 层还是 Native 层
- 高级:主导一个子系统(如 IO 重定向或包安装流程)的改造,参与架构级讨论
这个项目的价值在于它把 Android 系统最底层的 Framework 代理、沙盒隔离与 Native Hook 技术完整摊开在源码里。无论你最终提交的是一个小修复还是一份文档,亲手让一个未安装的 App 在沙盒中跑起来的那一刻,你对 Android 运行时的理解就已经和大多数开发者不同了。
【免费下载链接】VirtualAppVirtual Engine for Android(Support 14.0 in business version)项目地址: https://gitcode.com/GitHub_Trending/vi/VirtualApp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考