微信分身,微信多开,微信双开

news/2024/11/24 13:22:52/

2016-07-08 更新


由于公司放弃该方案哪就不压箱底了,开源造福人类,呵呵


先说一下实现双开(多开)的几种方案

  1. 静态修改APK包名,然后重打包
    • 作为厂商肯定不推荐这个方式拉,可能存在法律风险
  2. 动态修改APK包名
    • 对原生代码修改量小,兼容性差,部分APP需单独适配
  3. 动态修改进程的实例
    • 对原生代码修改量大,兼容性一般,可能会导致系统一些乱七八糟的BUG
  4. 通过多用户机制实现
    • MIUI的实现机制,更多的是修改多用户在相关的代码
  5. 通过动态加载(运行)的机制来实现(LBE的平行空间)
    • 作为第三方开发者,不能ROOT,不能修改系统源码,逼的LBE用这种方式,也是难为他们了

上面几种方式是常见的几种方式,我选择的是方式2,之所以用第2种方式是由于去年年底友商也只出了微信的双开,从技术角度我需要尽快跟进,所以用了一个代码修改量小,门槛不算高的方式快速跟进。


OK,接下来我详细说一下方式2的细节。


我们分为两部分:

  1. 安装部分
    1. APP安装流程就不科普了,操作是这样的,先安装微信,然后再一次安装微信,这个时候会在系统里存在两个微信,当然原生代码做了校验,我们修改了关键函数校验代码,通过PackageInstaller第二次安装微信的流程如下:
      PackageManagerServer::installPackageLI // 安装函数
                  //#yunajie@System.Security.AppClone.Feature {@if ( ((installFlags & PackageManager.INSTALL_WEIXIN_CLONE) != 0) ) {pkg = pp.parsePackage(tmpPackageFile, parseFlags | PackageParser.PARSE_CLONE_WEIXIN);} else {pkg = pp.parsePackage(tmpPackageFile, parseFlags);}// @}
      PackageParser::parsePackageSplitNames // 解析函数
              //#yunajie@System.Security.AppClone.Feature {@if ((flags & PARSE_CLONE_WEIXIN) != 0) {//Log.i("yunajie", "parsePackageSplitNames::printStackTrace1: " + packageName);//new Exception().printStackTrace();//Log.i("yunajie", "parsePackageSplitNames::printStackTrace2");if ("com.tencent.mm".compareToIgnoreCase(packageName) == 0) {boolean bInstallWeixinShadow = false;Throwable throwable = new Throwable();StackTraceElement[] stackElements = throwable.getStackTrace();if (null != stackElements) {for (int i = 0; i < stackElements.length; i++) {String szMethodName = stackElements[i].getMethodName();if ("installPackageLI".compareToIgnoreCase(szMethodName) ==  0 ||"scanPackageLI".compareToIgnoreCase(szMethodName) ==  0) {bInstallWeixinShadow = true;break;}}}throwable = null;if (bInstallWeixinShadow) {return Pair.create("com.tencent.mm2".intern(),(splitName != null) ? splitName.intern() : splitName);}}}// @}
      PackageParser::buildClassName // 处理一下类
                  //#yunajie@System.Security.AppClone.Feature {@if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {return ("com.tencent.mm" + cls).intern();}// @}
       呵呵,到此为止,已经可以安装两个微信了,但实际上还运行不起来,看第2部分

  2. 运行部分
    1. 好了,当你看到桌面上有2个微信图标是不是很兴奋,结果运行不起来,打开JNI日志,查看各种崩溃信息我已经修改了绝大部分的问题了,主要是查找类的时候路径找不到,看代码了。
      class_linker::FindClass
        //#yunajie@System.Security.AppClone.Feature {@LOG(INFO) << "yunajie::FindClass1: " << descriptor;std::string str_descriptor(descriptor);if (str_descriptor.find("tencent/mm2com") != std::string::npos) {str_descriptor.erase(1, 15);} else if (str_descriptor.find("tencent/mm2") != std::string::npos) {str_descriptor.erase(15, 1);}LOG(INFO) << "yunajie::FindClass2: " << str_descriptor;descriptor = const_cast<const char*>(str_descriptor.c_str());// @}
      是不是很简单,对,就是很简单。
  3. 后续总结
    1. 已经完美运行了,没发现什么问题,咦,发红包崩溃啊,好,有包名校验,改之:
      ContextWrapper::getPackageName
              //#yunajie@System.Security.AppClone.Feature {@String pkg = mBase.getPackageName();if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {Throwable throwable = new Throwable();StackTraceElement[] stackElements = throwable.getStackTrace();if (null != stackElements) {for (int i = 0; i < stackElements.length; i++) {if (stackElements[i].getClassName().indexOf("MyKeyboardWindow") > 0) {pkg = "com.tencent.mm";break;}}}throwable = null;return pkg;}//@}


