Android系统启动流程(四)Launcher启动过程与系统启动流程
Android系统完整的启动过程

Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。
一、启动BootLoaderAndroid 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。
当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。
通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。
而Linux系统启动时:1)首先要加载BIOS的硬件信息,并获取第一个启动设备的代号2)读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。
3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。
…………在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。
二、加载系统内核Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。
当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
三、启动Init进程当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。
Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括:Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。
adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。
Android 开机启动流程

Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1)源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa)建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:ﻫframeworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefa ult().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
android启动流程

android启动流程Android启动流程:Android是一款广泛使用的移动操作系统,其启动流程是一个相对复杂的过程,涉及到多个模块的加载和启动。
下面将详细介绍Android的启动流程。
1、开机自检(Boot)当手机开机时,首先进行开机自检。
在这个阶段,系统会检测硬件设备的状态,包括电池是否齐全、屏幕是否正常等。
如果硬件设备通过了自检,系统将会开始启动。
2、引导加载程序(Bootloader)开机自检完成后,系统会加载引导加载程序(Bootloader)。
引导加载程序是硬件平台的一部分,其主要作用是启动操作系统。
在加载引导加载程序的过程中,系统会自动检测手机的存储器设备,确定存储设备中是否有可用的引导文件。
3、Linux内核加载一旦引导加载程序找到可用的引导文件,系统将会加载Linux内核。
Linux内核是Android系统的核心组件,负责管理内存、文件系统、驱动程序等。
4、文件系统加载一旦Linux内核加载完成,系统将会加载文件系统。
Android系统使用的是基于Linux的文件系统,在这个过程中,系统会加载并初始化各个文件系统,包括根文件系统、系统文件系统、数据文件系统等。
5、初始化进程(Init)一旦文件系统加载完成,系统将会启动初始化进程(Init)。
初始化进程是Android系统的第一个进程,其作用是启动系统的各个进程和服务。
6、启动用户空间(System Server)在初始化进程启动后,系统会启动用户空间,加载系统的用户界面等组件。
7、启动应用程序一旦用户空间加载完成,系统将会启动应用程序。
应用程序是Android系统的核心功能,包括系统应用程序和用户安装的应用程序。
系统应用程序包括电话、短信、浏览器等,而用户安装的应用程序则是用户根据自己的需求下载和安装的。
8、应用程序启动完成一旦应用程序启动完成,系统将进入正常运行状态,用户可以通过界面操作手机。
总结:Android系统的启动流程是一个复杂而严密的过程,经过开机自检、引导加载程序、Linux内核加载、文件系统加载、初始化进程、启动用户空间、启动应用程序等多个步骤,最终实现用户界面的显示和应用程序的运行。
安卓启动流程

安卓启动流程Android启动流程是指当我们按下手机开机键之后,系统如何进行初始化和加载应用程序等相关操作,最终完成系统的正常启动并进入主界面的过程。
下面将详细介绍Android启动流程的主要步骤。
1. 加电与引导当我们按下手机的开机键时,电源管理芯片开始提供电力供应并接通整个电路。
同时,电源管理芯片会发送信号给处理器引导启动系统。
2. 启动引导加载程序处理器接收到启动信号后,会加载引导加载程序(Bootloader)。
引导加载程序主要负责初始化硬件设备、加载系统内核等操作。
引导加载程序是嵌入式系统中运行的一段代码,它的作用是为系统加载内核和其他软件。
3. 加载内核引导加载程序会根据设备启动模式(Fastboot、Recovery或正常启动)来选择加载相应的内核。
内核是操作系统的核心,它负责管理和控制系统的硬件资源,提供各种功能的驱动程序,同时也会启动各种系统服务。
4. 初始化设备驱动在内核加载完成后,系统会初始化设备驱动程序。
设备驱动程序负责与硬件设备进行通信和控制,让硬件设备可以正确地与系统交互。
5. 启动init进程在设备驱动程序加载完毕后,系统会启动init进程。
init进程是Android系统中的第一个用户级进程,它的PID(Process ID)为1。
init进程负责启动和管理其他用户级进程,它通过读取init.rc配置文件来确定要启动的进程和服务。
6. 启动系统服务init进程会根据init.rc配置文件的指令,启动各种系统服务,例如Binder服务、Activity Manager服务、Window Manager服务等。
这些系统服务是Android系统的核心组件,负责管理应用程序的生命周期、绘制界面等功能。
7. Zygote进程与应用程序加载在系统服务启动完成后,init进程会启动Zygote进程。
Zygote进程是Android系统中的特殊进程,其作用是为应用程序提供应用程序运行环境(即Dalvik或ART虚拟机环境)。
android系统从systemserver开始的launcher启动详细流程

