Android 系统启动

Android系统启动流程源码解析 当Android手机从按下开机键时,屏幕点亮,到系统桌面的显示,整个过程系统是怎么启动的?下面我们一起深入源码来看一下。 阅读详情

Android系统从Linux内核启动后分为4个基本步骤:

(1) init进程启动
(2) Native服务启动
(3) System Server,Android服务启动
(4) Home启动

后面的内容都是在上面几个大部分做的分析!

          

一、init进程(system\core\init\init.c)

init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程。

Init.rc
Init.marvel.rc
Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
 servicemanamger
 zygote
 。。。
最后Init并不退出,而是担当起property service的功能。

1.1脚本文件
Init.c: parse_config_file(Init.rc)
   @parse_config_file(Init.marvel.rc)

解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)

Init.rc是Android自己规定的初始化脚本(Android Init Language, System/Core/Init/readme.txt)
该脚本包含四个类型的声明:

Commands       命令
Actions        动作
Triggers       触发
Services       服务
Options        选项
Propertise     属性

1.2 服务启动机制
我们来看看Init是这样解析.rc文件开启服务的。
(1)打开.rc文件,解析文件内容@ system\core\init\init.c
将service信息放置到service_list中。@ system\core\init parser.c
(2)restart_service()@ system\core\init\init.c
 service_start
 execve(…).建立service进程。

二、zygote

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

zygote主要经过其下几个过程:
registerZygoteSocket();//登记Listen端口
startSystemServer();
进入Zygote服务框架。
经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。
三、SystemServer

(frameworks/base/service/java/com/android/server/SystemServer.java)
 pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids, debugFlags, null);
在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。
main() @ com/android/server/SystemServer
{
init1();
}

四、init1 

Init1()是在Native空间实现的(com_andoird_server_systemServer.cpp)。我们一看这个函数就知道了,init1->system_init()
frameworks/base/cmds/system_server/library/System_init.cpp

在system_init()我们看到了循环闭合管理框架。
{        // Start the AudioFlinger  
        // Start the media playback service     
        // Start the camera service  
        // Start the audio policy service
Call "SystemServer.java", "init2"
runtime->callStatic("com/android/server/SystemServer", "init2");
…..
ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}
public static final void init2() {
        Log.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
}

五、init2

init2()@SystemServer.java中建立了Android中所有要用到的服务。这个init2()建立了一个线程,来New Service和AddService来建立服务

public void run() {
// Critical services...
power = new PowerManagerService();
            ServiceManager.addService(Context.POWER_SERVICE, power);
    battery = new BatteryService(context);
                ServiceManager.addService("battery", battery);
ServiceManager.addService(Context.WINDOW_SERVICE, wm);

    (ActivityManagerService)ServiceManager.getService("activity"))
                .setWindowManager(wm);
    if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
        try {
    connectivity = ConnectivityService.getInstance(context);
                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);

                 //后文Android WIFI框架分析(1) 有相关
     Log.i(TAG, "Search Service");
                ServiceManager.addService( Context.SEARCH_SERVICE, new SearchManagerService(context) );
        }
    }
}

六、Home Activity

在ServerThread@SystemServer.java后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:
(1) 使用xxx.systemReady()通知各个服务,系统已经就绪。
(2) 特别对于ActivityManagerService.systemReady(回调)
Widget.wallpaper,imm(输入法)等ready通知。

Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是ActivityManagerService.systemReady()的伪代码:
systemReady()@ActivityManagerService.java
resumeTopActivityLocked()
startHomeActivityLocked();//如果是第一个则启动HomeActivity
startActivityLocked(。。。)CATEGORY_HOME


Android系统启动出现的 “安卓正在启动...” 界面的问题 Android系统启动出现的 “安卓正在启动...” 界面的问题目前安卓很多产品,开机没有解锁界面。开机过程中会出现“安卓正在启动...” 界面的问题。原因是FallbackHome机制导致。不同硬件耗时不同。对开机启动时间不做要求的,解决这个问题的方法很多。本文主要介绍解决该问题,并优化这部分耗时的办法。同时简单介绍其他几种,对安卓系统启动时间不做要求的办法。 阅读详情

