无需 root 也能使用 xposed!
文章作者:田维术( .meabo t)原文链接: .me20171202non-root-xposed xposed是android系统上久负盛名的一个框架,它给了普通用户任意 diy 系统的能力；比如典型的微信防撤回、自动抢红包、修改主题字体,以及模拟位置等等等等。不过,使用xposed的前提条件之一就是需要root。随着android系统的演进,这一条件达成越来越难了；那么, 能不能不用root就可以享用xposed的功能呢？ 我们想一下,xposed为什么需要root？从现在的实现来看,因为xposed需要修改系统文件,而这些文件只有root权限才能修改；但是这只是当前实现的特性(修改系统分区文件),而非根本原因。xposed要实现的最终目的是在任意app进程启动之前能任意加载 特定xposed模块 的代码；这些特定的xposed模块中能在app进程启动之前有机会执行特定代码,从而控制任意进程的行为。归根结底,xposed需要控制别的进程,而没有高级权限(root),越俎代庖是不行的。 有没有别的实现方式？ 虽然没有办法控制别的进程,但是在本进程内,几乎是可以为所欲为的；如果换个方式, 把别的app放在自己的进程里面运行,然后hook自己 不就打到目的了嘛？「把别的app放在自己的进程里面运行」这种机制是容器,或者通俗点叫双开；「hook自己」这是典型的dexposed的思路,不过dexposed不支持art-但前不久 epic 的出现完成了这最后一块拼图。(关于epic在art上实现aop hook可以参考 我为dexposed续一秒-论art上运行时 method aop实现( .me20171123dexposed-on-art) 双开的典型实现是lody的 virt alapp(  alapp),那么我们来一看 virt alapp 与 epic 结合会产生什么样奇妙的化学反应。 我们的思路很清晰:用 virt alapp 去启动别的app,在启动过程中通过 epic hook本进程,从而控制被启动的app。同时,由于xposed模块已经比较成熟,而且有成千上万的插件生态,最好能够直接复用xposed 的模块,使得在双开环境下,xposed模块就跟运行在root手机中的xposed环境中一样。为此,我写了一个 双开环境下的xposed兼容层:exposed( )；同时,修改了 virt alapp 的部分实现,使得它能够在进程的启动的时候加载 exposed 这个兼容层,代码在这:vaexposed( )。这样,在双开环境中,可以直接加载已有的xposed模块进而实现非root模式下的xposed的功能。更有趣的是,你还可以直接使用 xposedinstaller 安装和管理任意的xposed模块,就跟你使用真正的xposed一样！ 具体的代码就不详细讲了,可以直接去看源码exposed,vaexposed 我们以微信防撤回为例,看看具体的效果: 首先安装vaexposed这个修改版的双开apk,你可以clone源码直接b ild,也可以使用我编译好的版本 gith b下载( b  alappvaexposed_0.1.5.apk),百度网盘: .coms1qxb9qty 密码: i45e 然后安装微信防撤回模块:微信巫师,发布的主页在这:wechat magician；直接下载链接: lescom.gh0 1l5.wechatmagician v30 1387ce.apk 这样,使用双开中的微信,就能享受xposed模块的防撤回功能了！ 另外,你还可以直接在双开中使用 xposedinstaller,然后就可以方便滴下载和管理xposed模块了: 就这样,我们在非root手机下,就能享用xposed模块的功能,have f n :) 不过,在实现完这个功能之后,我不寒而栗:千万不要在root环境或者双开环境下运行关键app,不然你的微信登录密码,支付宝支付密码,银行卡账号,很有可能被尽收眼底。 ps:目前 exposed 层的实现处于初级阶段,个人精力非常有限(一般都是凌晨写代码)；如果你对 实现非root模式下的xposed 感兴趣,非常欢迎跟我一起组队 :) 项目地址在这: 。