Android Framework实战视频--Zygote的fork进程篇

Android面试进阶指南:从基础到Framework的全面拆解 在Android开发岗位的面试中,仅仅掌握API调用已经远远不够,面试官更关注对底层原理和工程化实践的理解。从Java/Kotlin集合、并发、协程等基础概念出发,逐步深入到Handler、Binder、AMS等Android Framework核心机制,这是区分初级与高级开发者的分水岭。同时,性能优化中的内存泄漏、卡顿排查、包体积缩减等实战经验,以及R8混淆规则、AGP版本兼容性(如Hedgehog与AGP 8.x的对应关系)等工具链细节,正在成为面试中的高频考点。本文从面试官视角拆解了Android面试 阅读详情
AI摘要

本文详细介绍了Android系统中Zygote如何通过fork系统调用来创建新进程,从Java代码到C++ Native层的实现,揭示了Zygote启动SystemServer进程的关键步骤,展示了Linux fork进程的工作原理在Android Framework中的应用。

Zygote的fork进程篇
课程答疑和新课信息:QQ交流群:422901085进行课程讨论
FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298
FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275
专题博客系列:
Android 8.1 zygote 启动过程源码
Android Framework实战视频–Zygote的fork进程篇
Android Framework实战视频–SystemServer启动篇
Android Framework实战视频–SystemServer启动FallbackHome篇
Android Framework实战视频–FallbackHome进程启动及Activity启动篇
Android Framework实战视频–FallbackHome结束启动Launcher篇

1、实战体验linux的fork

直接上代码体验fork桌面创建新的子进程
//fork.c

#include <unistd.h>
#include <stdio.h>
 
int main(void)
{
    int pid;
    int count2=0;
    printf("main current process pid == %d \n",getpid());
    pid=fork();
    if (pid == 0) {//子进程,其中getpid()代表获取当前进程号,getppid()表示获取当前父进程号
    	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;
}

因为属于linux的代码,只需要在ubuntu上运行既可以:
gcc fork.c -o fork
然后执行:./fork
输出如下:

main current process pid == 5319 
this  process current pid == 5319 pid = 5320  ppid == 5308 
child process pid == 5320 ppid == 5319 

可以看出调用fork以前只有一个进程 pid = 5319
但是在fork执行后:多了一个进程号 5320
就会有2个进程的打印,即代码中的if和else都执行了,因为fork执行后就有两个进程分别执行了。
其中fork的返回值如果为:0说明当前就是子进程执行,为子进程的pid就说明是原来的父进程

2、Zygote fork进程的源码分析

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java中main方法里面的如下代码

 if (startSystemServer) {
                Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

                // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
                // child (system_server) process.
                if (r != null) {
                    r.run();
                    return;
                }
            }

核心就是forkSystemServer方法

 private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {
      //省略。。

        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
           //省略。。
            /* Request to fork the system server process */
            //核心方法
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

分析发现主要调用:

Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);

这个从名字看相对也贴近刚开始学的fork了。继续看Zygote.forkSystemServer

public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
        int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
    //省略
    int pid = nativeForkSystemServer(
            uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
   //省略
    return pid;
}

这里调用的又是nativeForkSystemServer,nativeForkSystemServer属于jni调用:
代码路径:
frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

static jint com_android_internal_os_Zygote_nativeForkSystemServer(
        JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
        jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,
        jlong effectiveCapabilities) {
  pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
                                      debug_flags, rlimits,
                                      permittedCapabilities, effectiveCapabilities,
                                      MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
                                      NULL, NULL, NULL);
 //省略
  return pid;
}

调用到了ForkAndSpecializeCommon方法:

// Utility routine to fork zygote and specialize the child process.
static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
                                     jint debug_flags, jobjectArray javaRlimits,
                                     jlong permittedCapabilities, jlong effectiveCapabilities,
                                     jint mount_external,
                                     jstring java_se_info, jstring java_se_name,
                                     bool is_system_server, jintArray fdsToClose,
                                     jintArray fdsToIgnore,
                                     jstring instructionSet, jstring dataDir) {
 //省略

  pid_t pid = fork();

  if (pid == 0) {
   //省略
  } else if (pid > 0) {
  //省略
  }
  return pid;
}

ForkAndSpecializeCommon方法本身非常长,但是看到这里有一个 pid_t pid = fork();
大家心里有没有非常非常激动啊
这里就是真正创建子进程的地方,和刚开始一样讲解实战的fork程序是不是一样啊
好了,那到这里相信大家已经清楚了zygote怎么一步步的创建出新的进程

LightTools宏 vs Python API:光学仿真自动化方案选型指南 本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。 阅读详情

