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

Android高工必备:说说从手机开机到APP启动FrameWork层的整体执行流程 Android系统中的窗体是屏幕上的一块用于绘制各种UI元素并能够响应应用户输入的一个矩形区域,从原理上来讲,窗体的概念是独自占有一个Surface实例的显示区域,比如Dialog、Activity的界面、壁纸、状态栏以及Toast等都是窗体;从点击应用图标到Activity创建成功先看流程图://然后点击应用图标后,先检查要打卡的Activity是否存在//然后获取AMS的代理AMP–> new ActivityRecord对象,获取ActivityStack。 阅读详情
AI摘要

本文详细剖析了Android系统中Zygote进程的启动流程,从init.rc配置到app_process源码分析,再到ZygoteInit的Java代码执行,揭示了Zygote如何创建应用程序进程和system_server,并预加载资源,启动system_server进程,以及进入等待新进程创建的循环。

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 Framework实战视频–SystemServer启动篇
Android Framework实战视频–SystemServer启动FallbackHome篇
Android Framework实战视频–FallbackHome进程启动及Activity启动篇
Android Framework实战视频–FallbackHome结束启动Launcher篇

1、Zygote 简单介绍

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

2、Zygote启动脚本

init.rc是以import方式来引入各个模块的rc的,包括前面讲过的bootanimation,surfaceflinger等也是,当然zygote也一样。
路径:system/core/rootdir/init.zygote32.rc
这里有多个zygote.rc那是因为android系统支持64位系统和32位的原因
分析32位这个文件既可以
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
关键即在第一句:
根据前面分析过的bootanimation,大概得知Zygote进程名称为zygote,执行程序为app_process ,class name为main。
所以接下来去分析app_process的源码既可以。
app_process到底代码在哪里呢?一般可以通过framework目录下grep app_process既可以
grep结果如下:
./app_process/Android.mk:45:LOCAL_MODULE:= app_process

代码路径:frameworks/base/cmds/app_process/

3、 app_process中app_main.cpp源码分析

int main(int argc, char* const argv[])
{
      //省略部分
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));//进行AppRuntime的构造
    // Process command line arguments
    // ignore argv[0]
    argc--;
    argv++;
  //省略。。。
    bool zygote = false;
    bool startSystemServer = false;
    bool application = false;
    String8 niceName;
    String8 className;

    ++i;  // Skip unused "parent dir" argument.
    while (i < argc) {
        const char* arg = argv[i++];
        if (strcmp(arg, "--zygote") == 0) {
            zygote = true;//变量zygote设置
            niceName = ZYGOTE_NICE_NAME;
        } else if (strcmp(arg, "--start-system-server") == 0) {
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == 0) {
            application = true;
        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
            niceName.setTo(arg + 12);
        } else if (strncmp(arg, "--", 2) != 0) {
            className.setTo(arg);
            break;
        } else {
            --i;
            break;
        }
    }
	//省略
    Vector<String8> args;
    if (!className.isEmpty()) {
	//省略
        runtime.setClassNameAndArgs(className, argc - i, argv + i);
	//省略
    } else {//省略}

    if (!niceName.isEmpty()) {
        runtime.setArgv0(niceName.string(), true /* setProcName */);
    }

    if (zygote) {
    	//进入这里进行java类的启动
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    }

代码中关键只有2处注释:
AppRuntime的构造,源码可以看出AppRuntime继承AndroidRuntime,故只需要分析AndroidRuntime既可以:

class AppRuntime : public AndroidRuntime
{
public:
    AppRuntime(char* argBlockStart, const size_t argBlockLength)
        : AndroidRuntime(argBlockStart, argBlockLength)
        , mClass(NULL)
    {
    }

接下来属于zygote进程调用runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote);即
AndroidRuntime的start方法

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
   //省略
    /* start the virtual machine */
    JniInvocation jni_invocation;
    jni_invocation.Init(NULL);
    JNIEnv* env;
    if (startVm(&mJavaVM, &env, zygote) != 0) {
    //启动java需要的jvm环境,才可以运行java代码
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }
 //省略
    if (startClass == NULL) { //省略
    } else {
      //省略
        if (startMeth == NULL) {
        } else {
            //关键调用对应的"com.android.internal.os.ZygoteInit"类main方法
            env->CallStaticVoidMethod(startClass, startMeth, strArray);
        }
    }
    //省略
}

上面可以看出app_main主要做的工作就是准备虚拟机环境,让进程运行到了java世界的ZygoteInit的main方法