android系统启动流程——从systemserver开始的launcher目录1 概述: (2)2 systemserver工作内容分析 (4)2.1 SystemServer类简述 (4)2.2 ServerThread类简述 (4)3 ActivityManagerService工作内容分析 (6)3.1 ActivityManagerService之main (7)3.1.1创建ActivityManagerService实例 (7)3.1.2 创建ActivityThread实例,获取全局Context (8)3.1.3创建ActivityStackSupervisor实例 (10)3.1.4调用startRunning (10)3.2 ActivityManagerService之setSystemProcess (11)3.3. ActivityManagerService之setWindowManager (12)3.4 ActivityManagerService之systemready (12)3.4.1 启动所有Persistent属性的APK (13)3.4.2 启动launcher (14)4 ActivityStackSupervisor启动launcher (15)4.1首先回顾一下ActivityStackSupervisor实例的初始化 (15)4.2 进入ActivityStackSupervisor.resumeTopActivitiesLocked (16)4.3 进入ActivityStack.resumeTopActivityLocked (16)4.4 回到ActivityStackSupervisor.resumeHomeActivity。
(17)4.5 ActivityStackSupervisor.mProbeThread (17)4.6 ActivityStackSupervisor.mProbeHandler (18)4.7 回到ActivityManagerService.startHomeActivityLocked (18)4.8 ActivityStackSupervisor.startHomeActivity (19)4.9 ActivityStackSupervisor.startActivityUncheckedLocked (20)4.10 ActivityStack.startActivityLocked (21)4.11 ActivityStackSupervisor.resumeTopActivitiesLocked (22)4.12 ActivityStack.resumeTopActivityLocked (22)4.13 ActivityStackSupervisor.startSpecificActivityLocked (24)4.14 ActivityStackSupervisor.realStartActivityLocked (24)4.15 ActivityManagerService.startProcessLocked (25)5 Process类管理创建activity进程 (27)5.1 Process.start: (27)5.2Process.startViaZygote (28)5.3 zygoteSendArgsAndGetResult和openZygoteSocketIfNeeded (28)6 ActivityThread线程类分析 (30)6.1 ActivityThread.main分析 (30)6.1.1创建了looper对象和本线程绑定。
android启动流程

android启动流程Android启动流程。
Android系统启动流程是指Android设备在开机时,系统从无到有的整个启动过程。
了解Android启动流程对于开发者和系统维护者来说都是非常重要的,因此本文将对Android启动流程进行详细介绍。
1. 加电启动。
当用户按下设备的电源按钮时,电源管理芯片开始为设备供电,同时CPU开始执行启动代码。
此时,设备进入了启动阶段。
2. Bootloader启动。
在加电启动后,设备会首先运行Bootloader,Bootloader是设备的引导程序,负责初始化硬件并加载操作系统。
Bootloader会检查设备的硬件情况,然后加载操作系统内核。
3. 内核启动。
一旦Bootloader加载了操作系统内核,内核开始初始化设备的硬件,包括CPU、内存、外设等。
内核还会挂载根文件系统,并启动init进程。
4. init进程启动。
init进程是Android系统的第一个用户空间进程,它负责启动系统的其他进程和服务。
init进程会读取init.rc文件,根据文件中的配置启动系统服务和应用程序。
5. 系统服务启动。
在init进程启动后,系统服务会被依次启动。
这些系统服务包括SurfaceFlinger、Zygote、AMS(Activity Manager Service)、PMS(Package Manager Service)等,它们负责管理系统的各个方面,如界面显示、应用程序管理、包管理等。
6. Launcher启动。
当系统服务启动完成后,Launcher会被启动,用户可以看到设备的桌面界面。
Launcher是Android系统的桌面管理器,负责显示桌面、启动应用程序等功能。
7. 应用程序启动。
最后,用户可以通过桌面上的图标启动各种应用程序,进入到自己想要使用的应用程序中。
总结。
Android启动流程经历了Bootloader启动、内核启动、init进程启动、系统服务启动、Launcher启动和应用程序启动等步骤。
Android高级面试题

Android高级面试题(⭐⭐⭐)一、性能优化1、App稳定性优化1、你们做了哪些稳定性方面的优化?随着项目的逐渐成熟,用户基数逐渐增多,DAU持续升高,我们遇到了很多稳定性方面的问题,对于我们技术同学遇到了很多的挑战,用户经常使用我们的App 卡顿或者是功能不可用,因此我们就针对稳定性开启了专项的优化,我们主要优化了三项:•Crash专项优化(=>2)•性能稳定性优化(=>2)•业务稳定性优化(=>3)通过这三方面的优化我们搭建了移动端的高可用平台。
同时,也做了很多的措施来让App真正地实现了高可用。
2、性能稳定性是怎么做的?•全面的性能优化:启动速度、内存优化、绘制优化•线下发现问题、优化为主•线上监控为主•Crash专项优化我们针对启动速度,内存、布局加载、卡顿、瘦身、流量、电量等多个方面做了多维的优化。
我们的优化主要分为了两个层次,即线上和线下,针对于线下呢,我们侧重于发现问题,直接解决,将问题尽可能在上线之前解决为目的。
而真正到了线上呢,我们最主要的目的就是为了监控,对于各个性能纬度的监控呢,可以让我们尽可能早地获取到异常情况的报警。
同时呢,对于线上最严重的性能问题性问题:Crash,我们做了专项的优化,不仅优化了Crash的具体指标,而且也尽可能地获取了Crash发生时的详细信息,结合后端的聚合、报警等功能,便于我们快速地定位问题。
3、业务稳定性如何保障?•数据采集 + 报警•需要对项目的主流程与核心路径进行埋点监控,•同时还需知道每一步发生了多少异常,这样,我们就知道了所有业务流程的转换率以及相应界面的转换率•结合大盘,如果转换率低于某个值,进行报警•异常监控 + 单点追查•兜底策略移动端业务高可用它侧重于用户功能完整可用,主要是为了解决一些线上一些异常情况导致用户他虽然没有崩溃,也没有性能问题,但是呢,只是单纯的功能不可用的情况,我们需要对项目的主流程、核心路径进行埋点监控,来计算每一步它真实的转换率是多少,同时呢,还需要知道在每一步到底发生了多少异常。
Android系统(Launcher)

