网站首页 > 技术教程 正文
在看过《Android情景源代码》的Zygote启动章节后,作如下简要总结。Zygote进程在init进程启动过程中被以service服务的形式启动:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
第一行表示zygote进程是以服务的形式启动的,其对应的可执行程序是/system/bin/app_process,后面四个参数是它的启动参数。第二名表示在Zygote启动过程中,要在其内部创建一个名为zygote的socket,它在Linux下的权限是666,即所有用户多可以对它进行读写。
因为Zygote是以service的形式启动,所以在init启动过程中,android-5.1.0_r3\android5.1\system\core\init\init.c的service_start函数会被调用。
service_start函数的主要工作是:
- 通过fork方法创建一个新的子线程,即Zygote线程
- 调用create_socket函数创建启动脚本中的zygote socket,并保存该socket的int型的文件描述符。创建时,还会为此socket创建一个类型为AF_UNIX的Socket地址,并调用bind方法将socket与此地址进行绑定。该socket还有一个对应的设备文件,/dev/socket/zygote。
- 创建完socket后,会调用publish_socket函数将该socket发布到系统中。采用环境变量的方式,ANDROID_SOCKET_zygote -- socket的文件描述符。
- 调用execve(svc->args[0]),执行app_process的主程序app_main.cpp。此时,代码进入到native层。
app_main.cpp的main函数的主要工作是:
- 通过调用AppRuntime::start函数,通过JNI的方式,进一步启动Zygote:AppRuntime.start("com.android.internal.os.ZygoteInit", args);args是参数列表,其中较重要的是标记是否要启动System进程、记录socket名称。
ZygoteInit的main函数的主要工作是:
- 调用registerZygoteSocket("zygote")函数获取到zygote socket文件描述,并根据此描述符创建一个本地服务Socket:LocalServerSocket。这个服务Socket是用来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程的。
- 调用startSystemServer函数启动System进程,以便它可以将系统的关键服务启动起来。该方法中通过forkSystemServer函数创建System进程,最后调用handleSystemServerProcess进一步启动System进程("com.android.server.SystemServer",通过反射技术),"--runtime-init"表示需要提供Binder服务。
- 调用runSelectLoop来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程。
猜你喜欢
- 2025-06-12 嵌入式Linux开发教程:Linux Shell
- 2025-06-12 Linux基础知识(Linux基础知识怎么背)
- 2025-06-12 Linux系统编程之进程基础知识(linux进程控制编程)
- 2025-06-12 Skynet服务器框架——C源码剖析启动流程
- 2025-06-12 Linux源码学习笔记 day1 开机时如何加载系统?
- 2025-06-12 linux实战之:开机进入紧急模式(linux 紧急模式)
- 2025-06-12 如何制作Linux启动盘并安装Linux系统到实体机
- 2025-06-12 计算机是如何启动的(计算机是怎样启动的)
- 2025-06-12 XV6操作系统入门系列-02-详解启动过程
- 2025-06-12 开发板测试手册——系统启动、文件传送操作步骤详解(1)
你 发表评论:
欢迎- 06-12硬盘基本知识、顺序及随机读取(硬盘顺序读写和随机读写的区别)
- 06-12深度学习模型大小与模型推理速度的探讨
- 06-12读取速度破400,这个U盘真的有点快
- 06-1270元OEC玩转NAS家庭影音下载共享保姆教程
- 06-12路由器新手入门——OpenWRT基础设置篇
- 06-12github加速利器,彻底解决github打不开
- 06-12Linux SSH实用技巧几则(linux ssh命令详解)
- 06-12一款用于DNS测速和DNS污染检测的开源工具
- 0℃未命名
- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)