相关推荐

QMT与通达信代码实战:从预警到交易的自动化实现

本文详细介绍了如何利用QMT量化交易平台与通达信软件实现从预警到交易的全自动化。通过读取通达信预警生成的板块文件,QMT策略可自动执行买卖指令,有效解决手动交易滞后问题。文章提供了完整的代码框架、核心原理拆解及实盘注意事项,帮助投资者构建高效、纪律性的自动化交易系统。

ansible6ops的博客 648

Android 12 S 系统开机流程分析-FirstStageMain(一)

开机启动流程 init加载流程

weixin_41028555的博客 1810

Fleury算法寻找欧拉回路(mtlab代码详解)

【代码】Fleury算法寻找欧拉回路(mtlab代码详解)

m0_63449998的博客 1295

Android开机全解析

对于任何操作系统来讲,开机时间的优化都是一个很关键的工作。如果用户每次启动设备都需要等待很长的时间,那么其用户体验是很差的。本文从Android12出发,分以下三部分阐述Android系统的开机优化:Android开机过程分析开机时间开机速度优化实践备注1. 文中所有的代码都省略了无关部分,并且省略了省略号;2. 由于作者能力有限,难免会有不正确或者不完善的地方。欢迎大家指正。1. Android...

Android技术之家 2040

FIFO的工作原理及其设计

FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。对于单片FIFO来说,主要有两种结构:触发导向结构和零导向传输结构。触发导向传输结构的FIFO是由寄存器阵列构成的,零导向传输结构的FIFO是由具有读和写地址指针的双口RAM构成。FIFO与普通RAM存储器的是没有外部读写地址线(指针),使用方便,但。

Jackiezhang1993的博客 2万+

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 621

Android开机启动流程简析

在学习Android过程中开机启动是必要了解的,在这里我主要谈一谈我所学习的看法和经验,可能总结的不到位,一起交流一下

bosswcz的博客 7100

PWM调节DCDC参数计算原理

SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。

电子绿洲的博客 3158

Android启动原理解析

当谈到Android启动原理时,我们进入了Android操作系统的核心。理解Android系统启动的原理对于开发者来说非常重要,因为这有助于优化应用程序性能并提供更好的用户体验。Linux内核启动Android设备的启动过程始于加载Linux内核。这个内核是整个Android系统的核心,负责管理硬件资源、提供系统级服务以及...

weixin_36715531的博客 205

VxWorks环境搭建与学习:vxworks6.8和workbench3.2

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

qq_41854911的博客 8468

无需SLAM建图,直接生成Gazebo仿真环境的二维代价地图的功能包pgm_map_creator适配ROS Noetic编译报错及解决方法

在ROS Noetic中,使用`pgm_map_creator`功能包直接生成Gazebo仿真环境的二维代价地图时,可能会遇到各种编译和运行错误。本篇博客详细解析了在适配ROS Noetic过程中常见的报错及其解决方法,包括Boost文件结构更新、C++版本兼容性、Gazebo函数名变更、链接库缺失以及protobuf文件加载错误。通过逐步排查和修改,如更换头文件路径、调整C++标准、更新CMakeLists.txt文件等,成功解决了这些问题,使得`pgm_map_creator`功能包能够顺利编译和运行。

慕羽★的博客 2261

Android 系统启动到 APP 运行原理 —— 中级安卓开发工程师进阶必看

Android系统架构分为五层:应用层、框架层、本地库层、HAL层和内核层。系统启动流程包括Bootloader加载内核、Init进程启动Zygote、SystemServer初始化核心服务,最终启动Launcher。应用启动时,AMS通过Zygote孵化新进程,完成Activity初始化和界面渲染。系统运行时包含1个Binder驱动、1个ServiceManager进程,以及Zygote、SystemServer等核心进程。AIDL通过自动生成Stub和Proxy类实现跨进程通信,客户端通过transac

da_ma_dai的博客 1419

基于YOLOv11的建筑图纸物体检测系统设计与实现

