Android framework的Zygote源码分析

文章目录

  • Android framework的Zygote源码分析
    • linux的fork

Android framework的Zygote源码分析

init.rc

在Android系统中,zygote是一个native进程,是Android系统上所有应用进程的父进程,我们系统上app的进程都是由这个zygote分裂出来的。zygote则是由Linux系统用户空间的第一个进程——init进程,通过fork的方式创建的。

zygote进程做了两个重要的事情:

1. 不断接收其它进程的信号,随时创建子进程(即app进程)

2. 创建了嫡长子 —— system_server进程

路径 system/core/rootdir/init.zygote32.rc,32位进程,64位进程,

在这里插入图片描述

在这里插入图片描述

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

service 标记这是一个服务,

zygote 服务名字

/system/bin/app_process -Xzygote 从哪启动app_process 是一个二进制文件,

–zygote --start-system-server 是参数,入参

大概意思是app_process 运行这个二进制文件,然后会携带后面的参数。

这是个二进制文件,Android中生成二进制文件一般是Android.mk或者Android.bp

找一下

grep “app_process” ./ -rn

在这里插入图片描述

在这里插入图片描述

这个二进制文件运行起来就会执行main方法并且传递携带的参数

在这里插入图片描述

argc–;
argv++;

参数数量

遍历参数, zygote = true;startSystemServer = true;都设置为true

while (i < argc) {const char* arg = argv[i++];if (strcmp(arg, "--zygote") == 0) {zygote = true;niceName = ZYGOTE_NICE_NAME;} else if (strcmp(arg, "--start-system-server") == 0) {startSystemServer = true;} else if (strcmp(arg, "--application") == 0) {application = true;} else if (strncmp(arg, "--nice-name=", 12) == 0) {niceName.setTo(arg + 12);} else if (strncmp(arg, "--", 2) != 0) {className.setTo(arg);break;} else {--i;break;}}

这里开启start

AndroidRuntime.cpp的路径为/frameworks/base/core/jni/AndroidRuntime.cpp

在这里插入图片描述

启动一个java虚拟机

在这里插入图片描述

/** Register android functions.*/if (startReg(env) < 0) {ALOGE("Unable to register all android natives\n");return;}

注册jni方法

在这里插入图片描述

开启VM

在这里插入图片描述

char* AndroidRuntime::toSlashClassName(const char* className)
{char* result = strdup(className);for (char* cp = result; *cp != '\0'; cp++) {if (*cp == '.') {*cp = '/';}}return result;
}

这个className就是我们这里传递过去的

在这里插入图片描述

获取class的main方法,如果存在就调用main方法

在这里插入图片描述

到这里就zggote就已经从C++层调用到了java层的。

/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

预加载

在这里插入图片描述

加载系统的类,类来自哪里呢?

在这里插入图片描述

文件路径

在这里插入图片描述

在这里插入图片描述

find -name preloaded-classes

在这里插入图片描述

在这里插入图片描述

都是Android里面核心的一些类。被zygote进行预加载了,

注册了SocketServer,对系统的资源进行预加载。

linux的fork

#include <unistd.h>
#include <stdio.h>int main(void)
{int pid;//获取进程号。printf("main current process pid == %d \n",getpid());//系统调用函数fork()pid=fork();//如果fork成功了,就会有2个进程,主进程和子进程pid都是不一样的//如果是0就运行在子进程,pid>0就是主进程。if (pid == 0) {printf("child process pid == %d ppid == %d \n",getpid(),getppid());} else {printf("this  process current pid == %d pid = %d  ppid == %d \n",getpid(),pid,getppid());}while(1); return 0;
}

在这里插入图片描述

编译执行,主进程号是5021,fork之后有个pid5022,意思就是有2个进程执行这段代码。

在这里插入图片描述

创建systemServer

在这里插入图片描述

在这里插入图片描述

Zygote.java

在这里插入图片描述

jni方法

在这里插入图片描述

fork子进程,pid=0是子进程,

在这里插入图片描述

我们发现主进程就输出了一句日志,什么都没有,

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Processing java 动态海报 地球日

【Processing java 动态海报 地球日】

12、云服务器上搭建环境

云服务器上搭建环境 12.1 选择一款远程连接工具(mobax) 有很多,比如mobax、xshll等等,我这里选择mobax,下载个免费版的即可 安装完成后,双击打开: 第一步,创建远程连接的用户,用户默认为root,密码为远程服务器的密码 第二步,输入远程公网IP,选择刚刚创建的用…

[C][数据结构][排序][下][快速排序][归并排序]详细讲解

文章目录 1.快速排序1.基本思想2.hoare版本3.挖坑法4.前后指针版本5.非递归版本改写 2.归并排序 1.快速排序 1.基本思想 任取待排序元素序列的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右…

技术选型考察哪些方面

在进行技术选型时&#xff0c;需要考虑多个方面&#xff0c;确保所选择的技术能够满足项目的需求&#xff0c;并且在实施过程中具备可行性和可维护性。以下是一些主要考察方面&#xff1a; 1. 业务需求匹配 功能需求&#xff1a;技术能否满足当前及未来的功能需求。性能需求&…

Leetcode.2862 完全子集的最大元素和

