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系统源代码情景分析
xposed结合Zygote分析的更多相关文章
- xposed学习四:总结
xposed的学习要告一段落,接下来去学习android apk和so加固,这里我们回顾下xposed吧. xposed是个hook框架,它是基于dalvik(确切来说是目前的版本,作者说ART也快出 ...
- Xposed学习三:基石
在上一篇我们留下问题:handleLoadPackage如何生效即在何时被执行. 先看XposedBridge.class的main(该函数是在appruntime.start函数中替换原先zygot ...
- Xposed原理分析
目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...
- 阿里系产品Xposed Hook检测机制原理分析
阿里系产品Xposed Hook检测机制原理分析 导语: 在逆向分析android App过程中,我们时常用的用的Java层hook框架就是Xposed Hook框架了.一些应用程序厂商为了保护自家a ...
- Android系统启动分析(Init->Zygote->SystemServer->Home activity)
整个Android系统的启动分为Linux Kernel的启动和Android系统的启动.Linux Kernel启动起来后,然后运行第一个用户程序,在Android中就是init程序. ------ ...
- 认识Zygote
概述 在java中不同的虚拟机实例会为不同的应用分配不同内存,为了使Android系统尽快启动,使用了Zygote来预加载核心类库和一些加载时间长的类(超过1250ms),让Dalvik虚拟机共享代码 ...
- Xposed模块开发教程
转:http://vbill.github.io/2015/02/10/xposed-1/ http://blog.csdn.net/zhangmiaoping23/article/detai ...
- [深入理解Android卷一全文-第四章]深入理解zygote
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的所有内容. ...
- Zygote原理学习
1 zygote分析 1.1 简介 Zygote本身是一个NATIVE层的应用程序,与驱动.内核无关.前面已经介绍过了,zygote由init进程根据init.rc配置文件创建.其实本质上来说,zyg ...
随机推荐
- Vue入门干货,以及遇到的坑
一.安装环境及Vue脚手架搭建 参考文档:https://www.jianshu.com/p/1626b8643676 二.开发文档 官方文档:https://cn.vuejs.org/v2/guid ...
- Codeforces Round #684 (Div. 2)
A 讨论三种情况,不换/全换成0/全换成1 ,取一个花费最小值 #include <bits/stdc++.h> using namespace std; const int N = 10 ...
- FreeBSD 12.2 已经发布 从现有版本更新到12
#freebsd-update -r 12.2-RELEASE upgrade 如果提示更新第三方软件后,再执行freebsd-update install , 请输入 #pkg update &am ...
- WPF 基础 - Trigger
1. Trigger 1.1 由属性值触发的 Trigger 最基本的触发器,Property 是关注的属性名称,value 是触发条件,一旦触发条件满足,就会应用 Trigger 的 Setters ...
- Java视频教程免费分享(网盘直接取)
Java基础 Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java刘意:链接:https://pan.baidu.com/s/1kVZQCqr ...
- 部署Angular应用到Github pages
https://jeneser.github.io/blog/2017/08/08/angular-deploying-app-github-pages/ Published: August 08, ...
- python常见的错误异常
1.AssertionError 该异常在assert()语句运行失败时输出 2.AttributeError 该异常在参考或设置属性失败时输出 eg:class Gs: pass g = Gs() ...
- HashMap源码个人解读
HashMap的源码比较复杂,最近也是结合视频以及其余大佬的博客,想着记录一下自己的理解或者当作笔记 JDK1.8后,HashMap底层是数组+链表+红黑树.在这之前都是数组+链表,而改变的原因也就是 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
- ClickHouse源码笔记5:聚合函数的源码再梳理
笔者在源码笔记1之中分析过ClickHouse的聚合函数的实现,但是对于各个接口函数的实际如何共同工作的源码,回头看并没有那么明晰,主要原因是没有结合Aggregator的类来一起分析聚合函数的是如果 ...