包含多种建筑平面图,标注了墙体、门窗等元素:CAD格式的建筑图纸数据集:专门针对建筑元素的标注数据集自定义数据集:使用LabelImg等工具自行标注的建筑图纸本文以FloorPlanDataset为基础,结合部分自定义标注数据构建混合数据集。wall (墙体)door (门)window (窗)stair (楼梯)furniture (家具)text (文字标注)dimension (尺寸标注)column (柱子)

YOLO 536

Android系统启动流程

在此说明,此文章只是个人的一个关于“Android系统启动流程”的一个总结,没什么源码。 Android系统启动流程: 1、启动电源以及系统启动: 当电源键按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行。 2、引导程序BootLoader: 引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主...

shaoenxiao的博客 2万+

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android系统启动过程-uBoot+Kernel+Android

本文是参考大量网上资源在结合自己查看源代码总结出来的,让自己同时也让大家加深对Android系统启动过程有一个更加深入的了解!再次强调,本文的大多数功劳应归功于那些原创者们,同时一些必要的参考链接我会一一附上。注:由于本人采用Exynos4412开发板学习,所以本文大部分资料都是基于此处理器的简介:对于整个Android系统的启动总的来说分为三个阶段:BootLoader引导即uBoot.binlinux内核启动即zImageAndroid系统启动即ramdisk.img与system.img。

domen_pan的博客 3078

visio安装包

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

android系统启动过程

的实现,可以深入理解 Android 启动流程的控制逻辑,并为定制系统行为(如添加新服务、修改启动顺序)提供技术基础。:SystemServer 完成服务启动后发送 BOOT_COMPLETED 广播。是用户空间的第一个进程(PID=1),解析。:内核完成系统启动,初始化系统服务和驱动。触发器启动 Zygote 进程。创建子进程并执行二进制文件。执行early-init阶段。脚本,管理服务生命周期。执行late-init阶段。加载SELinux策略。内核启动init进程。进入无限循环处理事件。

inquisiter 1294

Android系统启动流程分析

title: Android系统启动流程分析 date: 2021-09-27 23:35:00 tags: - 系统启动 - Android - Framework categories: Framework keywords: ‘Android,系统启动,Framework’ description: 此笔记记录分析Android系统启动过程的分析。 cover: https://upload-images.jianshu.io/upload_images/13838098-709a95ad43e71.

u010248147的博客 5694

【Android】系统启动流程(简介)

Android系统启动流程

水w的博客 1940

【Framework】Android系统启动优化总结

本文总结Android系统开机启动优化的七个关键阶段及具体措施:1)Bootloader阶段优化外设初始化;2)Kernel阶段精简内核配置;3)Init.rc阶段分阶段启动服务;4)Zygote阶段延迟非关键资源加载;5)SystemServer阶段异步启动服务;6)Launcher阶段预加载应用;7)Application阶段针对性优化。主要手段包括裁剪APK/服务/传感器、配置优化、删除开机动画、调整CPU调度策略等,通过全链路优化缩短启动时间。

ZyElite 1548

Android系统启动:

创建和挂载启动需要的文件目录。初始化和启动属性服务。解析init.rc配置文件并且启动Zygote进程。调用runtime的start函数启动Zygote。创建Java虚拟机并且为Java虚拟机注册JNI方法。通过JNI调用ZygoteInit的main方法进入zygote的Java框架层。通过registerServerSocket方法创建一个server端的socket;并且通过runSelectLoop方法来等待AMS请求创建新的应用程序进程。

weixin_74399377的博客 177

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

Android系统启动过程剖析

init_parse_config_fileàparse_configà parse_new_sectionàparse_service (或者parse_action)-> parse_line_service(或者parce_line_action)(3) 触发需要执行的action:Action需要在Triggers(触发条件)中调用,本阶段对需要执行的Action进行触发,并根据触发条件将需要执行的Action放入Action队列;函数间的调用执行关系使用“à”表示)

2401_89689756的博客 1888

Android OS —— 系统启动之init.rc文件分析笔记

init.rc中的语言称为android init language,详细的

L_Nan的专栏 799
上一篇: wifi学习
下一篇: Android.mk的基础知识
karry_vcent
博客等级 码龄15年 93粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值