题目链接 Leetcode.2862 完全子集的最大元素和 rating : 2292 题目描述 给你一个下标从 1 1 1 开始、由 n n n 个整数组成的数组。你需要从 n u m s nums nums 选择一个 完全集&#xff0c;其中每对元素下标的乘积都是一个 完全平方数&#xff0c;例如选择 a i a_i ai​ 和…

目标检测中的anchor机制

目录 一、目标检测中的anchor机制 1.什么是anchor boxes&#xff1f; 二、什么是Anchor&#xff1f; ​编辑三、为什么需要anchor boxes&#xff1f; 四、anchor boxes是怎么生成的&#xff1f; 五、高宽比&#xff08;aspect ratio&#xff09;的确定 六、尺度(scale)的…

工业高温烤箱:现代工业的重要设备

工业高温烤箱&#xff0c;作为现代工业生产中不可或缺的关键设备&#xff0c;以其独特的高温烘烤能力&#xff0c;为各种工业产品的加工与制造提供了强有力的支持。斯博欣将对工业高温烤箱的原理、特点、应用领域及未来发展进行简要介绍。 一、工业高温烤箱的特点 1、高温性能优…

怎么修改Visual Studio Code中现在github账号

git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin

编程后端:深入探索其所属的行业领域

编程后端&#xff1a;深入探索其所属的行业领域 在数字化浪潮席卷全球的今天&#xff0c;编程后端作为技术领域的重要分支&#xff0c;其所属的行业领域一直备受关注。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析编程后端所属的行业&#xff0c;并揭…

FastAPI 作为H5中流式输出的后端

FastAPI 作为H5中流式输出的后端 最近大家都在玩LLM&#xff0c;我也凑了热闹&#xff0c;简单实现了一个本地LLM应用&#xff0c;分享给大家&#xff0c;百分百可以用哦&#xff5e;^ - ^ 先介绍下我使用的三种工具&#xff1a; Ollama&#xff1a;一个免费的开源框架&…

2024年护网行动全国各地面试题汇总(1)作者:————LJS

目录 1. SQL注入原理 2. SQL注入分类&#xff1a; 3. SQL注入防御&#xff1a; 4. SQL注入判断注入点的思路&#xff1a; 5. 报错注入的函数有哪些&#xff1a; 6. SQL注入漏洞有哪些利用手法&#xff1a; 1. 文件上传漏洞的绕过方法有以下几种&#xff1a; 2. 文件上传时突破前…

centos7 xtrabackup mysql 基本测试(4)---虚拟机环境 mysql 修改datadir(有问题)

centos7 xtrabackup mysql 基本测试&#xff08;4&#xff09;—虚拟机环境 mysql 修改datadir 参考 centos更改mysql数据库目录 https://blog.csdn.net/sinat_33151213/article/details/125079593 https://blog.csdn.net/jx_ZhangZhaoxuan/article/details/129139499 创建目…

锌,能否成为下一个“铜”?

光大期货认为&#xff0c;今年以来&#xff0c;市场关注锌能否接棒铜价牛市。铜需求增长空间大&#xff0c;而锌消费结构传统&#xff0c;缺乏新亮点。虽然在供应的扰动上锌强于铜&#xff0c;但因需求乏善可陈&#xff0c;金融属性弱势&#xff0c;锌很难接棒铜&#xff0c;引…

数据质量守护者:数据治理视角下的智能数据提取策略

一、引言 在信息化和数字化高速发展的今天&#xff0c;数据已成为企业决策、运营和创新的核心要素。然而&#xff0c;随着数据量的快速增长和来源的多样化&#xff0c;数据质量问题逐渐凸显&#xff0c;成为制约企业数据价值发挥的关键因素。数据治理作为确保数据质量、提升数…

KEIL5.39 5.40 fromelf 不能生成HEX bug

使用AC6 编译,只要勾选了生成HEX。 结果报如下错误 暂时没有好的解决办法 1.替换法 2.在编译完后用命令生成HEX

蚓链研究院告诉你:蚓链数字化营销如何帮助力助你打造品牌!

在打造产品品牌的过程中&#xff0c;数字化营销会带来哪些利弊影响&#xff1f;如何消除或减少弊端&#xff1f;蚓链来和你一起分析、解决。 利处&#xff1a; 1.高度精准的目标定位&#xff1a;凭借大数据和先进算法&#xff0c;能精确锁定潜在客户&#xff0c;使营销资源得到…

k8s_探针专题

关于探针 生产环境中一定要给pod设置探针,不然pod内的应用发生异常时,K8s将不会重启pod。 需要遵循以下几个原则(本人自己总结,仅供参考): 探针尽量简单,不要消耗过多资源。因为探针较为频繁的定期执行,过于复杂和消耗资源的探针对k8s和生产环境是不利的。探针返回的结…

数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验

在这个数据如潮的时代&#xff0c;SQL 已远远超越了简单的查询语言范畴&#xff0c;它已成为数据分析和决策制定的基石&#xff0c;成为撬动企业智慧决策的关键杠杆。SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度&#xff0c;对企业洞察市场动态、优化业务流…

针对k8s集群已经加入集群的服务器进行驱逐

例如k8s 已经有很多服务器&#xff0c;现在由于服务器资源过剩&#xff0c;需要剥离一些服务器出来 查找节点名称&#xff1a; kubectl get nodes设置为不可调度&#xff1a; kubectl cordon k8s-node13恢复可调度 kubectl uncordon k8s-node13在驱逐之前先把需要剥离驱逐的节…