完。


====== 华丽的分割线 ======


自己来填坑了,360OS 的微信分身是如何实现的还不知道,因为手上拿到的手机无法ROOT,可以ROOT的手机已经在路上了。但这里和大家分享一下思路:

  1. 我们知道可以通过修改包名达到共存的目的,对于微信这类的APP当然最好不要直接修改包名,我们可以在框架层动态的修改包名,骗过系统以为有两个包,然后运行com.tencent.mm2的时候把需要的东西全部映射回原来的包,这是我的做法,已经完美运行了。
  2. 研究了乐视的做法,他是直接去修改AMS的流程来实现的,感觉这做法对AMS的流程修改有点大,说不好会有坑。

给需要的朋友参考一下思路。


附图:







http://www.ppmy.cn/news/278292.html

相关文章

Flatpickr教程:使用JavaScript快速创建一个自定义日期选择器

部分数据来源&#xff1a;ChatGPT 引言 如果您是一个网站开发者&#xff0c;想为自己的网站添加方便易用的日期选择对话框&#xff0c;那么Flatpickr日期选择对话框可能正好符合您的需要。在这篇文章中&#xff0c;我们将详细介绍如何使用Flatpickr日期选择对话框&#xff0c…

068:cesium lookAtTransform围绕一个固定点上下左右旋转查看

第068个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中查看一个固定的点的情况,从上下左右不同的维度进行查看。这里面使用lookAtTransform这个操作函数。lookAtTransform(transform, offset),这里的offset偏移量可以是笛卡尔坐标或航向/俯仰/范围。 直接复制下面…

计算机网络第三章——数据链路层(上)

提示&#xff1a;节物风光不相待。桑田碧海须臾改 文章目录 前言3.1.1 数据链路层功能数据链路层功能概述 3.2.1 封装成帧和透明传输封装成帧透明传输组帧的四种方式字符计数法字符填充法零比特填充法违规编码法 3.3.1 差错控制&#xff08;检错编码&#xff09;奇偶校验码CRC循…

c++学习——多态

多态 **多态的语法****多态的底层原理图****多态案1——计算机类****纯虚函数和抽象类****多态案例2——饮品****虚析构和纯虚析构****多态案例3—— 电脑组装** 多态是C面向对象三大特性之一 多态分为两类 静态多态:函数重载和运算符重载属于静态多态&#xff0c;复用函数名 动…

【X240 QQ视频对方听不到声音】解决方法

【X240 QQ视频对方听不到声音】解决方法&#xff1a; win7为例&#xff1a; 右键点击右下角的“小喇叭”图标&#xff0c;点击“录音设备”&#xff0c;显示如下图&#xff1a; 点击&#xff0c;上图中的“麦克风”&#xff0c;再点击右下角的“属性”按钮&#xff0c;显示如下…

Windows10下开视频对方听不到声音

Windows设置&#xff08;Windows键i&#xff09;——>系统——>声音——>声音控制面板 点击&#xff1a;录制——>麦克风右键选择属性 级别&#xff1a;

十四.Deepin Linux V20.7 插入耳机听不到声音的解决办法

1. 现象 默认情况下&#xff0c;我的电脑是联想y7000笔记本&#xff0c;使用音箱播放声音正常&#xff0c;但插入耳机时&#xff0c;耳机中没有声音&#xff0c;该主板的音频适配器(声卡) 是 GP107GL High Definition Audio Controller&#xff0c;如下 查看控制中心&#xff…

Ubuntu没有声音(听不到声音)的解决方法

1. 安装 PulseAudio Volum Control&#xff08;pavucontrol&#xff09;&#xff1a;基于GTK开发的图形化声音管理工具。 打开终端&#xff08;terminal&#xff09; 输入命令&#xff1a;sudo apt install pavucontrol 然后&#xff0c;等待安装结束。 2. 继续输入命令&am…