微信小程序> 微信分身,微信分身,微信多开,微信双开

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

浏览量:526 时间: 来源:丿灬安之若死
由于公司放弃该方案哪就不压箱底了,开源造福人类,呵呵
先说一下实现双开(多开)的几种方案
静态修改APK包名,然后重打包作为厂商肯定不推荐这个方式拉,可能存在法律风险动态修改APK包名对原生代码修改量小,兼容性差,部分APP需单独适配动态修改进程的实例对原生代码修改量大,兼容性一般,可能会导致系统一些乱七八糟的BUG通过多用户机制实现MIUI的实现机制,更多的是修改多用户在相关的代码通过动态加载(运行)的机制来实现(LBE的平行空间)作为第三方开发者,不能ROOT,不能修改系统源码,逼的LBE用这种方式,也是难为他们了
上面几种方式是常见的几种方式,我选择的是方式2,之所以用第2种方式是由于去年年底友商也只出了微信的双开,从技术角度我需要尽快跟进,所以用了一个代码修改量小,门槛不算高的方式快速跟进。
OK,接下来我详细说一下方式2的细节。
我们分为两部分:
安装部分APP安装流程就不科普了,操作是这样的,先安装微信,然后再一次安装微信,这个时候会在系统里存在两个微信,当然原生代码做了校验,我们修改了关键函数校验代码,通过PackageInstaller第二次安装微信的流程如下:PackageManagerServer::installPackageLI//安装函数[java]//#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//解析函数[java]//#yunajie@System.Security.AppClone.Feature{@if((flags&PARSE_CLONE_WEIXIN)!=0){//Log.i("yunajie","parsePackageSplitNames::printStackTrace1:"+packageName);//newException().printStackTrace();//Log.i("yunajie","parsePackageSplitNames::printStackTrace2");if("com.tencent.mm".compareToIgnoreCase(packageName)==0){booleanbInstallWeixinShadow=false;Throwablethrowable=newThrowable();StackTraceElement[]stackElements=throwable.getStackTrace();if(null!=stackElements){for(inti=0;istackElements.length;i++){StringszMethodName=stackElements[i].getMethodName();if("installPackageLI".compareToIgnoreCase(szMethodName)==0||"scanPackageLI".compareToIgnoreCase(szMethodName)==0){bInstallWeixinShadow=true;break;}}}throwable=null;if(bInstallWeixinShadow){returnPair.create("com.tencent.mm2".intern(),(splitName!=null)?splitName.intern():splitName);}}}//@}PackageParser::buildClassName//处理一下类[java]//#yunajie@System.Security.AppClone.Feature{@if("com.tencent.mm2".compareToIgnoreCase(pkg)==0){return("com.tencent.mm"+cls).intern();}//@}呵呵,到此为止,已经可以安装两个微信了,但实际上还运行不起来,看第2部分运行部分好了,当你看到桌面上有2个微信图标是不是很兴奋,结果运行不起来,打开JNI日志,查看各种崩溃信息我已经修改了绝大部分的问题了,主要是查找类的时候路径找不到,看代码了。class_linker::FindClass[java]//#yunajie@System.Security.AppClone.Feature{@LOG(INFO)"yunajie::FindClass1:"descriptor;std::stringstr_descriptor(descriptor);if(str_descriptor.find("tencent/mm2com")!=std::string::npos){str_descriptor.erase(1,15);}elseif(str_descriptor.find("tencent/mm2")!=std::string::npos){str_descriptor.erase(15,1);}LOG(INFO)"yunajie::FindClass2:"str_descriptor;descriptor=const_castconstchar(str_descriptor.c_str());//@}是不是很简单,对,就是很简单。后续总结已经完美运行了,没发现什么问题,咦,发红包崩溃啊,好,有包名校验,改之:ContextWrapper::getPackageName[java]//#yunajie@System.Security.AppClone.Feature{@Stringpkg=mBase.getPackageName();if("com.tencent.mm2".compareToIgnoreCase(pkg)==0){Throwablethrowable=newThrowable();StackTraceElement[]stackElements=throwable.getStackTrace();if(null!=stackElements){for(inti=0;istackElements.length;i++){if(stackElements[i].getClassName().indexOf("MyKeyboardWindow")0){pkg="com.tencent.mm";break;}}}throwable=null;returnpkg;}//@}
完。
======华丽的分割线======
自己来填坑了,360OS的微信分身是如何实现的还不知道,因为手上拿到的手机无法ROOT,可以ROOT的手机已经在路上了。但这里和大家分享一下思路:
我们知道可以通过修改包名达到共存的目的,对于微信这类的APP当然最好不要直接修改包名,我们可以在框架层动态的修改包名,骗过系统以为有两个包,然后运行com.tencent.mm2的时候把需要的东西全部映射回原来的包,这是我的做法,已经完美运行了。研究了乐视的做法,他是直接去修改AMS的流程来实现的,感觉这做法对AMS的流程修改有点大,说不好会有坑。给需要的朋友参考一下思路。
附图:



版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