android核心机制之Zygote启动流程

来源:未知 责任编辑:责任编辑 发表时间:2013-11-15 19:49 点击:

Zygote实际上是一个进程繁殖器,通过socket的select模型进行繁殖.类似命令的方式来进行Fork.
下面绘制了其流程图.
 
可以看到:
 
1.Zygote服务实际上是一种Select服务模型.
2.为了启动java代码,进行了一次androidRuntime的打开和关闭.
3.启动的SystemServer进程,此进程启动了一个线程注册了很多服务之后,开启了手机的HOME(也就是桌面),然后开始服务循环.(注意:此服务是Binder服务,Binder服务一启动就是俩线程。可能是因为是两个CPU吧。
代码如下:
4.Zygote进入select循环系统,开始服务.
5.此服务是很简单的,而且是通用的服务代码。(也就是取数据,传输数据,与SOCKET有些类似)。上层必须基于此服务原型来写相应的代码。
 
Java代码 
ProcessState::self()->startThreadPool();//启动一个。 
IPCThreadState::self()->joinThreadPool();//把此线程也加入。 
 
Cpp代码 
case BR_TRANSACTION: 
    { 
        binder_transaction_data tr; 
        result = mIn.read(&tr, sizeof(tr)); 
        LOG_ASSERT(result == NO_ERROR, 
            "Not enough command data for brTRANSACTION"); 
        if (result != NO_ERROR) break; 
         
        Parcel buffer; 
        buffer.ipcSetDataReference( 
            reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 
            tr.data_size, 
            reinterpret_cast<const size_t*>(tr.data.ptr.offsets), 
            tr.offsets_size/sizeof(size_t), freeBuffer, this); 
         
        const pid_t origPid = mCallingPid; 
        const uid_t origUid = mCallingUid; 
         
        mCallingPid = tr.sender_pid; 
        mCallingUid = tr.sender_euid; 
         
        int curPrio = getpriority(PRIO_PROCESS, mMyThreadId); 
        if (gDisableBackgroundScheduling) { 
            if (curPrio > ANDROID_PRIORITY_NORMAL) { 
                // We have inherited a reduced priority from the caller, but do not 

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Android 完全退出程序
  • 原创:Android应用开发-Andorid歌词秀,含源码
  • android 屏幕保护
  • Android手机软件汉化教程---第四课 dex文件汉化
  • 众多Android 开源项目推荐,给力工作给力学习
  • Android Audio代码分析4
  • Android得到已安装的应用程序信息!
  • Android开发者指南(29) —— USB Host and Accessory
  • Android成长的幕后推手:工程师鲁宾
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1