Android runtime机制(一)init进程

Android系统启动流程(一)解析init进程启动过程 作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。 阅读详情

原文地址:https://blog.youkuaiyun.com/zilx/article/details/71908997

前言

最近对Android run time机制进行了一些研究,并对run time的处理做了一些总结,现记录下来,以方便日后工作学习,也可供读者参考。

 

通过本篇,我们应理解以下知识点:

  • Android系统的启动顺序
  • init进程的处理及rc配置文件
  • 系统级service是如何启动的
  • 添加一个系统级service的注意点

本文主要以android-7.1.2_r11为参考。


Android系统启动过程


Android系统的启动,主要经过如下三个过程:

1.  启动bootloader

Boot loader的源码路径:bootable/bootloader/*。

在系统加电后,CPU将先执行bootloader

2.  启动kernel

Kernel源码路径:kernel/*

Kernel是由boot loader启动。

3.  建立Android runtime运行环境

a)   启动Init进程

b)   启动Zygote进程

c)   创建ART虚拟机

d)   启动System server

e)   启动其他Android系统级服务

f)   启动桌面Launcher服务


关于boot loader和内核kernel的启动,在此不做深究。

本篇主要探讨Android init进程的处理过程及zygote进程的启动过程。

有关Init.rc配置文件结构及其解析过程,请关注本博客后续专题。


Init进程的处理


Init进程是在Kernel启动后而创建的第一个进程。它是一个root进程,是其他进程的父进程。

Init源码路径:system\core\init\。

在Init启动后会调用system\core\init\Init.cpp中的main()函数进行处理。从处理中可以看到,init进程主要做了如下两件事:

1. 搭建系统运行环境,创建相关目录,设置相关路径和属性。

2. 解析rc配置文件,执行rc配置文件所要求的动作和命令。


下面是Init.cpp的main()函数主要处理的功能,以帮助理解init进程的处理。

1. 添加相关程序库路径到当前环境


2.  创建相应目录,并把kernel中创建好的文件系统mount到对应目录上


3. 创建并打开init进程的标准输入、输出、出错设备节点和kmsg设备节点


4.  初始化property,设置系统属性,创建对应socket并监听。Property的初始化和处理是在这里进行的


5.  初始化SELinux安全子系统


6.  创建epoll句柄


7.  初始化signal handler


8.  读取并解析rc配置文件。非常重要的处理,其处理内容对用户自定义系统级Service时的配置及设定处理有很大帮助,应加以深入理解


9.  根据rc文件配置,one by one的执行所有配置的action,其中就包括启动相关服务。



Init进程是如何启动其他service进程的


在Init.cpp的main()函数中,有一个重要的功能,就是读取rc配置文件并解析,然后执行配置相关的命令。其中对于Service,我们需要清楚Init进程是如何进行启动的。下面就以Zygote进程的启动为例进行剖析。

从Init.cpp main()函数处理rc配置文件的过程可知,rc配置文件是一切Action的源,所以要了解Init进程是如何启动Service的,就需要理解rc配置中的各个字段的含义。

大家都知道,Zygote进程是通过Init进程创建的,而且Zygote服务是在init.rc中import对应的zygote配置文件进行配置的。如下图所示:


在init.zygote32.rc中,对zygote服务进行配置:


上述配置就是一个Service section。从Parser处理可知,上述配置只是创建了一个Service对象,并对Service对象进行参数设置,同时把该对象添加到Service 向量表里。此时该Service并未被启动。

那么,zygote service是在什么时候启动的呢?是由谁控制启动的呢?

咱们再回到init.rc配置文件。在rc配置文件中,主要由三个关键字组成若干个section,这三个关键字是:

Import

导入其他配置文件。

service

配置Service。在解析中创建Service对象,并根据配置设置相应参数。

on

Action配置,具体的command操作。

所以如果要启动zygote service,那么就需要在rc中的on字段配置相应的action。

事实正如所想的一样,zygote service的启动是由init.rc中的如下Action处理的,class_start command就是用来启动service的:


Class_start command的处理:


do_class_start在处理中会调用Service类的StartifNotDisabled()函数。



其中,Service-> StartifNotDisabled()函数调用Service->Start()函数,创建init进程的子进程,也即当前Service进程。



由此,zygote进程就被init进程创建并启动了。


通过上面介绍,我们大概知道了init中Service的启动过程。对于启动一个系统级Service,我们应了解:

1. Service的配置和启动控制都在Init.rc里。 只需对Init.rc进行配置就可以添加一个Service并启动。

2. Service section,生成Service对象并配置Service相关参数。

3. On section中的class_start命令,用来启动Service。它的参数是需要启动的service 的class字段。

4. Service section中不能配置disable字段。


System property的设置


在init.rc和init进程中,我们注意到对system property也进行了配置并处理。

1.   Init.rc中配置action


2.  调用Builtins.cpp中的load_system_propsd执行函数


3.  执行do_load_system_props()函数,/system/build.prop等系统配置被加载并设置




Init处理在Android开发中的注意点


从init的处理得知,对于Android开发,我们可获知以下知识点以帮助应用程序的开发。

1.  property及/system/build.prop
/system/build.prop在android开发中经常使用,它是在init进程中被处理。所以在程序开发的过程中,要充分考虑到这点。

2.  用户添加系统级Service
1)在init.rc中添加Service section的时候,尤其要注意class name,同时要注意on section中的class_start命令,看看是否需要添加。因为他们直接关系到在开机启动后Service进程能否正常启动。
2)在zygote service配置中,有一个重要的选项:/system/bin/app_process。该文件在/system/bin下,通过执行/system/bin/app_process来进入app_process(也就是zygote)进程处理。所以在添加Service配置的时候,一定要保证该类文件的存在。不然service是无法运行的。


Android Runtime(一) 1.init进程作为linux启动过程中的一个重要的进程,它主要负责文件系统的挂载,属性的初始化,各种配置的加载启动以及Action触发,Service的启动,而Zygote作为Java环境下的服务进程,也在Init.rc中进行了配置,而init进程是由main函数进行触发的。bin sbin system/bin是init进程fork出来的,PPID是1,其他都是zygote进程fork出来的,PPID是2。Android上层是java,framework是java,native是c++,驱动是c。 阅读详情

相关推荐

Android 应用程序的启动流程

本文基于Android 11,主要分析应用程序的启动流程,会直接定位到函数开始,因为该函数前面的内容主要在Activity的启动流程中,可以通过这部分的文章来阅读。看源码流程,需要戒骄戒躁,心态好。

maniuT的博客 976

深入探索 Android 中的 Runtime

在 Android 中,Runtime 是系统的一部分,负责执行和管理应用程序的运行时环境。它是一个运行库,提供了许多核心功能,如内存管理、线程管理、垃圾回收等。

特立独行的博客 2973

Android Q中Init启动Zygote的七道安全加固工序解析

Zygote作为Android Java运行时的起点,其启动过程远不止fork-exec的简单调用;它本质上是Init进程依据SELinux策略、Linux capabilities、命名空间与seccomp-bpf构建的多维安全沙箱。理解Zygote启动,需掌握进程上下文隔离原理——包括执行前SELinux域跃迁、能力边界裁剪、mount namespace创建及APK路径解耦机制。这些技术共同支撑Scoped Storage强制实施与Treble架构落地,广泛应用于定制ROM调试、系统级安全加固及AOS

weixin_30402231的博客 81

Android Zygote启动流程:从init进程到应用孵化的核心机制解析

在Android系统架构中,进程创建机制是系统性能优化的关键环节。其核心原理基于Linux的fork系统调用与写时复制技术,通过共享预加载的公共资源实现高效进程孵化。这一机制的技术价值在于显著提升应用启动速度并降低内存占用,为移动设备的多任务处理提供了基础支撑。在Android平台的具体实现中,Zygote进程作为应用孵化器,通过Socket通信接收启动请求,并利用预加载的类与资源快速创建应用进程。本文聚焦Zygote的启动流程,深入解析从init进程解析rc脚本、app_process搭建Native到J

weixin_33906657的博客 453

如何创建android系统服务

android系统级的服务包含了Android Service 和Native Service . Android Service 也称作 Java Service ,是用JAVA语言编写的,实现在框架层。 Native Service 也称作 System Service ,是用C++语言编写的,实现在Runtime层。 对于这两种service来说,两个对等service通讯都是利用binder,只不过一种利用*.aidl,一种利用IInterface编写序列化代码而已,本质是一样的,下面先介绍native service的编写及两个native service如何通讯的过程。

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

Android Runtime Zygote进程启动与ART初始化原理(8)

Zygote进程是Android系统中的一个特殊进程,它是所有应用进程的父进程。在Android系统启动过程中,Zygote进程率先被创建并初始化,之后每当系统需要创建一个新的应用进程时,都会通过复制Zygote进程来实现,这种机制极大地提高了应用启动速度。

Android开发领域创作者 849

Python 静态导入与动态导入

python中模块的静态导入 与 动态导入(运行时指定模块),以及具体对应示例。

慢也好,步子小也好,往前走就好~ 716

Android init.rc的property触发机制

前言:Android系统启动init进程会去解析/init.rc or init.platform.rc、/etc/init/*.rc等rc档,以便启动一些进程和服务。这里主要看下启动这些进程或服务的属性触发条件。 背景:了解init.rc的语法格式,网上很多资料可参考。比如: #原生Actions格式 on <trgger> [&& <trigger&g...

平凡之路 5007

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1134

STM32 ES8266上阿里云IOT MQTT实践【第七章】:ESP8266+MQTT上阿里云物联网平台实践

本篇文章讲述了如何使用stm32接入阿里云IOT,WiFi模块为ESP8266,可以实现发布以及订阅。

超级大洋葱的博客 2万+

Android 启动分析 init进程 init.rc

转自:http://blog.youkuaiyun.com/SkyGray/archive/2010/06/25/5694898.aspx          前段时间看了下Android的启动的源代码,大致的理了下,很多底层的一些机制,实现什么都没过多的研究。对于Android架构理解有很大的帮助 -----------------------------------------------------

魔戒 3298

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1342

第 4 章:开机与 Init 进程

阶段 1:上电(ROM 代码)按下电源键后,片上系统(SoC)开始执行内部掩膜 ROM 中的代码。掩膜 ROM 是芯片出厂时烧录的一小段不可修改代码。该 ROM 代码初始化最基础硬件(时钟发生器、内存控制器),从固定存储位置(通常是 eMMC/UFS 引导分区起始位置)加载主引导加载程序,并将控制权转交。该阶段完全由厂商实现,不属于 AOSP。阶段 2:引导加载程序(ABL/U‑Boot)引导加载程序是首个设备间存在差异的软件组件。

dengfuma的专栏 416

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「前端可视化项目实战:智慧农业监控大屏开发详解」 「农作物可视化监控:用 Vue 和 ECharts 构建大屏应用」 「从零开始开发一个智慧农业数据大屏(代码+图表展示)」 「前端新手也能实现!智慧农业监控大屏开发教程」 「用 Vue 和 ECharts 搭建动态数据大屏:详细图文教程」 「学习前端大屏开发:

sky10100100的博客 1533

基于YOLOv11的军事目标识别系统设计与实现(坦克、舰船检测)

DOTA-v2.0(包含多种军事装备的航拍图像)图片数量:11,268类别:18类,包括坦克、舰船、战斗机等分辨率:800×800~4000×4000HRSC2016(高分辨率舰船检测数据集)图片数量:1,061类别:舰船及子类特点:包含多种视角和复杂背景图片数量:5,000+类别:22种军用飞机标注:精确边界框自建数据集建议收集来源:公开军事演习视频、卫星图像、模拟游戏截图数据增强:模拟不同天气、遮挡、低光照等战场环境。

YOLO 450

Android上OpenXR SDK查找并加载runtime流程

本文主要讲解openxr应用如何选择monado runtime的主要流程。其完整流程图如下由于图太大,有的地方不清晰,故将某些部分截图重新展示CreateInstance流程如下查找runtime流程如下API layer load流程图如下以SDK中的hello_xr应用为例,其入口在main.cpp中。

weixin_41028555的博客 1389

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android系统启动,用过安卓手机的都知道,你还不知道吗?

Android系统启动一.Android系统启动概述1.启动电源以及系统启动2.引导程序BootLoader3.Linux内核启动4.init进程启动5.Zygote进程启动6.SystemServer进程启动7.AMS启动Launcher进程二.Android系统启动详解1.init进程的启动过程init进程的main函数(init.cpp)执行过程:2.Zygote进程的启动过程(C层)app...

LeeDuoZuiShuai的博客 2455

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

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

蓝牙模块HM-10手册

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

Andorid进程创建和杀死流程

Andorid进程创建和杀死流程 Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。 从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模.

谁人打的太极拳的博客 256

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入解析Android Zygote启动流程:从进程孵化到系统优化的核心机制

在Android系统架构中,进程管理是系统性能与稳定性的基石。其核心原理基于Linux的fork机制与写时复制(Copy-On-Write)技术,通过共享内存页实现资源的快速复用。这一机制的技术价值在于显著提升应用启动速度并优化内存使用效率,广泛应用于系统服务启动与应用程序孵化场景。本文聚焦于Android系统的Zygote进程,详细剖析其作为进程孵化器的启动流程,涵盖从init.rc脚本解析、Socket通信建立到预加载(Preload)机制与system_server启动等关键环节,并探讨了USAP(应

weixin_34195142的博客 440

「安卓framework基础篇1」开机流程(基于AOSP13)

作为爱好者,想理解手机系统的运行原理,但是安卓操作系统这么复杂,从哪开始呢?跟使用手机的操作顺序一样,先从开机开始吧。

geyang55xu的博客 398

Android 面试必备 - 系统、App、Activity 启动过程

前言 最近准备更新 Android 面试必备基础知识系列,有兴趣的可以关注我的微信公众号 stormjun94,有更新时,第一时间会在微信公众号上面发布,同时,也会同步在 GitHub 上面更新,如果觉得对你有所帮助的话,请帮忙 star。 Android 面试必备 - http 与 https 协议 Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https) And...

徐公,微信公众号同名 3963

Android面试必备基础知识系列:System、App、Activity启动过程

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

2401_84123056的博客 719
上一篇: Android之assets资源目录的各种操作
下一篇: Android runtime机制(二)zygote进程的启动流程
dodod2012
博客等级 码龄15年 244粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值