相关推荐

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 744

Android Framework实战开发篇

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。学完本课程能让你学会如下知识点:-学习对BootAnimation的启动源码分析-学习对BootAnimation的opengl绘制源码分析-学习对BootAnimation的zip方式绘制源码分析-学习制作一个带有时间的显示的BootAnimation的动画-深入理解zip方式定制BootAnimation-学习android native层的posix线程实现-学习android native层封装的Threads类源码及使用-学习zygote的启动源码分析-学习zygote的进程创建过程源码分析-学习zygote启动systemserver过程分析-学习systemserver的启动分析-学习systemserver的HomeActivity的启动源码分析-学习systemserver与zygote进行socket通信创建进程源码分析-学习systemserver启动FallbackHome的Activtiy-学习FallbackHome结束及跳转Launcher源码分析-学习native c/c++层的堆栈打印

【硬件设计】_基于STM32单片机的智能台灯系统

智能台灯系统是一款多功能的智能照明设备,能够自动调节亮度、监测人体活动、感知环境光照,并具备定时和报警功能,极大提升了用户体验与功能的灵活性,主要包括以下功能:系统提供自动和手动两种模式以调节台灯亮度。在自动模式下,台灯会根据周围光强智能调整;而在手动模式下,用户可通过按键自行设置亮度。利用红外光电开关检测台灯与用户之间的距离,若距离过近,系统将发出报警提示。通过时钟模块设置定时提醒,并在OLED显示屏上显示当前时间,当达到设定的定时时间时,蜂鸣器将发出报警音。

2401_85381181的博客 1731

Android Framework实战视频--SystemServer启动篇

SystemServer启动篇 上一讲已经讲了systemserver进程被fork出来了 代码在ZygoteInit的main方法中的: Runnable r = forkSystemServer(abiList, socketName, zygoteServer); 进入forkSystemServer方法后已经分析到: pid = Zygote.forkSystemServer 即在Zygote中又调用了forkSystemServer方法一直到native层才调用了真正的linux的 fo

learnframework的博客 3040

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

别再被无限debugger卡住了!Chrome DevTools实战绕过技巧(含Hook与文件替换)

本文详细介绍了如何通过Chrome DevTools绕过无限debugger封锁的实战技巧,包括Hook技术与文件替换方法。针对常见的定时器轰炸、循环陷阱和动态注入等反调试手段,提供了高效的解决方案,帮助开发者快速突破调试障碍,提升爬虫和逆向工程效率。

weixin_30326515的博客 241

Android Framework实战视频--系统SystemServer启动篇

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频–SystemServer启动

liaosongmao1的专栏 250

从叶片之舞到数据之眼:净空雷达如何重塑风电安全与效率的边界

净空雷达通过激光或毫米波技术实现风机叶片与塔筒间距离的毫米级实时监测,极大提升了风电场在极端天气下的安全性与运营效率。这项技术不仅预防扫塔事故,还通过数据可视化与智能分析赋能叶片健康管理和发电优化,成为风电数字化运维的核心基础设施。

xk7n92h3p5m的博客 1161

Android Framework实战视频--Zygote的启动

Android 8.1 zygote 启动过程源码 1、Zygote 简单介绍 在Android系统中,普通应用程序进程以及运行系统的服务system_server 进程都是由Zygote进程来fork的。也叫做孵化器。它通过linux中的fork形式创建应用程序进程和system_server 。由于zygote进程在启动的时候会创建java虚拟机环境,因此通过fork而创建的应用程序进程或者system_server进程可以在内部获得java虚拟机环境,不需要单独为每一个进程创建java虚拟机环境。 2

learnframework的博客 4593

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 280

使用Simulink对固定翼无人机的自动起飞与降落进行仿真

本文介绍了基于Simulink的固定翼无人机自动起飞与降落控制系统设计方法。系统包含飞行器动力学模型、控制系统、环境模拟等模块,通过简化动力学方程描述无人机运动特性。详细说明了从创建模型、设置动力学方程、设计PID控制器(包括自动起飞和降落控制策略)到添加环境模拟的完整仿真流程。重点阐述了升降舵和发动机推力的控制律设计,以及性能评估要点。本方法可有效验证控制系统设计,优化飞行稳定性和安全性参数,为无人机自主控制提供仿真支持。

amy_mhd的博客 223

android framework实战-跨进程通信binder专题

千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binder无Android,binde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序

华为MetaERP月结加速方案:并行关账技术深度解析

