android 13 Zygote fork新的app进程源码分析-车载车机手机framework实战开发

手把手教你用SlowFast训练自定义手势识别数据集(附FFmpeg抽帧技巧) 本文提供了一份基于SlowFast架构训练自定义手势识别数据集的完整实战指南。文章重点剖析了数据准备的核心挑战,详细讲解了利用FFmpeg进行高、低帧率抽帧的技巧,并介绍了构建半自动标注流水线、生成符合SlowFast要求的AVA格式数据集文件的具体方法。最后,针对手势识别场景,给出了关键的模型训练配置与调优建议,帮助开发者高效完成从数据到模型的全流程。 阅读详情

hi,粉丝朋友们!
今天有个学员朋友在千里马的android framework实战开发时候,使用的是最新android13代码的,相比以前的版本这块Zygote fork新进程还是有较大的差异。
下面我们就来重点分析一下android13的zygote的fork App进程源码分析,主要讲解和以前版本差异部分:

在这里插入图片描述

上图就是老版本的一个fork情况
但是新版本android 13后在ZygoteConnection.processCommand的部分开始有很大差异

//这里android 13要非常特殊应用才可以进入这里,一般都是else
  if (parsedArgs.mInvokeWith != null || parsedArgs.mStartChildZygote
                        || !multipleOK || peer.getUid() != Process.SYSTEM_UID) {
                    // Continue using old code for now. TODO: Handle these cases in the other path.
                    pid = Zygote.forkAndSpecialize(parsedArgs.mUid, parsedArgs.mGid,
                            parsedArgs.mGids, parsedArgs.mRuntimeFlags, rlimits,
                            parsedArgs.mMountExternal, parsedArgs.mSeInfo, parsedArgs.mNiceName,
                            fdsToClose, fdsToIgnore, parsedArgs.mStartChildZygote,
                            parsedArgs.mInstructionSet, parsedArgs.mAppDataDir,
                            parsedArgs.mIsTopApp, parsedArgs.mPkgDataInfoList,
                            parsedArgs.mAllowlistedDataInfoList, parsedArgs.mBindMountAppDataDirs,
                            parsedArgs.mBindMountAppStorageDirs);

                    //省略
                } else {
                //普通app都是走这里
                    ZygoteHooks.preFork();
                    Runnable result = Zygote.forkSimpleApps(argBuffer,
                            zygoteServer.getZygoteSocketFileDescriptor(),
                            peer.getUid(), Zygote.minChildUid(peer), parsedArgs.mNiceName);
                    //省略
                }

哈哈,注意一般app都是走Zygote.forkSimpleApps这个,但是你要是对这个方法直接打印会发现它并不是个一次性方法,进入后马上出来,这里forkSimpleApps方法名字其实和它的实际行动不太搭,所以这里大家特别注意不要被它的名字迷惑,以为每次 fork新的app进程,这里就会进入一次forkSimpleApps

来看看forkSimpleApps的特殊

    static @Nullable Runnable forkSimpleApps(@NonNull ZygoteCommandBuffer argBuffer,
                                             @NonNull FileDescriptor zygoteSocket,
                                             int expectedUid,
                                             int minUid,
                                             @Nullable String firstNiceName) {
        boolean in_child =
                argBuffer.forkRepeatedly(zygoteSocket, expectedUid, minUid, firstNiceName);
        if (in_child) {
            return childMain(argBuffer, /*usapPoolSocket=*/null, /*writePipe=*/null);
        } else {
            return null;
        }
    }

这里看着没有啥东西,就是调用了个argBuffer.forkRepeatedly方法,不过这个方法就可以看出点有循环的意思

boolean forkRepeatedly(FileDescriptor zygoteSocket, int expectedUid, int minUid,
                       String firstNiceName) {
        try {
            return nativeForkRepeatedly(mNativeBuffer, zygoteSocket.getInt$(),
                    expectedUid, minUid, firstNiceName);
        } finally {
            Reference.reachabilityFence(mSocket);
            Reference.reachabilityFence(zygoteSocket);
        }
    }

这里又调用到了nativeForkRepeatedly

jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly(
            JNIEnv* env,
            jclass,
            jlong j_buffer,
            jint zygote_socket_fd,
            jint expected_uid,
            jint minUid,
            jstring managed_nice_name) {
  //省略部分
  do {
    if (credentials.uid != expected_uid) {
      return JNI_FALSE;
    }
    n_buffer->readAllLines(first_time ? fail_fn_1 : fail_fn_n);
    n_buffer->reset();
    int pid = zygote::forkApp(env, /* no pipe FDs */ -1, -1, session_socket_fds,
                              /*args_known=*/ true, /*is_priority_fork=*/ true,
                              /*purge=*/ first_time);//这里进行zygote::forkApp
    if (pid == 0) {
      return JNI_TRUE;//新fork的进程直接退出
    }
 //zygote自身继续监听数据循环
    for (;;) {//注意这里死循环
      // Poll isn't strictly necessary for now. But without it, disconnect is hard to detect.
      //一般就会一直阻塞这里,等待下一个要fork进程时候就可以继续执行
      int poll_res = TEMP_FAILURE_RETRY(poll(fd_structs, 2, -1 /* infinite timeout */));
      if ((fd_structs[SESSION_IDX].revents & POLLIN) != 0) {
        if (n_buffer->getCount(fail_fn_z) != 0) {//有新的进程fork时候,会break出这个死循环
          break;
        }  // else disconnected;
      }
      //省略
    }
    first_time = false;
  } while (n_buffer->isSimpleForkCommand(minUid, fail_fn_n));
  ALOGW("forkRepeatedly terminated due to non-simple command");
  n_buffer->logState();
  n_buffer->reset();
  return JNI_FALSE;
}

上面即可以看出,这一部分的循环数据监测工作放到的native层面进行了

在这里插入图片描述

C++控制台实现简单的注册登录 C++控制台实现简单的注册登录 #include<iostream> #include<string> #include <vector> #include <conio.h> void Display();//调用display显示switch()界面 void Register();//注册 void Enter();//登录 using nam... 阅读详情

相关推荐

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

Android 系统源码查看六种方式

Android 系统源码查看六种方式

码点 7770

图形学基础知识:着色(三)Rendering Pipeline与Shader

管线(Pipeline) 什么是管线? 管线我们可以理解为流水线,流水线大家都懂,就是工厂里面生产东西的一整套流程。例如饮料厂要生产饮料,需要洗瓶子,倒饮料,加盖,包装等等,这一整套过程就是流水线。那么我们要把一个三维场景渲染成一幅二维的图像,同样需要一个先干嘛再干嘛然后干嘛最后干嘛的过程,这个过程或流水线,我们就称之为管线。 实时渲染管线(Real-time Rendering Pipeline) 通过前面几篇的学习,我们知道了要把一个三维场景渲染成一幅二维的图像大致分为以下几个步骤: M.

王王王渣渣的博客 2532

Android13 Media 扫盘源码分析(一)

Android13 外部磁盘,媒体库更新逻辑简述

qq_41350835的博客 1363

基于 AUTOSAR 的域控产品软件开发进阶探索

本文深入探讨了AUTOSAR架构在汽车域控产品开发中的进阶应用。首先从系统设计角度分析了AUTOSAR分层架构原理及其在域控产品中的优化部署策略;其次详细介绍了Davinci和EBTresos等主流工具链的特点与协同使用方法;然后重点阐述了ASPICE流程与功能安全/信息安全标准的实施要点;最后分享了多核车载芯片(如NXP S32G)的适配经验与优化实践。通过架构设计、工具运用、标准遵循和芯片适配四个维度的专业解析,为域控产品的AUTOSAR开发提供了系统性指导。

SiArch的博客 1199

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 374

Android系统的心脏-Zygote进程如何fork一个新的应用进程

在Android系统中,所有的应用程序进程都是有Zygote进程创建的。那么,到底是如何创建出来的呢?本节来分析一下这个创建流程。

记录和分享程序人生的点点滴滴 2413

基于CANopenNode协议栈在正点原子探索者开发板上进行移植

配置好之后进行采用keil IDE进行代码生成即可,还需要进行CANopenNode的代码集成,并参照demo进行代码移植。发送完成后心跳包以1s的周期重新开始发送。正点原子的开发板引出的是CAN1接口。这里的心跳时间间隔设置为100ms。则将心跳包周期设置为0。

wangfandashe的博客 4697

Android系统启动--Zygote启动system_server进程的过程--Android 12

上一篇博文介绍了SystemServer启动各种SystemService的过程,本章介绍Zygote孵化SystemServer进程的过程,system_server是进程名称,代码实现在 /frameworks/base/services/java/com/android/server/SystemServer.java。Zygote启动system_server进程基本都在framework Java层,本文基于Android 12,整体过程如下图。

