Xposed 源码剖析(二)

0x00 背景

之前提到当安装Xposed framework后,Xposed framework会替换一个新的app_process/system/bin/中,app_process 就是Android中的Zygote进程,这期以app_process的实现为主线来详细分析Xposed framework的实现。

0x01 框架分析

首先从main函数开始:

main() {
    if (zygote) {
        isXposedLoaded = xposed::initialize(true, startSystemServer, NULL, argc, argv);
        runtimeStart(runtime, "de.robv.android.xposed.XposedBridge", args, zygote);
   }
}

在修改的main函数中,首先调用initialize函数初始化Xposed的运行时环境,然后再调用runtimeStart启动运行时环境。

initialize函数的内部实现如下:

namespace xposed {
XposedShared* xposed = new XposedShared;

/** Initialize Xposed (unless it is disabled). */
bool initialize(bool zygote, bool startSystemServer, const char* className, int argc, char* const argv[]) {
    ...
    xposed->zygote = zygote;
    xposed->startSystemServer = startSystemServer;
    xposed->startClassName = className;
    xposed->xposedVersionInt = xposedVersionInt;

    ...
    if (startSystemServer) {
        if (!xposed::service::startAll()) {
            return false;
        }
        xposed::logcat::start();
    }
    ...

    return addJarToClasspath();
}

其内部主要做了三件事情,首先给XposedShared对象内部的成员赋值,然后调用startAll()接口启动所有服务,最后调用addJarToClasspath()XposedBridge.jar添加至系统目录,之后会将它加入到Zygote进程地址空间中。

这里最重要的就是startAll(),进一步来看它的代码实现:

bool startAll() {
    bool useSingleProcess = !xposed->isSELinuxEnabled;
    if (xposed->isSELinuxEnabled && !membased::init()) {
        return false;
    }

    if (!useSingleProcess) {
      pid = fork();
      if (pid == 0) {
  //child
          systemService();
      }
    }

    pid = fork();
    if (pid == 0) {
  //child
        appService(useSingleProcess);
    }
}

代码有所删减,关于SELinux的部分不详细展开,只要知道如果开启SELinux时,需要初始化一段供Xposed使用的内存,然后通过fork系统调用创建子进程,并在子进程中调用systemServiceappService来添加Xposed需要的服务。

来看appService的代码实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值