Android启动流程

安卓开机启动流程 安卓手机启动流程 阅读详情
本文章转载来自:http://blog.youkuaiyun.com/qianjin0703/article/details/8468312

1. init进程

2. zygote进程

2.1 AndroidRuntime

2.2 ZygoteInit

3. system_server进程

3.1 init1阶段

3.2 init2阶段


接着Linux启动部分 http://blog.youkuaiyun.com/qianjin0703/article/details/6881107

1. init进程


系统在内核空间初始化进程,内存,文件系统,驱动模块之后,调用init_post()函数,开启第一个用户进程init,进入用户空间。

/kernel/init/main.c (仅截取部分重要代码)

[plain]  view plain copy
  1. static noinline int init_post(void)  
  2. {  
  3.   
  4.     run_init_process("/sbin/init");  
  5.     run_init_process("/etc/init");  
  6.     run_init_process("/bin/init");  
  7.     run_init_process("/bin/sh");  
  8. }  

终端下查看1号进程,


可见,init是系统守护进程和zygote的父进程。

/system/core/init/init.c 

[plain]  view plain copy
  1. int main(int argc, char **argv)  
  2. {  
  3.   
  4.     mkdir("/dev", 0755);  
  5.     mkdir("/proc", 0755);  
  6.     mkdir("/sys", 0755);  
  7.   
  8.     mount("devpts", "/dev/pts", "devpts", 0, NULL);  
  9.     mount("proc", "/proc", "proc", 0, NULL);  
  10.     mount("sysfs", "/sys", "sysfs", 0, NULL);  
  11.   
  12.     open_devnull_stdio();  
  13.     klog_init();  
  14.     property_init();  
  15.   
  16.     get_hardware_name(hardware, &revision);  
  17.     process_kernel_cmdline();  
  18.   
  19.     init_parse_config_file("/init.rc");  
  20.     action_for_each_trigger("early-init", action_add_queue_tail);  
  21.   
  22.     queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");  
  23.     queue_builtin_action(keychord_init_action, "keychord_init");  
  24.     queue_builtin_action(console_init_action, "console_init");  
  25.     action_for_each_trigger("init", action_add_queue_tail);  
  26.   
  27.     for(;;) {  
  28.   
  29.         execute_one_command();  
  30.         restart_processes();  
  31.   
  32.         nr = poll(ufds, fd_count, timeout);  
  33.   
  34.         for (i = 0; i < fd_count; i++) {  
  35.             if (ufds[i].revents == POLLIN) {  
  36.                 if (ufds[i].fd == get_property_set_fd())  
  37.                     handle_property_set_fd();  
  38.                 else if (ufds[i].fd == get_keychord_fd())  
  39.                     handle_keychord();  
  40.                 else if (ufds[i].fd == get_signal_fd())  
  41.                     handle_signal();  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     return 0;  
  47. }  
init进程归纳如下
  • 解析init.rc和init.*.rc
  • 挂载文件系统,建立文件夹和文件,设置权限,为一些文件写入初值
  • 初始化property属性
  • 启动系统守护进程如adbd, vold, rild等
  • 启动zygote进程



2. zygote进程

zygote既是Android系统创建java世界的盘古,又是繁殖system_server和所有应用程序的女娲。

终端下查看zygote进程,


2.1 AndroidRuntime

/frameworks/base/cmds/app_process/app_main.cpp

[cpp]  view plain copy
  1. int main(int argc, const char* const argv[])  
  2. {  
  3.   
  4.     AppRuntime runtime;  
  5.   
  6.     if (zygote) {  
  7.         runtime.start("com.android.internal.os.ZygoteInit",  
  8.                 startSystemServer ? "start-system-server" : "");  
  9. }  
AppRuntime是从AndroidRuntime类派生的,最后由runtime.start()进入Java世界。

/frameworks/base/core/jni/AndroidRuntime.cpp

[cpp]  view plain copy
  1. void AndroidRuntime::start(const char* className, const char* options)  
  2. {  
  3.   
  4.     /* start the virtual machine */  
  5.     JNIEnv* env;  
  6.     if (startVm(&mJavaVM, &env) != 0) {  
  7.         return;  
  8.     }  
  9.     onVmCreated(env);  
  10.   
  11.     /* 
  12.      * Register android functions. 
  13.      */  
  14.     if (startReg(env) < 0) {  
  15.         ALOGE("Unable to register all android natives\n");  
  16.         return;  
  17.     }  
  18.   
  19.     /* 
  20.      * Start VM.  This thread becomes the main thread of the VM, and will 
  21.      * not return until the VM exits. 
  22.      */  
  23.     char* slashClassName = toSlashClassName(className);  
  24.     jclass startClass = env->FindClass(slashClassName);  
  25.   
  26.     jmethodID startMeth = env->GetStaticMethodID(startClass, "main",  
  27.             "([Ljava/lang/String;)V");  
  28.   
  29.     env->CallStaticVoidMethod(startClass, startMeth, strArray);  
  30.   
  31. }  

-> 创建虚拟机

注意这里会设置虚拟机的heapsize,默认16M,一般32M,不能太小,否则在操作大尺寸图片时无法分配所需内存。

-> 注册jni函数

这里注册了本地方法,这些方法最终被编译进动态链接库libandroid_runtime.so,供上层Java调用。

[cpp]  view plain copy
  1. static const RegJNIRec gRegJNI[] = {  
  2.     REG_JNI(register_android_debug_JNITest),  
  3.     REG_JNI(register_com_android_internal_os_RuntimeInit),  
  4.     REG_JNI(register_android_os_SystemClock),  
  5.     REG_JNI(register_android_util_Log),  
  6.     REG_JNI(register_android_os_Process),  
  7.     REG_JNI(register_android_os_SystemProperties),  
  8.     REG_JNI(register_android_os_Binder),  
  9.     REG_JNI(register_android_view_Display),  
  10.     REG_JNI(register_android_graphics_Bitmap),  
  11.     REG_JNI(register_android_graphics_Camera),  
  12.     REG_JNI(register_android_database_SQLiteDatabase),  
  13.     REG_JNI(register_android_os_Power),  
  14.     REG_JNI(register_android_os_StatFs),  
  15.     REG_JNI(register_android_net_NetworkUtils),  
  16.     REG_JNI(register_android_nfc_NdefMessage),  
  17.     REG_JNI(register_com_android_internal_os_ZygoteInit),  
  18.     REG_JNI(register_android_hardware_Camera),  
  19.     REG_JNI(register_android_hardware_SensorManager),  
  20.     REG_JNI(register_android_hardware_UsbDevice),  
  21.     REG_JNI(register_android_media_AudioRecord),  
  22.     REG_JNI(register_android_media_AudioSystem),  
  23.     REG_JNI(register_android_media_AudioTrack),  
  24.     REG_JNI(register_android_opengl_classes),  
  25.     REG_JNI(register_android_bluetooth_BluetoothSocket),  
  26.     REG_JNI(register_android_server_BluetoothService),  
  27.   
  28.     REG_JNI(register_android_app_ActivityThread),  
  29.     REG_JNI(register_android_app_NativeActivity),  
  30.     REG_JNI(register_android_view_InputChannel),  
  31.     REG_JNI(register_android_view_InputQueue),  
  32.     REG_JNI(register_android_view_KeyEvent),  
  33.     REG_JNI(register_android_view_MotionEvent),  
  34.     REG_JNI(register_android_view_PointerIcon),  
  35.   
  36. };  


2.2 ZygoteInit

/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

[java]  view plain copy
  1. public static void main(String argv[]) {  
  2.     try {  
  3.         SamplingProfilerIntegration.start();  
  4.   
  5.         registerZygoteSocket();  
  6.   
  7.         preload();  
  8.   
  9.         SamplingProfilerIntegration.writeZygoteSnapshot();  
  10.   
  11.         if (argv[1].equals("start-system-server")) {  
  12.             startSystemServer();  
  13.         }   
  14.   
  15.             runSelectLoopMode();  
  16.   
  17.         closeServerSocket();  
  18.     }   
  19. }  

-> 建立服务端Socket

zygote及系统中其他程序的通信没有使用Binder,而是采用了基于AF_UNIX类型的Socket.

-> 预加载类和资源

预加载的类可以在 /frameworks/base/preloaded-classes 查看。预加载的资源生成framewrok-res.apk,主要是一些图标,刷机达人经常修改它。

-> 启动system_server进程

zygote进程fork出system_server子进程,把任务繁重的系统服务全部托管出去,自己负责循环监听所有应用程序的请求。

-> 等待应用程序的请求

zygote通过runSelectLoopMode()处理应用程序客户端的请求,由ZygoteConnection的runOnce()孵化出新的应用程序。


综上所述,zygote进程归纳如下

  • 创建虚拟机
  • 注册jni函数
  • 预加载类和资源
  • 启动system_server进程
  • 监听应用程序请求


3. system_server进程

/frameworks/base/services/java/com/android/SystemServer.java

[java]  view plain copy
  1. public static void main(String[] args) {  
  2.   
  3.     System.loadLibrary("android_servers");  
  4.     init1(args);  
  5. }  
3.1 init1阶段
加载libandriod_server.so库,实现init1

/frameworks/base/cmds/system_server/library/system_init.cpp

[cpp]  view plain copy
  1. extern "C" status_t system_init()  
  2. {  
  3.   
  4.     sp<GrimReaper> grim = new GrimReaper();  
  5.     sm->asBinder()->linkToDeath(grim, grim.get(), 0);  
  6.   
  7.     char propBuf[PROPERTY_VALUE_MAX];  
  8.     property_get("system_init.startsurfaceflinger", propBuf, "1");  
  9.     if (strcmp(propBuf, "1") == 0) {  
  10.         // Start the SurfaceFlinger  
  11.         SurfaceFlinger::instantiate();  
  12.     }  
  13.   
  14.     property_get("system_init.startsensorservice", propBuf, "1");  
  15.     if (strcmp(propBuf, "1") == 0) {  
  16.         // Start the sensor service  
  17.         SensorService::instantiate();  
  18.     }  
  19.   
  20.     AndroidRuntime* runtime = AndroidRuntime::getRuntime();  
  21.   
  22.     jclass clazz = env->FindClass("com/android/server/SystemServer");  
  23.     jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");  
  24.     env->CallStaticVoidMethod(clazz, methodId);  
  25.   
  26.     return NO_ERROR;  
  27. }  


3.2 init2阶段

init2回到Java层,启动一个ServerThread线程,启动系统的各项服务。

Android Framework学习——安卓系统启动流程(Android 13) 提示:本文仅作个人学习记录,禁止转载无论是安卓应用开发,还是安卓framework开发,在面试中总是会被问到framework相关的知识,系统启动流程已然成为高频提问点之一,以前对系统启动流程的认识停留在其他人口口相传、博客上的简要总结及流程图,接下来我将根据源码主要流程进行梳理,总结安卓系统启动这一过程的主要步骤。因为关注的重点是Java API Framework层的流程(如下图绿色部分),所以在这之前的流程会简略概括。在关机状态长按电源键,引导芯片程序(固化在rom中)开始运行; 阅读详情

相关推荐

Android Framework学习——安卓进程启动流程(Android 13)

进程是作为应用程序容器存在的,每个应用启动前需要先创建一个进程,进程是由Zygote进程孵化来的,它拥有独立的资源空间,用来运行四大组件,大部分应用运行在一个进程上,部分应用如微信、支付宝等运行在多个进程上,比如微信小程序就是一个子进程。未完待续。

qq_31190665的博客 1563

android runtime.exec 权限,Runtime.getRuntime().exec获取root权限,并执行命令

public String execRootCmd(String cmd) {String result = "";DataOutputStream dos = null;DataInputStream dis = null;try {Process p = Runtime.getRuntime().exec("su");// 经过Root处理的android系统即有su命令dos = new D...

weixin_42628573的博客 3642

PPO(Proximal Policy Optimization)算法原理及实现,详解近端策略优化

接着上面的讲,PG方法一个很大的缺点就是参数更新慢,因为我们每更新一次参数都需要进行重新的采样,这其实是中on-policy的策略,即我们想要训练的agent和与环境进行交互的agent是同一个agent;与之对应的就是off-policy的策略,即想要训练的agent和与环境进行交互的agent不是同一个agent,简单来说,就是拿别人的经验来训练自己。举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的。

weixin_41106546的博客 9万+

Android Runtime.getRuntime().exec() 使用方法

Android 可以通过Runtime.getRuntime().exec()方法来执行命令或者创建进程。 1. Runtime.getRuntime().exec共有六个重载方法: public Process exec(String command) 在单独的进程中执行指定的字符串命令。 public Process exec(String [] cmdArra

我的专栏 3万+

Android自动化新方案:ESP32-C3蓝牙HID模拟触控与手势操作实战(附源码)

本文详细介绍了使用ESP32-C3通过蓝牙HID协议实现Android设备自动化操作的完整方案。该硬件方案成本低廉且能完美规避系统风控,可模拟鼠标移动、点击及复杂手势操作,延迟低于50毫秒,适用于游戏连招和应用测试等场景。文章包含完整的源码实现和性能优化技巧。

kotlin6android的博客 377

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 454

android runtime虚拟机,zygote分析--AndroidRuntime::start()

AndroidRuntime.cpp的路径为/frameworks/base/core/jni/AndroidRuntime.cpp在上一篇文章中分析了app_main.cpp,得到app_main.cpp的main()方法最终调用了AndroidRuntime的start()方法(runtime为apptime类型的对象,apptime继承了androidruntime的start方法)。run...

weixin_39824834的博客 720

YOLOv11改进 | 注意力篇 | YOLOv11引入CBAM注意力机制

我们的实验表明各种模型的分类和检测性能得到了一致的改进,证明了 CBAM 的广泛适用性。简单介绍:CBAM的主要思想是通过关注重要的特征并抑制不必要的特征来增强网络的表示能力。模块首先应用通道注意力,关注"重要的"特征,然后应用空间注意力,关注这些特征的"重要位置"。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 2万+

Android 安卓启动流程

android

u010783226的专栏 3700

用 ADT 的 RAP Generator 把 RAP 栈一键搭起来:从表到可预览的 OData V4 应用

摘要 SAP RAP Generator 工具能显著提升开发效率,通过一键生成从数据库表到完整 OData UI Service 的全套对象(包括 CDS、Behavior、Service Definition 等)。该工具特别适用于原型验证和标准化应用开发,可节省 60% 以上的基础编码时间。使用时需注意: 表设计需包含关键管理字段(如 last_changed 时间戳) 向导配置决定分层架构和命名规范 生成结果包含可立即预览的 Fiori Elements 界面 后续可专注于业务逻辑增强(校验、权限等)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1280

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

摘要: 本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理,通过滑模观测器估算反电动势,结合PLL抑制抖振;2)系统架构,替代编码器信号;3)Simulink建模流程,涵盖Clarke变换、SMO离散化实现、PLL设计等关键步骤;4)参数整定指南和工程实践要点,如启动策略和故障处理。该方法具有成本低、可靠性高的优势,适用于家电、电动车等场景,仿真结果显示角度误差±5°,速度动态跟随良好。文章还提供了调试建议和常见问题解决方案。

MHD0815的博客 137

Android开机底层流程,安卓系统启动流程

长按电源键,屏幕上出现了android的字样,过了一会出现了桌面程序。这一整个流程在安卓系统中是怎么实现的?通过这篇文章,希望你能大致了解一下安卓系统的启动流程,也希望我能牢牢记住。安卓系统分层安卓系统从上到下分为四层:应用层,应用程序框架层,系统运行库层和linux内核层。我们先了解一下各个层的功能。image.pngLinux内核层安卓系统的核心是Linux2.6内核,在原有Linux内核的基...

weixin_39826342的博客 293

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

LuciferLiu_DBA 2191

安卓系统全流程启动

本文详细解析了安卓系统的全流程启动过程,从安全世界与非安全世界的组件层级关系出发,完整描述了从硬件上电到安卓应用启动的全链路流程。系统启动分为六个阶段:ATF安全启动链、OP-TEE初始化、LK引导程序启动、Linux内核加载、安卓框架启动以及应用程序运行。同时阐述了安卓应用与安全世界(OP-TEE)的通信机制,通过SMC调用实现安全服务。整个流程实现了从硬件信任根到用户应用的安全启动链,确保了系统各层级的安全隔离与协作。

weixin_45783574的博客 1311

手把手教你学Simulink——基于传统电网建模与稳定性分析的场景实例:基于同步发电机的单机无穷大系统建模与稳定性分析

本文详细介绍了使用MATLAB/Simulink进行单机无穷大系统(SMIB)建模与稳定性分析的方法。教程从系统结构设计入手,包含同步发电机、输电线路、无穷大母线等核心模块的建模步骤和参数配置示例。重点讲解了七个关键步骤:项目创建、模块配置、控制系统集成、负载添加(可选)以及仿真运行与结果分析,并提供了具体的MATLAB代码示例。最后通过性能评估指标(功角差、电压跌落、频率偏差)分析系统稳定性,为电力系统动态特性研究提供了实用指导,强调准确参数设置对仿真结果的重要性。

MHD0815的博客 298

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【安卓逆向系列】安卓的启动流程

【最后步骤很关键,重新启动init的过程也讲加载的权限进一步降低,在整个第一阶段都是以权限极高的kernel执行,转化为init域后权限降低,更为安全,这个就是SELinux安全策略的作用】主要的功能是设置了虚拟机的参数,利用了很多的parseRuntimeOption函数(对于不同的软硬件环境,函数的参数往往需要调整、优化,从而使系统达到最佳性能)所有的app进程都是由zygote进程fork而来的。进程(翻译为受精卵,此进程也称为安卓的应用进程孵化器,是所有应用进程的父进程)对于此孵化进程,他会加载。

xianyu_yuan的博客 1318

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

安卓APP应用启动流程详解

Android 应用启动流程详解

一个踩这七色彩虹的路人甲 7817

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jre9下载 jdk9

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

Android/安卓启动流程

1、电源及系统启动 当用户按下电源准备开机时,固化在ROM固定位置的引导芯片代码开始执行,加载引导程序BootLoader到RAM并执行。 开机,开机就是给系统开始供电,此时硬件电路会产生一个确定的复位时序,保证CPU是最后一个被复位的器件,为什么CPU要最后被复位呢?因为,如果CPU第一个被复位,则当CPU复位后开始运行时,其他硬件内部的寄存器状态可能还没有准备好,比如磁盘或者内存,那么久...

编程哲学家的专栏 332

安卓指纹启动流程

本文主要基于Android10.0系统开源代码介绍指纹识别模块的整体架构和启动流程。一.指纹识别整体框架结合上图,Android系统的指纹识别软件上主要分成4层:应用层:应用开发者调用AO...

内核工匠 3479

安卓启动流程

1 启动流程概述 Android 启动流程跟 Linux 启动类似,大致分为如下五个阶段。 1.开机上电,加载固化的ROM。 2.加载BootLoader,拉起Android OS。 3.加载Uboot,初始外设,引导Kernel启动等。 4.启动Kernel,加载驱动,硬件。 5.启动Android,挂载分区,加载驱动、服务,init 进程等。 2. 了解安卓Runtime 运行时 Android5.0(API 21)以上,每个应用都运行在自己的进程中,有其自己的Android Runtim

mike_jungle的博客 403

安卓app启动流程分析

从技术层面讲,如果要启动一个安卓app,首先需要触发启动过程,然后再分配系统资源,最后才启动要打开的app组件。本文我来对安卓系统app启动流程进行分析,对于应用开发、系统定制以及性能优化人员来说,熟悉应用启动流程会使你们在今后的工作中更加得心应手,做到知其然,知其所以然。在对安卓app启动流程分析过程中,必定是需要用到监测工具的,我推荐大家使用友盟+U-APM这款app性能监测工具,它的后台对于异常的查询速度是非常快的,使用起来非常方便。 启动App流程 用户点击Home上的一个App图标, 启动一个

资讯汇 600
上一篇: centos 安装gcc4.8
下一篇: Linux 十六进制编辑二进制文件
Linux_木头
博客等级 码龄17年 11粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值