Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190528
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-18 12:09
个人简介

be a happy lazy and fat cat

文章分类
文章存档

2017年(1)

2016年(5)

2015年(22)

2014年(19)

我的朋友

分类: Android平台

2015-02-05 16:53:39

android系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。
当ActivityManagerService启动一个应用程序的时候,就会通过Socket与Zygote进程进行通信,请求它fork一个子进程出来作为这个即将要启动的应用程序的进程
我们知道,Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者 间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core /rootdir/init.rc文件中,我们可以看到启动Zygote进程的脚本命令

点击(此处)折叠或打开

  1. service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
  2.         socket zygote stream 666
  3.         onrestart write /sys/android_power/request_state wake
  4.         onrestart write /sys/power/state on
  5.         onrestart restart media
  6.         onrestart restart netd
  前面的关键字service告诉init进程创建一个名为"zygote"的进程,这个zygote进程要执行的程序是/system/bin/app_process,后面是要传给app_process的参数
 接下来的socket关键字表示这个zygote进程需要一个名称为"zygote"的socket资源,这样,系统启动后,我们就可以在/dev /socket目录下看到有一个名为zygote的文件。这里定义的socket的类型为unix domain socket,它是用来作本地进程间通信用的
我们知道Zygote进程要执行的程序便是system/bin/app_process了,它的源代码位于frameworks/base/cmds/app_process/app_main.cpp文件中,入口函数是main。
查看了make文件可以看到
LOCAL_MODULE:= app_process
LOCAL_MULTILIB := both
LOCAL_MODULE_STEM_32 := app_process32
LOCAL_MODULE_STEM_64 := app_process64
include $(BUILD_EXECUTABLE)

# Create a symlink from app_process to app_process32 or 64
# depending on the target configuration.                                                                                                                                                                     
include  $(BUILD_SYSTEM)/executable_prefer_symlink.mk

app_process在编译的时候会根据情况生成一个软连接指向32或64 app_process
阅读(1859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~