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系统源代码情景分析

xposed结合Zygote分析的更多相关文章

  1. xposed学习四:总结

    xposed的学习要告一段落,接下来去学习android apk和so加固,这里我们回顾下xposed吧. xposed是个hook框架,它是基于dalvik(确切来说是目前的版本,作者说ART也快出 ...

  2. Xposed学习三:基石

    在上一篇我们留下问题:handleLoadPackage如何生效即在何时被执行. 先看XposedBridge.class的main(该函数是在appruntime.start函数中替换原先zygot ...

  3. Xposed原理分析

    目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...

  4. 阿里系产品Xposed Hook检测机制原理分析

    阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...

  5. Android系统启动分析(Init->Zygote->SystemServer->Home activity)

    整个Android系统的启动分为Linux Kernel的启动和Android系统的启动.Linux Kernel启动起来后,然后运行第一个用户程序,在Android中就是init程序. ------ ...

  6. 认识Zygote

    概述 在java中不同的虚拟机实例会为不同的应用分配不同内存,为了使Android系统尽快启动,使用了Zygote来预加载核心类库和一些加载时间长的类(超过1250ms),让Dalvik虚拟机共享代码 ...

  7. Xposed模块开发教程

    转:http://vbill.github.io/2015/02/10/xposed-1/     http://blog.csdn.net/zhangmiaoping23/article/detai ...

  8. [深入理解Android卷一全文-第四章]深入理解zygote

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的所有内容. ...

  9. Zygote原理学习

    1 zygote分析 1.1 简介 Zygote本身是一个NATIVE层的应用程序,与驱动.内核无关.前面已经介绍过了,zygote由init进程根据init.rc配置文件创建.其实本质上来说,zyg ...

随机推荐

  1. IDEA中部署servlet

    配置和不是servlet 第一种方法:(两种方法不能混用,使用第一种方法后,尽量删除第二种方法的注解方式) 使用xml文件配置: name没有什么特别的,就是需要统一即可.url-pattern中的地 ...

  2. MySQL时间戳unix_timestamp

    函数:FROM_UNIXTIME作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示.语法:FROM_UNIXTIME(unix_timestamp, ...

  3. 鸿蒙开源第三方件组件——轮播组件Banner

    目录: 1.功能展示 2.Sample解析 3.Library解析 4.<鸿蒙开源第三方组件>系列文章合集 前言 基于安卓平台的轮播组件Banner(https://github.com/ ...

  4. GNS3通过“云”连接到虚拟机实验

    GNS3通过"云"连接到虚拟机实验并使用wireshark工具对数据分析 观看本文之前注意!!!!! 做这次实验,我所遇到的问题,会全部写在文章结尾,如果读者们遇到问题,可查看. ...

  5. 手把手教你Spring Boot2.x整合Elasticsearch(ES)

    文末会附上完整的代码包供大家下载参考,码字不易,如果对你有帮助请给个点赞和关注,谢谢! 如果只是想看java对于Elasticsearch的操作可以直接看第四大点 一.docker部署Elastics ...

  6. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】

    一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...

  7. Nodejs学习笔记(4) 文件操作 fs 及 express 上传

    目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...

  8. Python读写配置文件模块--Configobj

    一.介绍 我们在项目的开发过程中应该会遇到这样的问题:我们的项目读取某个配置文件,然后才能按照配置的信息正常运行服务,当我们需要对修改服务的某些信息时,可以直接修改这个配置文件,重启服务即可,不用再去 ...

  9. Go语言中使用K8s API及一些常用API整理

    Go Client 在进入代码之前,理解k8s的go client项目是对我们又帮助的.它是k8s client中最古老的一个,因此具有很多特性. Client-go 没有使用Swagger生成器,就 ...

  10. net core 中间件和管道

    1.中间件 是处理请求和响应的组件(代码段,一段处理逻辑),这个处理逻辑是以"前一个请求处理逻辑"为输入,并经过中间件自己的处理后,返回一个"新的请求处理逻辑" ...