zoukankan      html  css  js  c++  java
  • xposed结合Zygote分析

      android中zygote相信大家都很熟悉,它执行的函数是app_main.cpp,而xposed主要实现的就是替换app_main.cpp。所以在分析xposed时有必要来认识下zygote。好了,废话不多说,直接看app_main.cpp源码我们发现其main函数主要由AppRuntime.start(className,bool)执行;而AppRuntime继承自AndroidRuntime,那自然去看AndroidRuntime.start(className,bool),其主要走三步:

      1 startVm:创建虚拟机===>在此函数中首先设置虚拟机的参数,然后开启虚拟机,故虚拟机参数是在开机时就定下来了

      2 startReg(env):注册JNI函数===>注册gRegJNI数组里的jni函数

      3 CallStaticVoidMethod(startClass,startMeth,strArray):startClass=ZygoteInit,startMeth=main,从此进入java世界

      上面是原本android中app_main会执行的主要操作,那对于xposed来说有会做哪些修改呢?

      第3步,根据startClass来执行java 类,改变其值就可以改变执行流程。在xposed是这么操作的:

    runtime.start(isXposedLoaded ? XPOSED_CLASS_DOTS_ZYGOTE : "com.android.internal.os.ZygoteInit",
                    startSystemServer ? "start-system-server" : "");

      若xposedLoaded则在start中执行XPOSED_CLASS_DOTS_ZYGOTE,否则执行原本类"com.android.internal.os.ZygoteInit"。ok,来看下XPOSED_CLASS_DOTS_ZYGOTE为何物:

    #define XPOSED_CLASS_DOTS_ZYGOTE "de.robv.android.xposed.XposedBridge"

      原来去执行XposedBridge的main函数,关于main函数看Xposed学习三。在执行XposedBridge的main了,那原来的ZygoteInit不执行了吗?不急,看main函数:

    if(startClassName == null) {
                 ZygoteInit.main(args);
             } else {
                 RuntimeInit.main(args);
             }

      ok,继续上面的流程应该是去执行ZygoteInit.main函数了。在main函数会加载preloadClass()(此加载类函数很耗时间),preloadResource()。但最主要的是创建system_server,接着systerm_server会创建系统级的service,其中就包括PackageManagerService。而PackageManagerService在启动过程中会对系统中的应用程序进行安装(出现loadPackage嘞),也就是说每次开机都会重新安装所有的app。那怎么知道系统中安装了多少应用程序呢,android系统会把已安装的app信息写到/data/system/packages-xml中。

      好了,背景到此为止,我们不继续深入了。在开机时会安装之前存在的app,即会加载package。嗯哼,知道IXposedHookLoadPackage在哪里会执行了吧。就到这里,细节看Xposed学习三

      以上是结合xposed的一些分析,现在我们来看看Zygote在android系统的其他方面。

       Zygote 提供了三种创建进程的方法:  

        fork():        创建一个Zygote进程;

        forkAndSpecialize(): 创建一个非Zygote进程;其他特殊进程需要通过Zygote来

        forkSystemServer(): 创建一个系统服务进程;即ServerServer 

    参考资料:

     1 深入理解 Android 卷I第4章 深入理解 Zygote

     2 android系统源代码情景分析

  • 相关阅读:
    ISAG协议中彩信支持的几种附件格式(河南电信)
    河南电信ISAG短信下行数据格式
    SQL中varchar和nvarchar有什么区别?
    通过一个很实用的例子让你学会TSQL编程的基本语法和思想
    在读取或者保存word时,程序捕获到word异常“word无法启动转换器mswrd632 wpc”
    工作基本搞定等待周五入职
    ClickOnce发布时,资源文件添加问题
    访问IIS元数据库失败
    一个随机产生中文简体字的一个类
    QQ抢车位外挂(续)
  • 原文地址:https://www.cnblogs.com/vendanner/p/4797363.html
Copyright © 2011-2022 走看看