Android桌面启动过程
Android之Activity启动流程详解(基于api28)

Android之Activity启动流程详解(基于api28)前⾔Activity作为Android四⼤组件之⼀,他的启动绝对没有那么简单。
这⾥涉及到了系统服务进程,启动过程细节很多,这⾥我只展⽰主体流程。
activity的启动流程随着版本的更替,代码细节⼀直在进⾏更改,每次都会有很⼤的修改,如android5.0 android8.0。
我这⾥的版本是基于android api28,也是⽬前我可以查得到的最新源码了。
事实上⼤题的流程是相同的,掌握了⼀个版本,其他的版本通过源码也可以很快地掌握。
因为涉及到不同的进程之间的通信:系统服务进程和本地进程,在最新版本的android使⽤的是AIDL来跨进程通信。
所以需要对AIDL有⼀定的了解,会帮助理解整个启动流程。
源码部分的讲解涉及到很多的代码讲解,可能会有⼀点不适,但还是建议看完源码。
源码的关键代码处我都会加上注释,⽅便理解。
代码不会过分关注细节,只注重整体流程。
想知道具体细节可以去查看源码。
每份代码所在的路径我都会在代码前⾯标注出来,各位可以去查看相对应的源码。
每部分源码前我都会放流程图,⼀定要配合流程图⾷⽤,不然可能会乱。
整体流程概述这⼀部分侧重于对整个启动流程的概述,在⼼中有⼤体的概念,这样可以帮助对下⾯具体细节流程的理解。
普通Activity的创建普通Activity创建也就是平常我们在代码中采⽤startActivity(Intent intent)⽅法来创建Activity的⽅式。
总体流程如下图:启动过程设计到两个进程:本地进程和系统服务进程。
本地进程也就是我们的应⽤所在进程,系统服务进程为所有应⽤共⽤的服务进程。
整体思路是:1. activity向Instrumentation请求创建2. Instrumentation通过AMS在本地进程的IBinder接⼝,访问AMS,这⾥采⽤的跨进程技术是AIDL。
3. 然后AMS进程⼀系列的⼯作,如判断该activity是否存在,启动模式是什么,有没有进⾏注册等等。
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内核加载、文件系统加载、初始化进程、启动用户空间、启动应用程序等多个步骤,最终实现用户界面的显示和应用程序的运行。
androidstartup原理

androidstartup原理Android是由Google开发的一套开放源代码的操作系统,主要用于移动设备和嵌入式系统。
它被广泛应用于智能手机、平板电脑、智能电视等移动设备中。
Android系统的启动过程是一个复杂的过程,涉及到很多不同的模块和组件。
下面将详细介绍Android系统的启动原理。
Android系统的启动过程主要包括五个阶段:引导加载程序、Linux内核初始化、系统服务初始化、应用程序启动和进程初始化。
首先是引导加载程序阶段。
当设备开机时,引导加载程序会被加载并执行。
引导加载程序主要负责初始化硬件设备,并加载第二阶段的引导加载程序。
在这个阶段,设备会进行一些硬件自检和初始化操作,确保设备能够正常运行。
接着是Linux内核初始化阶段。
在这个阶段,Linux内核会被加载并执行。
Linux内核是Android系统的核心部分,它负责管理系统的各种硬件资源和提供系统服务,同时也是Android系统与硬件之间的桥梁。
在这个阶段,Linux内核会初始化一些重要的子系统,如内存管理、文件系统、网络协议栈等。
然后是系统服务初始化阶段。
在这个阶段,系统服务会被加载并启动。
系统服务是Android系统中的一些核心组件,它们负责提供各种系统功能和服务,如Activity管理、通知管理、电源管理、输入管理等。
在这个阶段,系统服务会被初始化,并通过Binder机制提供接口供应用程序调用。
接下来是应用程序启动阶段。
在这个阶段,一些重要的应用程序会被加载并启动。
Android系统中有一些应用程序是系统级别的,它们在系统启动过程中会被优先加载和启动,如Launcher、Settings等。
在这个阶段,应用程序会被启动,并进入到运行状态。
最后是进程初始化阶段。
在这个阶段,Android系统会创建并初始化一些重要的进程。
Android系统采用了一种轻量级的进程模型,每个应用程序对应一个独立的进程,各个进程之间通过IPC机制进行通信。
Android 开机启动流程

Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写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.java2) 说明:被zygote启动,通过System Manager管理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.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
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-launcher拖拽

