1.先说一下android中的服务,一种是系统服务,系统服务通过getSystemService方法获得,所有的系统服务运行在一个进程中.

2.还有一种是自定义Service,也就是通过startService启动. 这种服务是单独一个进程.

Zygote实际上是一个进程繁殖器,通过socket的select模型进行繁殖.类似命令的方式来进行Fork.

下面绘制了其流程图.

可以看到:

启动完ServiceManager后,启动Zygote和SystemServer进程。

1.Zygote服务实际上是一种Select服务模型.

2.为了启动java代码,进行了一次androidRuntime的打开和关闭.

3.启动的SystemServer进程,此进程启动了一个线程注册了很多服务之后,开启了手机的HOME(也就是桌面),然后开始服务循环.(注意:此服务是Binder服务,Binder服务一启动就是俩线程。可能是因为是两个CPU吧。

代码如下:

4.Zygote进入select循环系统,开始服务.

5.此服务是很简单的,而且是通用的服务代码。(也就是取数据,传输数据,与SOCKET有些类似)。上层必须基于此服务原型来写相应的代码。

ProcessState::self()->startThreadPool();//启动一个。
IPCThreadState::self()->joinThreadPool();//把此线程也加入。
    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
// want to run in that state in this process.  The driver set our
// priority already (though not our scheduling class), so bounce
// it back to the default before invoking the transaction.
setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL);
}
} else {
if (curPrio >= ANDROID_PRIORITY_BACKGROUND) {
// We want to use the inherited priority from the caller.
// Ensure this thread is in the background scheduling class,
// since the driver won't modify scheduling classes for us.
// The scheduling group is reset to default by the caller
// once this method returns after the transaction is complete.
androidSetThreadSchedulingGroup(mMyThreadId,
ANDROID_TGROUP_BG_NONINTERACT);
}
}
//LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
Parcel reply;
IF_LOG_TRANSACTIONS() {
TextOutput::Bundle _b(alog);
alog << "BR_TRANSACTION thr " << (void*)pthread_self()
<< " / obj " << tr.target.ptr << " / code "
<< TypeCode(tr.code) << ": " << indent << buffer
<< dedent << endl
<< "Data addr = "
<< reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer)
<< ", offsets addr="
<< reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl;
}
if (tr.target.ptr) {
sp<BBinder> b((BBinder*)tr.cookie);
const status_t error = b->transact(tr.code, buffer, &reply, 0);
if (error < NO_ERROR) reply.setError(error);
} else {
const status_t error = the_context_object->transact(tr.code, buffer, &reply, 0);
if (error < NO_ERROR) reply.setError(error);
}
//LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
//     mCallingPid, origPid, origUid);
if ((tr.flags & TF_ONE_WAY) == 0) {
LOG_ONEWAY("Sending reply to %d!", mCallingPid);
sendReply(reply, 0);
} else {
LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
}
mCallingPid = origPid;
mCallingUid = origUid;
IF_LOG_TRANSACTIONS() {
TextOutput::Bundle _b(alog);
alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj "
<< tr.target.ptr << ": " << indent << reply << dedent << endl;
}
}
break;

  • 大小: 21.6 KB
  • 查看图片附件

android核心机制之Zygote启动流程相关推荐

  1. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  2. Android系统开机到Launcher启动流程分析

    本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...

  3. Android 深入研究之 ✨ Activity启动流程+Activity生命周期✨

    Activity分析目录 前言 Activity生命周期 1.activity的四个状态 2.activity的生命周期 3.activity优先级 Activity启动流程 Activity的启动流 ...

  4. 深入分析Android 9.0源代码——Activity启动流程

    引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context) Activity Instr ...

  5. 深入分析Android 9.0源代码——Service启动流程(startService方式)

    引言 点击此处查看<深入分析Android 9.0源代码>系列的组织结构和相关说明. 1 应用进程发起启动请求 本章的调用流程如下图所示: (Context)ContextWrapperC ...

  6. Zygote启动流程解析

    目录 1.什么是Zygote? 2. Zygote脚本启动 3.Zygote进程启动 1.什么是Zygote? Zygote是Android系统创建的第一个Java进程,它是所有Java进程的父进程. ...

  7. Zygote启动流程及源码分析

    1 Zygote是什么 在Android中,负责孵化新进程的这个进程叫做Zygote,安卓上其他的应用进程都是由zygote孵化的.众所周知,安卓是Linux内核,安卓系统上运行的一切程序都是放在Da ...

  8. zygote启动流程

    //通过cmd命令,来fork新进程执行类中的main()方法: app_process [可选参数] 命令所在路径 启动的类名 [可选参数] init.zygote32.rc(system/core ...

  9. android源码学习- APP启动流程(android12源码)

    前言: 百度一搜能找到很多讲APP启动流程的,但是往往要么就是太老旧(还是基于android6去分析的),要么就是不全(往往只讲了整个流程的一小部分).所以我结合网上现有的文章,以及源码的阅读和调试, ...

最新文章

  1. Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值
  2. nrf52840 gpiote如何配置中断输入_STM32第四章外部中断管理
  3. mysql 命令 不对齐,MySQL中自己不太常用的命令
  4. spring bean的初始化和销毁
  5. 十六、字符串和数组之间的转换
  6. 江苏技术师范学院大学机房管理系统[.NET项目]
  7. zookeeper 四字命令的使用
  8. 编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上。
  9. 七牛底层架构再完善 让服务从单一走向多元
  10. fpga开发教程 labview_NILabVIEW高性能FPGA开发者指南.pdf
  11. 在vue中安装axios库
  12. c++语言 幂指数,C / C++幂函数,计算给定数字的幂
  13. 申请苹果公司版开发者账号实录【99美元,非299美元企业版账号】
  14. 高速接口之VGA接口
  15. 高斯分布数学性质及推导(一):如何证明高斯分布的积分为1
  16. Python百行代码轻松爬取了妹子网100G的套图,希望你网盘内存够用
  17. 互联网里的东邪、西毒、南帝、北丐
  18. Android系统适配蓝牙遥控器键值
  19. php中文字符串转英文,php 字符串转数组 提取中文 提取英文 字符串类型
  20. Python爬取网页的所有内外链

热门文章

  1. python request timeout是什么意思_request timeout是什么意思
  2. python中tolist_python - 无法使用Gremlinpython使用“ .toList()”列出Janusgraph中存在的所有顶点 - 堆栈内存溢出...
  3. SQL学习教程:基础教程高级教程
  4. python 自定义模块_Python 自定义模块路径
  5. 2、计算机图形学——3D变换
  6. C++知识点杂记2——类成员指针、嵌套类和union
  7. 生成,保存和转换pcd点云文件
  8. 知乎快捷取消我关注的问题chrome插件
  9. 不少朋友在安装IDES 4.71的过程中都遇到了下面的出错提示:
  10. android 生成签名命令