lvyaer_1122的博客 977

MicroCap声学仿真介绍(四)-扬声器仿真

将“障板”模块放置到工作区,“Param:AREAm2=”是指的是障板孔的面积,一般可以输入喇叭的面积Sb;“Param:DISTm=”指的是测试麦克风与障板的距离,这里我们可以填入1米,小喇叭可以填入0.1m;此时工作区的电阻是竖直的,为了方便,我们需要将其变成水平的。其中,频率范围为20~20KHz,仿真点数为500个点,先仿真频响曲线和相位曲线,点击左上角的run,界面如下。鼠标单击工作区,弹出如下界面:在弹出的界面中输入“.define Re 3.82 “,点击”确定“按钮。

山无忧的博客 2997

Hermes Agent 对阵 OpenClaw:自我改进的 AI 队友

但在 2026 年 2 月,Nous Research 发布了 Hermes Agent,它带来了不同的愿景:一个不仅能够运行,还能学习的代理。在完成复杂的多步骤任务后,它会分析自己的操作并创建一个可复用的技能。对于已在使用 OpenClaw 的澳大利亚企业而言,这意味着您可以试用 Hermes Agent,而无需丢失数月的配置和自定义成果。最重要的区别在于理念:OpenClaw 是一个需要配置的工具,而 Hermes Agent 则是一个会学习的队友。OpenClaw 的技能是静态的。

xiaoshun007的专栏 1571

android frameworks之zygote进程

framework;android;zygote;linux;java;c/c++

luyu22的博客 418

Microsoft Forms功能深度解析:企业数据收集与协作的智能利器