转自:/wdaming1986/article/details/7585649/wdaming1986/article/details/7671318最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程。
Launcher其实是贯彻于手机的整个系统的,时时刻刻都在运行,要是Launcher不运行了,手机就得黑屏了。
Launcher的LauncherMode=singletask,所以说不管Launcher启动了哪个应用,总有个Launcher的实例在堆栈中,并且位于栈底。
点击Home键进入到Launcher,上篇Android的全局键(home键/长按耳机键)详解【android源码解析八】中有详细的介绍。
大致思路其实就是启动launcher的时候,新启动一个task。
大致先说这么多,先看截图:大明原创,转载请标明出处:/wdaming1986/article/details/7585649图(1)上图是4.0的Launcher界面,下面我们分步来解析一下Launcher的启动过程。
Step 0:首先要给大家介绍一下Launcher的数据库,这个数据库中存放着待机界面的图标,主屏底部的应用程序图标和桌面folder中各应用程序的图标,ICS4.0的folder中只能放应用程序的快捷方式,shortcut 不能放到这个folder中,先看截图:图(2)说说各字段的含义:title:表示桌面应用程序的名字,有的title为空,表示是widget的快捷方式;intent:表示启动这个图标的intent放到数据库中,当click的时候就会调用这个字段,启动相应的应用程序;container:表示应用程序的容器,folder的容器为整数,-100:表示在桌面的程序,-101:表示是主屏底部的程序;screen:表示在第几个屏,folder的screen都是0, container=-101的为0,1,3,4;2为allapp的按钮;cellX:表示在屏幕X轴的位置,(0,1,2,3),左上角为0点,往右依次增加;cellY:表示在屏幕Y轴的位置,(0,1,2,3),左上角为0点,往下依次增加;spallX:表示占X轴几个格;spallY:表示占Y轴几个格;itemType:应用程序用0表示,shortcut用1表示,folder用2表示,widget用4表示;appWidgetId:-1表示不是widget,数字大于0表示才是widget;isShortCut:值为0表示不是应用程序的ShortCut,值为1表示是应用程序的ShortCut;iconType:值为0表示图标的名字被定义为包名的资源id,值为1表示图标用bitmap保存;icon:表示应用程序的图标,二进制的;显示为一张图片;说明:folder中的应用快捷方式绑定folder---->是用container的值绑定folder的id的;详细的讲解请参考LauncherSettings.java这个类,有数据库字段的详细讲解;手机是在第一次烧机完成后,数据库的值还没有,这时候launcher解析default_workspace.xml把这个值存到数据库中;所以说想定制什么样的开机桌面就在default_workspace.xml中做相应的配置,具体参照我前面的博客:Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】中有详细的介绍:i f (!convertDatabase(db)) {// Populate favorites table with initial favoritesloadFavorites(db, R.xml.default_workspace);}Step 1:开机后先启动LauncherApplication.java这个类的onCreate()方法,下面看代码:[java]view plaincopyprint?1.@Override2.public void onCreate() {3.super.onCreate();4.5.// set sIsScreenXLarge and sScreenDensity *before* creating icon cache6.// 在创建图标缓存之前先设置sIsScreenXLarge和屏幕设备的分辨率7.final int screenSize = getResources().getConfiguration().screenLayout &8.Configuration.SCREENLAYOUT_SIZE_MASK;9.sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||10.screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE;11.sScreenDensity = getResources().getDisplayMetrics().density;12.13.// 实例化图标缓存区的对象14.mIconCache = new IconCache(this);15.// 实例化一个LauncherModel对象,这个类是保存Launcher的内存启动状态,更新Launcher的数据库的作用16.mModel = new LauncherModel(this, mIconCache);17.18.// Register intent receivers19.// 注册监听,应用package增加,删除,改变的监听。
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_launcher源码全面分析

Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置 的。这里按我修改的是3行5列的界面排布(对应上面的效果图)。 一般配置APP的快捷方式,使用上面的属性标签就可以。
<appwidget //插件
launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider" //该应用的类 launcher:packageName="de.dnsproject.clock_widget_main" launcher:screen="1" launcher:x="2" launcher:y="3" launcher:spanY="2" /> //第1屏,0-4屏共5屏 //图标X位置,左上角第一个为0,向左递增,0-4共5个 //图标Y位置,左上角第一个为0,向下递增,0-2共3个 //在x方向上所占格数 //在y方向上所占格数 //该应用的包名
========================Launcher 学习========================
一、Launcher 默认界面配置(default_workspace) ------------------------------------------- - 2 1、界面默认配置文件 --------------------------------------------------------------------------- - 2 2、LauncherProvider.java 的 loadFavorites 分析--------------------------
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home 应用程序就是Launcher了,本文将详细分析Launcher应用程序的启动过程。
Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动PackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章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。
Step 4. AndroidRuntime.callStatic这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 4。
Step 5. SystemServer.init2这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 5。
Step 6. ServerThread.run这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 6。
Step 7. ActivityManagerService.main这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:view plain1.public final class ActivityManagerService extends ActivityManagerNative2.implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {3. ......4.5.public static final Context main(int factoryTest) {6. AThread thr = new AThread();7. thr.start();8.9.synchronized (thr) {10.while (thr.mService == null) {11.try {12. thr.wait();13. } catch (InterruptedException e) {14. }15. }16. }17.18. ActivityManagerService m = thr.mService;19. mSelf = m;20. ActivityThread at = ActivityThread.systemMain();21. mSystemThread = at;22. Context context = at.getSystemContext();23. m.mContext = context;24. m.mFactoryTest = factoryTest;25. m.mMainStack = new ActivityStack(m, context, true);26.27. m.mBatteryStatsService.publish(context);28. m.mUsageStatsService.publish(context);29.30.synchronized (thr) {31. thr.mReady = true;32. thr.notifyAll();33. }34.35. m.startRunning(null, null, null, null);36.37.return context;38. }39.40. ......41.}这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。
Step 8. PackageManagerService.main这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java 文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 7。
执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher 启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。
Step 9. ActivityManagerService.setSystemProcess这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:view plain1.public final class ActivityManagerService extends ActivityManagerNative2.implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {3. ......4.5.public static void setSystemProcess() {6.try {7. ActivityManagerService m = mSelf;8.9. ServiceManager.addService("activity", m);10. ServiceManager.addService("meminfo", new MemBinder(m));11.if (MONITOR_CPU_USAGE) {12. ServiceManager.addService("cpuinfo", new CpuBinder(m));13. }14. ServiceManager.addService("permission", new PermissionController(m));15.16. ApplicationInfo info =17. mSelf.mContext.getPackageManager().getApplicationInfo(18."android", STOCK_PM_FLAGS);19. mSystemThread.installSystemApplicationInfo(info);20.21.synchronized (mSelf) {22. ProcessRecord app = mSelf.newProcessRecordLocked(23. mSystemThread.getApplicationThread(), info,24. info.processName);25. app.persistent = true;26. app.pid = MY_PID;27. app.maxAdj = SYSTEM_ADJ;28. mSelf.mProcessNames.put(app.processName, .uid, app);29.synchronized (mSelf.mPidsSelfLocked) {30. mSelf.mPidsSelfLocked.put(app.pid, app);31. }32. mSelf.updateLruProcessLocked(app, true, true);33. }34. } catch (NotFoundException e) {35.throw new RuntimeException(36."Unable to find android system package", e);37. }38. }39. ......40.}这个函数首先是将这个ActivityManagerService实例添加到ServiceManager中去托管,这样其它地方就可以通过ServiceManager.getService接口来访问这个全局唯一的ActivityManagerService实例了,接着又通过调用mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的android包加载进来,这里的mSystemThread是一个ActivityThread类型的实例变量,它是在上面的Step 7中创建的,后面就是一些其它的初始化工作了。