4、ZygoteInit的源码分析

路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java


```cpp
 public static void main(String argv[]) {
 //构造ZygoteServer对象
        ZygoteServer zygoteServer = new ZygoteServer();
//省略

        final Runnable caller;
        try {
//省略
            boolean startSystemServer = false;
            String socketName = "zygote";
            String abiList = null;
            boolean enableLazyPreload = false;
            for (int i = 1; i < argv.length; i++) {
                if ("start-system-server".equals(argv[i])) {
                    startSystemServer = true;
                } 
                //省略
            }
            //创建SocketServer端
            zygoteServer.registerServerSocket(socketName);
         
            if (!enableLazyPreload) {
       //加载资源
                preload(bootTimingsTraceLog);
            } else {
                Zygote.resetNicePriority();
            }
//省略
            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;
                }
            }
            //进入永久循环等待请求来创建新的进程
            caller = zygoteServer.runSelectLoop(abiList);
        } catch (Throwable ex) {
            //省略
        } finally {
            zygoteServer.closeServerSocket();
        }
        //省略
        if (caller != null) {
            caller.run();
        }
    }
    主要干了以下几件事情:
    1、创建出server端的socket,接受AMS创建新进程的请求
    2、预加载了类,资源t,opengl,so库等
    3、启动了system_server进程
    4、循环等待AMS请求来创建新的进程
    那Zygote自身启动部分就分析完成,后续文章在分析system server启动及普通app进程的启动

Android Framework原理,android实战项目pdf 启动Android 当初始化内核之后,init进程负责解析init.rc配置文件, 就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的 /system/bin/app_process_Zygote服务启动的进程名 –start-system-server 表明Zygote启动完成后,需要启动System_Server进程 socket zygote stream 666在Zygote启动时,创建一个权限为666的socket。此 阅读详情

相关推荐

VFIO框架源码分析(一)- 从初始化到设备访问

本文深入剖析了Linux内核中的VFIO(Virtual Function I/O)框架,详细解读了其从初始化到设备访问的全过程。VFIO通过Container->Group->Device的层次化设计,利用IOMMU提供安全隔离,允许用户空间直接访问物理设备。文章基于Linux v5.15版本,重点分析了vfio_init模块入口、Container创建与配置、Group关联以及最终设备访问等关键环节,揭示了VFIO如何通过逐层授权机制构建安全可靠的设备直通模型,为虚拟化技术提供核心支持。

qq_36071928的博客 380

深入Android Framework开发(入门篇)

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。 学完本课程能让你学会如下知识点: -学习Framework背景及它的巨大作用-Android源码环境搭建及让自己系统第一次跑起来-学习Frameowork开发的一些必要基础知识-学习怎么进行Android源码定位分析,实例:Activity启动流程源码分析-实战开发Frameowork项目--去除第三方应用入口广告页

百度地图街景图像批量获取

由于个人研究需要在最近试了一下使用API获取百度地图街景图片,在此介绍一下基于我个人需求的百度街景批量获取方法,本文以Python编码作为主要方法,如果对零编码工具有需要的可以关注一下UA城市分析小组刚刚发布的街景图片获取工具。 街景图像用作区域细粒度空间指标测度需要解决几个问题。 1. 首先就是调用额度的限制,现在百度对于个人认证开发者每天可用的街景图像调用额度为100张,在不考虑购买额度上限(1万张600元,其实有经费的前提下可以直接考虑钞能力)的情况下动辄几千上万张的爬取数量会大大增加需要爬取的时间周

boycetoon29的博客 1万+

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++层的堆栈打印

量化交易新手必看:如何用Python快速接入XTP极速交易系统(附避坑指南)

本文为量化交易新手提供了使用Python快速接入中泰证券XTP极速交易系统的完整指南。文章详细介绍了XTP系统的微秒级性能优势、与CTP系统的核心区别,并逐步讲解了环境配置、API连接、资金查询、下单撤单等关键步骤,同时分享了网络维护、订单处理等实战避坑技巧,帮助开发者高效对接专业交易柜台。

life6的博客 660

MATLAB去雾算法实战:5种经典方法对比+1种改进方案(附完整源码)

本文详细对比了MATLAB中5种经典去雾算法(包括暗通道先验、多尺度Retinex等)的实现效果,并提出一种创新的自适应融合改进方案。通过完整的源码展示和性能对比,帮助开发者掌握图像去雾的核心技术,提升计算机视觉应用中的图像质量。特别针对去雾算法中的光晕效应问题,给出了工程实践中的优化技巧。

weixin_26801149的博客 412

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命令的程序

WRF后处理避坑指南:从namelist配置到降水计算的全流程解析

本文提供了一份详尽的WRF模式后处理避坑指南,涵盖从理解wrfout文件结构、核心变量解析到累计降水计算与专业气象图绘制的全流程。重点解析了RAINC与RAINNC的正确处理方法,并分享了使用wrf-python库高效绘制位势高度叠加风场图、累计降水图等专业图表的实战技巧与代码,旨在帮助用户规避常见错误,提升后处理效率与图表质量。

weixin_29200485的博客 353

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

三菱 FX5U PLC 4轴程序 控制松下伺服3个, 步进电机一个

三菱 FX5U PLC 4轴程序。 控制松下伺服3个, 步进电机一个, 四轴自动堆垛码垛设备程序, 回原点动作用专用的原点回归指令写的, 手动运行用三菱相对定位指令写的 , 自动运行用绝对定位指令写的取料运行, 表格定位写的自动放料运行, 设备各种报警异常都有写出 程序每一步都有注释。 包括PLC程序、显控触摸屏 程序、松下伺服驱动器接线图。 程序内都有IO注释 编号:4816635519484681汇美0808 ...

m0_68069172的博客 3381

Vue3 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue3,nuxt3,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue3西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,自定义播放器样式,截屏,监控视频,vue3使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,

🏆 前端领域优质创作者 1万+

Android Framework实战视频系列

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

learnframework的博客 1858

示波器核心参数选型指南:带宽、采样率与嵌入式调试实战

示波器是电子工程师进行信号观测与故障诊断的基础仪器,其性能由带宽、采样率、通道数、存储深度、触发系统和探头特性共同决定。带宽定义高频响应边界,需遵循5倍法则以保障数字信号上升沿测量精度;采样率则依据奈奎斯特定理并结合工程冗余(通常≥2.5×带宽)实现可靠时域重建。二者协同影响信号完整性评估能力,尤其在UART、I²C、SPI等嵌入式总线调试中至关重要。高存储深度支持长时捕获与毛刺定位,智能触发与硬件协议解码进一步将波形分析升维至语义级。本文围绕真实嵌入式场景,解析参数间的耦合关系与典型误用陷阱。

weixin_42588877的博客 91

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

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

liaosongmao1的专栏 306

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

学习Android Framework可以做什么?

其实很多新的学员都会问学习Framework后到底在企业里面干什么?具体哪些工作是需要Framework层面进行修改的,市场需求量大不大。 这个其实在我的课程第一节就有讲到相关的内容,即为什么要学习framework,具体可以看我的免费试看视频 这次我们重点介绍是哪些工作是需要学习 Framework知识,这里主要分为2大块与大家分享: 1、市场上所有智能设备终端厂商 即入职公司就是一个卖android设备的公司,安卓系统的设备目前有哪些呢 2、国内顶级互联网App开发厂商 主要业务范围:分析研究Frame

learnframework的博客 2361

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

Zygote的fork进程篇 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) {

learnframework的博客 2839

Android FrameWork底层开发视频全套

我的百度云连接 链接: https://pan.baidu.com/s/1i64xvjJ 密码: 5ptb 我的百度云连接 链接: https://pan.baidu.com/s/1i64xvjJ 密码: 5ptb 我的百度云连接 链接: https://pan.baidu.com/s/1i64xvjJ 密码: 5ptb AndroidFrameWork底层开发视频全...

疾风剑豪 1935

Android Framework实战视频--FallbackHome进程启动及Activity启动篇

Android Framework实战视频–FallbackHome进程启动及Activity启动篇 android 8.1 源码中FallbackHome进程启动及Activity启动分析 上一节课已经一步步分析到了Process.start了,那本节就是来分析Process的start方法具体是怎么一步步的把进程启动及进程启动后对应的Activity是怎么启动的 1 应用进程的创建 首先看Process.start的源码: public static final ProcessStartResult s

learnframework的博客 5357

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

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

Android-Framework学习笔记(二)Zygote进程启动过程,吊打面试官系列

//监听socket,启动新的应用进程 runSelectLoop(abiList); //6 closeServerSocket(); } catch (MethodAndArgsCaller caller) { //通过反射调用SystemServer#main() caller.run(); } catch (RuntimeException ex) { Log.e(TAG, “Zygote died with exception”, ex); closeServerSocket(); throw e

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

千里马学框架

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

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

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

打赏作者

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

抵扣说明:

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

余额充值