拓冰建站拓冰建站
首页 / 资讯中心 / 正文

3步跑通微信双开:VirtualApp安卓沙盒的运行原理与接入

3步跑通微信双开VirtualApp安卓沙盒的运行原理与接入【免费下载链接】VirtualAppVirtual Engine for Android(Support 14.0 in business version)项目地址: https://gitcode.com/GitHub_Trending/vi/VirtualAppVirtualApp 是一款 Android 沙盒 SDK它允许你把一个没装进系统包管理器的 APK 装进自己 App 内部并运行起来。双开、多开这类最常见的需求它都能接住也适合做移动办公的数据隔离。这篇文章讲清它靠什么原理跑通以及 3 步接入的路径。 它到底在解决什么问题先说两个很具体的场景。第一个你的手机里装着工作微信现在想再挂一个私人号可系统只认一份安装。第二个企业给员工发手机装了一个内部办公 App但聊天记录、缓存文件不能落到个人区域否则离职交接就是灾难。说白了这两个需求都指向同一件事让一个没安装到系统的 App 像正常 App 一样跑起来。VirtualApp 干的就是这个活。打个比方它相当于在你手机里隔出一个套间——住在里面的 App 以为自己有独立的厨卫私有数据目录、文件、进程而系统这位房东从头到尾只知道整栋楼宿主 App。⚙️ 它是怎样跑起来的先记住一点沙盒里的 App 并没有真正安装到系统里。而 Android 只接纳已安装的 App所以 VirtualApp 做了三层手脚。第一层是请求改写。虚拟 App 发出的每一个系统服务请求都会被沙盒拦下来把里面与自己是谁相关的参数悄悄换成宿主的参数再交给 Android 处理等结果返回时再把参数还原。对系统来说这些请求的签名完全合法它压根不知道背后是另一个 App 在说话。第二层是IO 重定向。不少 App 会写死绝对路径读文件比如直接 open/data/data/com.tencent.mm下的数据库可这个路径在真实系统上根本不存在。沙盒把这些路径改写成自己内部空间的实际位置读写才能落地。第三层是native hook。Java 层拦不住的那些调用部分 JNI 函数、系统调用就在 native 层 hook代码集中在 lib/src/main/jni/ 目录里面有 IOUniformer、SymbolFinder 这类文件路径改写和符号查找的 C 实现。为什么非这么设计不可因为 Android 的安装流程是单行道不经过系统你没法再装一次唯一的办法就是在请求层扮成一个已安装的 App。而拦截做得越彻底控制力越强——双开只是这项能力最浅显的一种用法。进程侧运行时一共有 5 类进程宿主主包进程UI 所在、VA Server 进程处理不交给系统的请求比如安装、VAPP Client 进程真正跑目标 App进程名形如io.busniess.va:p1、插件进程和 Child 辅助进程。还有一个容易忽略的细节一个包只能以一种位宽模式运行所以沙盒要装两个包——默认主包 32 位、插件包 64 位遇到 64 位 App 就路由给插件包进程去跑。把三层视角拉到全景VA Space 提供隔离的安装空间VA Framework 夹在 Android Framework 和虚拟 App 之间做请求代理AMS、PMS、Location 等十几个服务都有对应代理VA Native 负责 IO 重定向和 hook自上而下贯穿 APP、Framework、Native 三层。 最快的上手路径第 1 步把 lib 模块引入你的工程在attachBaseContext里启动引擎。Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); VirtualCore.get().startup(base); }第 2 步在onCreate里调用initialize引擎会按当前进程类型回调onMainProcess/onVirtualProcess/onServerProcess你只需在对应回调里做各自的初始化demo 的写法可以直接抄 VApp.java。第 3 步安装目标 App 并启动。VirtualCore.get().installPackageAsUser(0, com.tencent.mobileqq); VActivityManager.get().launchApp(0, com.tencent.mobileqq);配置项集中在根目录的 VAConfig.gradleext 块里就几行宿主包名、主包是否 32 位、自定义权限名。注意 manifest 里要声明与权限名一致的uses-permission否则宿主和虚拟进程之间的通信会被拒。 三个典型用法双开不卸载微信再开一个克隆手机上已安装的微信数据目录完全独立两个账号可以各登各的。双开之上还有多用户模式换一个 userId 就能再开一份理论上同一 App 可以无限多开。静默安装下完的 APK 直接跑不用弹系统安装确认框把下载好的 apk 直接交给安装 API用户感知不到装应用这个动作接近小程序的体验。独立应用市场、游戏中心都建立在这个能力上。VirtualCore.get().installPackage(Uri.fromFile(new File(/sdcard/game.apk)));数据隔离在个人手机上圈一块工作区文件隔离、组件隔离、进程通信隔离三件套工作 App 的聊天数据库、缓存全部落在沙盒内部目录个人区域碰不到。在此基础上稍作定制就能加行为审计、防截屏录屏、水印溯源这类管控。⚠️ 容易踩的坑Q启动虚拟 App 报 Failed to find provider info ...十有八九是 ContentProvider 的 authority 前缀配置和宿主包名对不上去 manifest 里核对 authority 声明。Q64 位的 App 打不开记住一个包只跑一种位宽检查主包 32 位那个开关配得对不对位宽不匹配的 App 应该由插件包进程接管确认插件包已装上。Q如何排查权限报错先查 manifest 声明的权限名和配置文件里的权限名是否一字不差不一致就直接被拒。再查敏感权限联系人、位置这类——虚拟 App 的权限结果由你注册的 delegate 回调决定检查自己写的那段逻辑。Q虚拟 App 读不到文件日志里是 FileNotFoundException多半是写死的绝对路径把 IO 重定向打开别让/data/data/xxx这类路径原样打到真实文件系统上。Q开源版能撑住新系统吗GitHub 上的代码 2017 年底就停更了商业版才持续适配到 Android 14 及以上。做商用选型时别拿开源代码估新系统兼容性。VirtualApp 的原理并不复杂扮演系统是眼双开、静默安装、数据隔离不过是同一项能力的三种姿势。下一步建议把仓库 clone 下来跑一遍 demo对照着 开发文档 看定制入口git clone https://gitcode.com/GitHub_Trending/vi/VirtualApp【免费下载链接】VirtualAppVirtual Engine for Android(Support 14.0 in business version)项目地址: https://gitcode.com/GitHub_Trending/vi/VirtualApp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门