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

Zygote的fork进程篇
课程答疑和新课信息:QQ交流群:422901085进行课程讨论
FrameWork入门课视频链接:https://edu.csdn.net/course/detail/30298
FrameWork实战课1视频链接:https://edu.csdn.net/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怎么一步步的创建出新的进程

千里马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命令的程序
课程简介本课程是为希望从 Android 应用开发转向 Framework 开发,并进一步提升技能的程序员设计的进阶。在本课程中,我们将聚焦于 Android 系统中的开机向导功能,深入探讨其源码和实现方式,帮助学员全面掌握 Framework 开发的核心内容。通过实际项目的驱动,本课程将带领学员从开发 Android 系统应用的角度切入,详细讲解开机向导的实现过程,以及如何在 Framework 层面进行定制和优化。OOBE课程目标深入了解和掌握 Android 开机向导:通过详细的源码解析和实际开发,学员将深入理解开机向导的各个组成部分及其实现原理。掌握系统应用的开发和定制:以开机向导为例,课程将教授如何开发和定制系统级应用,确保学员能够胜任真实的工作环境。提升 Framework 开发的核心能力:通过实际项目的驱动和功能点的实现,系统地提升学员在 Framework 开发中的实战能力。实现系统应用的个性化开发:通过学习和实践,学员不仅可以掌握开机向导的开发,还能定制化自己的系统应用,打造个性化的 Android 操作系统。课程特色项目导向:课程内容紧密结合实际项目,以开机向导为核心,确保学员能够学以致用。源码解析:深入剖析开机向导的源码,帮助学员理解其底层实现原理和逻辑。功能驱动:通过实现具体的功能点,让学习过程更加有趣和富有挑战性,增强学员的实战能力。个性化定制:最终目标是让学员能够自定义和优化 Android 操作系统中的开机向导,具备实际开发和调试能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值