本文将详细分析Launcher应用程序的启动过程。
Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer 组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:点击查看大图下面详细分析每一个步骤。
Step 1. SystemServer.main这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 1。
Step 2. SystemServer.init1这个函数是一个JNI方法,实现在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 2。
Step 3. libsystem_server.system_init函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android系统启动流程(四)Launcher 启动过程与系统启动流程前言此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇文章的内容来讲解Android系统启动流程。
建议读这篇文章前要通读本系列的前三篇文章,否则你可能不会理解我在讲什么。
uncher概述Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已经安装的应用程序,这个Home应用程序就叫做Launcher。
应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
uncher启动流程SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService 启动后会将系统中的应用程序安装完成。
在此前已经启动的ActivityManagerService会将Launcher启动起来。
启动Launcher的入口为ActivityManagerService的systemReady函数,如下所示。
frameworks/base/services/Java/com/android/server/SystemServer.javaprivate void startOtherServices() {...mActivityManagerService.systemReady(new Runnable() {@Overridepublic void run() {Slog.i(TAG, "Making services ready");mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);...}...}在startOtherServices函数中,会调用ActivityManagerService的systemReady函数:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic void systemReady(final Runnable goingCallback) {...synchronized (this) {...mStackSupervisor.resumeFocusedStackTopActivityLocked();mUserController.sendUserSwitchBroadcastsLocked(-1, currentUserId);}}systemReady函数中调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked 函数:frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.javaboolean resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) { if (targetStack != null && isFocusedStack(targetStack)) {return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);//1 }final ActivityRecord r = mFocusedStack.topRunningActivityLocked();if (r == null || r.state != RESUMED) {mFocusedStack.resumeTopActivityUncheckedLocked(null, null);}return false;}在注释1处会调用ActivityStack的resumeTopActivityUncheckedLocked函数,ActivityStack 对象是用来描述Activity堆栈的,resumeTopActivityUncheckedLocked函数如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStack.javaboolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) { if (mStackSupervisor.inResumeTopActivity) {// Don't even start recursing.return false;}boolean result = false;try {// Protect against recursion.mStackSupervisor.inResumeTopActivity = true;if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEA VING) {mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;mService.updateSleepIfNeededLocked();}result = resumeTopActivityInnerLocked(prev, options);//1} finally {mStackSupervisor.inResumeTopActivity = false;}return result;}注释1调用了resumeTopActivityInnerLocked函数:private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { ...return isOnHomeDisplay() &&mStackSupervisor.resumeHomeStackTask(returnTaskType, prev, "prevFinished");...}resumeTopActivityInnerLocked函数的代码很长,我们截取我们要分析的关键的一句:调用ActivityStackSupervisor的resumeHomeStackTask函数,代码如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.javaboolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) { ...if (r != null && !r.finishing) {mService.setFocusedActivityLocked(r, myReason);return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null);}return mService.startHomeActivityLocked(mCurrentUser, myReason);//1}在注释1处调用了ActivityManagerService的startHomeActivityLocked函数,如下所示。
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javaboolean startHomeActivityLocked(int userId, String reason) {if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL&& mTopAction == null) {//1return false;}Intent intent = getHomeIntent();//2ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);if (aInfo != null) {intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, ));aInfo = new ActivityInfo(aInfo);aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);ProcessRecord app = getProcessRecordLocked(aInfo.processName,aInfo.applicationInfo.uid, true);if (app == null || app.instrumentationClass == null) {//3intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);mActivityStarter.startHomeActivityLocked(intent, aInfo, reason);//4}} else {Slog.wtf(TAG, "No home screen found for " + intent, new Throwable());}return true;}注释1处的mFactoryTest代表系统的运行模式,系统的运行模式分为三种,分别是非工厂模式、低级工厂模式和高级工厂模式,mTopAction则用来描述第一个被启动Activity组件的Action,它的值为Intent.ACTION_MAIN。