Microsoft Forms是微软365生态中的在线表单工具,支持问卷调查、测验和投票创建,具备拖拽式界面、多题型设计和实时数据分析功能。其核心价值在于易用性、跨平台兼容性以及与Teams、SharePoint等微软服务的深度集成,满足GDPR/HIPAA等合规要求。提供表单创建、权限管理、自动化流程(通过Power Automate)和审计日志等功能,适用于金融、医疗、教育等多行业场景。虽然存在逻辑分支有限等约束,但通过案例证明能显著提升数据收集效率(达70-85%)。使用时需注意许可证配置(Busin

xueyunshengling的博客 9125

Android 13 源码获取与构建

源代码下载的时间比较长,一共耗时1小时12分钟。源码下载到本地后会自动进入文件检验阶段,用与校验下载的文件是否有缺失。Android 系统构建的过程非常长,构建完成后,将会在 out 目录中查看到编译好的系统镜像。验证python版本,确认 python 的默认版本是 3.x。修改 repo 中 REPO_URL 变量值。源代码下载后约占用 126G 的磁盘空间。选择 No,将会切换到 bash 环境。然后将 repo 文件复制到。将会进入系统编译构建过程。

架构师实战感悟 2219

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android 12 应用Java crash流程分析

android 应用 java crash 目前为止,Android应用进程是通过zygote进程fork出来的子进程,然后执行一些应用相关的初始化,最后进入应用入口—ActivityThread的main方法。应用在main方法中调用attachApplication通知系统应用启动完成,同时注册IApplicationThread对象到系统进程(通过linkToDeath监听其死亡),最后应用进入主消息循环后就正常运行起来了。通过以上分析,可以总结出应用Javacrash机制处理的三个阶段。.....

pecuyu 1939

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

探索APP进程的启动流程(二)完结篇

首先回顾下冷启动的流程图: 共有四个步骤: 1.launcher进程通过binder请求ams启动Activity,AMS进程查询内存中是否存在该进程。 2.内存中无相应进程,ams通过socket发送创建进程命令和相关资料到zygote进程。 3.zygote进程收到socket信息后,fork子进程,创建出ActivityThread的进程(目的进程) 4.ActivityThread通过binder把新建的进程信息与AMS进行相关联。 在上一篇博客中,介绍了从用户点开app到发送指令给zygote进

qq_37977070的博客 8492

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android Zygote Fork

Zygote zygote 孵化器是 Android 应用进程的模板,通过其 fork 出来。 Zygote初始化最后进入 select 循环, 等待客户端的请求 fork 应用进程。 frameworks/base/core/java/com/android/internal/os/ZygoteServer.java Runnable runSelectLoop(String abi...

大山 572

Android系统框架知识系列(三):核心进程详解 - Zygote,Java世界的孵化器与加速器

Zygote进程是Android系统启动和应用进程孵化的核心机制,通过预加载Framework类库和资源,结合Linux的fork()及Copy-On-Write技术,实现高效进程创建与内存复用。

Android/Linux kernel经验分享 1375

安卓源码中查看版本

build/make/core/version_defaults.mk中,查看PLATFORM_VERSION_LAST_STABLE字段。

叶辞树的博客 855

安卓Android13源代码和Openharmony鸿蒙源代码全文检索方法

小唐代码搜索 基于小唐搜索引擎技术,小唐搜索引擎采用c++写成,相比开源的ElasticSearch(由java语言写成)更加优秀,在代码搜索上小唐的搜索体验超出ElasticSearch太多,github的搜索看报道即是由ElasticSearch实现的,github的代码搜索基本无法使用。安卓Android13源代码(aosp工程)下载下来高达155G,Openharmony鸿蒙压缩包页高达23G,即是下载到本机进行搜索也不是一件容易的事情。提供了这两个巨无霸开源工程的全文检索服务,欢迎大家使用。

唐爱平的blog 829

Android 中的 Zygote 和 Copy-on-Write 机制详解

Zygote 是 Android 的母体进程,负责创建应用程序的进程。当 Android 启动时,系统会首先启动 Zygote 进程,并加载一些常用的系统库和资源。之后,当有新的应用启动请求时,Android 系统不会重新创建一个独立进程,而是通过 fork 一个 Zygote 的子进程来创建新的应用进程。这个新进程会继承 Zygote 的所有资源,从而极大地加快了启动速度。减少内存占用:Zygote 进程加载的资源(如系统库)可以共享给所有应用进程,显著减少内存占用。

qq_66118130的博客 797

android中AMS进程通知Zygote进程fork新进程的通信方式

AMS通知Zygote去fork进程的时候,使用的是socket的方式,而不是binder。我们都知道,安卓中跨进程的方式是binder,而为什么这里偏偏使用Socket呢?有点人会说LocalSocket本来就是用来本地进程间通讯的,这没错,但知其然更要知其所以然。

allen_xu_2012_new的博客 1276

系统初始化以及Zygote进程fork app进程的基础

本文分析了安卓系统启动流程及Zygote进程的核心作用。系统启动过程包括电源启动、BootLoader加载、Linux内核初始化、init进程创建文件目录和属性服务、Zygote进程启动Java虚拟机并注册JNI方法、SystemServer进程启动系统服务,最后Launcher启动用户界面。重点阐述了Zygote进程如何通过预加载基础资源(如Context、View等)实现快速fork应用进程,解释了使用Zygote而非init直接fork的原因在于资源复用和效率优化。这种设计使得应用进程能共享预加载资源

giaoho的博客 657

CarFramework 的 Android 版本适配解析

高版本 Car API 可能在低版本车机上不可用。:Android 10+(尤其车企项目)。行驶中禁用非必要应用(如视频播放)。:版本适配、API 差异、安全限制。CarFramework 是随着。Android 10 提供稳定的。:VHAL 2.0 + 多屏支持。支持动态调整仪表盘/中控屏布局。Android 11 引入。(适合共享汽车场景)。:基础框架,功能有限。:强化安全与多屏管理。,低版本无官方支持。

斗锋在干嘛的博客 609

hal深入剖析之aidl实战-android framework车机车载手机系统开发

创建最重要的aidl接口文件,需要在第一步创建的目录下`-- mytest编写aidl内容:String key;int value;还是就是parcelable都是需要进行结构化,成员属性写清楚到aidl。

learnframework的博客 6163

推荐六种查看Android系统源码的网址

Google Git 下载,从 Android 4 到 Android 13 的源码,涵盖 Google 的所有修改记录。下载 Andorid 源码中的仓库,下载后可切换仓库的所有版本分支,查看最新修改记录和系统源码。涵盖 Android 所有系列版本 Android 2.2 到 Android 13 的源码。从 Android 4.4 到 Android 12 的系统源码在线查看。从 Android 7.1 到 Android 13 的系统源码。可切换分支查看不同 Android 版本的系统源码。

分享技术与经验的博客 5万+
上一篇: 千里马framework学习跨进程实战课程学员疑问解答:ClassNotFoundException when unmarshalling
下一篇: 车机CarLauncher的Activity多屏模式WindowingMode为WINDOWING_MODE_MULTI_WINDOW疑问解析
千里马学框架
博客等级 码龄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、付费专栏及课程。

余额充值