【摘要】华为MetaERP并行关账技术通过创新架构设计,将传统串行月结流程(8-12小时)优化为并行执行(2-4小时)。关键技术包括:1)基于DAG引擎的任务依赖分析,实现模块/子任务三级并行;2)Saga模式分布式事务保障数据一致性;3)动态资源分配算法提升CPU利用率至60-80%。实施效果显示月结时间缩短70%,成功率提升至99.8%,错误恢复时间减少75%。该方案为大型企业ERP系统提供了高效的月结加速方案,未来还将结合AI调度与混合云扩展持续优化。

金牌架构师 1441

Framework学习高级视频--android系统init到Zygote的fork进程篇

Zygote的fork进程篇 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频

liaosongmao1的专栏 202

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android Framework实战视频系列

hi,广大android爱好者们好: 自从去年业余时间发布了Android Framework实战开发入门篇的视频后,大家一直期待的千里马进行新的视频更新,哈哈,首先在这里和大家说一下抱歉哈,因为本人不是专业的讲师培训机构,是一个地道的实战Android 程序员,经验比较丰富些,在学习framework的路上走了很多的弯路,所以才打算出个视频让大家学习framework更加轻松,助力大家更加方便学习framework,不过我这里同时也告诉大家一个好消息,那就是,我们新的一期实战视频马上要与大家见面了。 大家

learnframework的博客 1858

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android Framework实战视频--系统init到init.rc的Zygote的启动

Android 8.1 zygote 启动过程源码 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Fr

liaosongmao1的专栏 402

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android系统 Framework源码分析实战学习视频系列

hi,广大android爱好者们好: 自从去年业余时间发布了Android Framework实战开发入门篇的视频后,大家一直期待的千里马进行新的视频更新,哈哈,首先在这里和大家说一下抱歉哈,因为本人不是专业的讲师培训机构,是一个地道的实战Android 程序员,经验比较丰富些,在学习framework的路上走了很多的弯路,所以才打算出个视频让大家学习framework更加轻松,助力大家更加方便学习framework,不过我这里同时也告诉大家一个好消息,那就是,我们新的一期实战视频马上要与大家见面了。 大家

liaosongmao1的专栏 306

Android Framework学习笔记(六)应用程序进程启动过程

private static ProcessStartResult zygoteSendArgsAndGetResult(ZygoteState zygoteState, ArrayList args) throws ZygoteStartFailedEx { try { // Throw early if any of the arguments are malformed. This means we can // avoid writing a partial response to the zygo

m0_61362539的博客 505

Android高级Framework系统面试专题系列-认清楚自己的层次

Android高级系统面试之道系列-1 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android F

learnframework的博客 696

Android Framework学习教程-BootAnimation开机动画启动流程源码分析

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Framework实战视频–SystemServer启动

learnframework的博客 1707

揭秘安卓系统架构:从内核到应用全解析

Android操作系统是基于Linux内核的开源移动操作系统,采用分层架构设计。其核心组件包括:Linux内核负责硬件资源管理;硬件抽象层(HAL)统一硬件接口;原生库提供核心功能支持;Android运行时(ART)执行应用代码;应用框架层为开发者提供API;系统应用和用户应用分别提供基础功能和扩展服务。这种层次化设计实现了软硬件解耦,确保了系统的稳定性和可扩展性。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 2590

精通Android面试-腾讯阿里Android高级开发面试官选拔标准

腾讯阿里Android高级开发面试官选拔标准 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android Frame

learnframework的博客 532

android Framework知识点简记

四、mediaserver启动的时候注册binder服务流程 进程启动进入Main_mediaserver.cpp的main函数。 初始化ProcessState,初始化的时候进行了以下操作: (1) 打开binder驱动,调用的是驱动层的 binder_open函数,并拿到文件描述符fd。 (2) 设置驱动层最大的线程数15,调用的是驱动层的 binder_ioctl 函数。 (3) 调用mmap函数映射一块内存,驱动层调用的是binder_mmap函数,传入参数是fd和 1M-8k的内存大小 跨进程

u010695063的专栏 182

千里马Android Framework实战课程-应用程序app的Binder启动篇

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。 Android Framework实战视频–SystemServer启动篇 进程通过zygote进行fork后调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调

liaosongmao1的专栏 157

【Android面试】打包 & 启动专题

Android 打包&启动专题

studyForMokey的博客 508

Android高级Framework系统面试专题系列/层次定位/一线大厂腾讯阿里华为oppo面试经验

Android高级系统面试之道系列-1 课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 专题博客系列: Android 8.1 zygote 启动过程源码 Android Framework实战视频–Zygote的fork进程篇 Android F

liaosongmao1的专栏 196
上一篇: Android Framework实战视频--Zygote的启动
下一篇: Android Framework实战视频--SystemServer启动篇
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值