Android开机启动最详细注解.docx

上传人:小飞机 文档编号:3152484 上传时间:2023-03-11 格式:DOCX 页数:20 大小:46.23KB
返回 下载 相关 举报
Android开机启动最详细注解.docx_第1页
第1页 / 共20页
Android开机启动最详细注解.docx_第2页
第2页 / 共20页
Android开机启动最详细注解.docx_第3页
第3页 / 共20页
Android开机启动最详细注解.docx_第4页
第4页 / 共20页
Android开机启动最详细注解.docx_第5页
第5页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Android开机启动最详细注解.docx》由会员分享,可在线阅读,更多相关《Android开机启动最详细注解.docx(20页珍藏版)》请在三一办公上搜索。

1、Android开机启动最详细注解Android 开机启动流程最详细版 1 Android的开机流程 1. 系统引导bootloader 1) 源码:bootable/bootloader/* 2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择 a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写 b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写 c) 开机按Power,正常启动系统,

2、加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机 2. 内核kernel 1) 源码:kernel/* 2) 说明:kernel由bootloader加载 3. 文件系统及应用init 1) 源码:system/core/init/* 2) 配置文件:system/rootdir/init.rc, 3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务,执行命令和按其中的配置语句执行相应功能 4. 重要的后台程序zygote 1) 源码:frameworks/base/cmds/app_main.cpp等 2) 说明:zygo

3、te是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process a) 建立Java Runtime,建立虚拟机 b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序 c) 启动System Server 5. 系统服务system server 1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java 2) 说明:被zygote启动,通过System Manager管理android的服务 6. 桌面launch

4、er 1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现 2) 说明:系统启动成功后SystemServer使用xxx.systemReady通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady通知的过程中建立的,最终调用 启launcher 7. 解锁 1) 源码: frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServe

5、r调用wm.systemReady通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置 8. 开机自启动的第三方应用程序 Android 开机启动流程最详细版 2 1) 源码: frameworks/base/services/java/com/android/server/am/ActivityManagerService.java 2) 说明:系统启动成功后SystemServer调用

6、ActivityManagerNative.getDefault.systemReady通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。 9. 总结 综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及

7、顺序。 10. 参考 Android 开机启动流程最详细版 3 Android 启动过程详解 Android从Linux系统启动有4个步骤; (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) Home启动 总体启动框架图如: 第一步:initial进程(system/core/init) init进程,它是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序initAndroid 开机启动流程最详细版 4 的方式,完成引导进程。init始终是第一个进程. Init.rc Init.marvell.rc

8、Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务: servicemanamger zygote 。 最后Init并不退出,而是担当起property service的功能。 1.1脚本文件 initSystem/Core/Init 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/C

9、ore/Init/readme.txt) 该脚本包含四个类型的声明: Actions Commands Services Options. 1.2 服务启动机制 我们来看看Init是这样解析.rc文件开启服务的。 打开.rc文件,解析文件内容 system/core/init/init.c 将service信息放置到service_list中。 system/core/init parser.c restart_service system/core/init/init.c service_start execve().建立service进程。 Android 开机启动流程最详细版 5 第二步

10、 Zygote Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述: service zygote /system/bin/app_process -Xzygote /system/bin -zygote -start-system-server 所以Zygote从main()frameworks/base/cmds/app_main.cpp开始。 (1) main()frameworks/base/cmds

11、/app_main.cpp 建立Java Runtime runtime.start(com.android.internal.os.ZygoteInit, startSystemServer); (2) runtime.startAndroidRuntime.cpp 建立虚拟机 运行:com.android.internal.os.ZygoteInit:main函数。 maincom.android.internal.os.ZygoteInit/真正的Zygote。 registerZygoteSocket;/登记Listen端口 startSystemServer; 进入Zygote服务框

12、架。 经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。 第三步 System Server startSystemServercom.android.internal.os.ZygoteInit在Zygote上fork了一个进程: com.android.server.SystemServer.于是SystemServer(SystemServer.java)就建立了。Android的所有服务循环框架都是建立SystemServer(SystemServer.java)上。在SystemServer.ja

13、va中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。 main com/android/server/SystemServer init1; Init1是在Native空间实现的。我们一看这个函数就知道了,init1-system_init System_init.cpp 在system_init我们看到了循环闭合管理框架。 Call com/android/server/SystemServer, init2 . ProcessState:self-startThreadPool; IPCThreadStat

14、e:self-joinThreadPool; init2SystemServer.java中建立了Android中所有要用到的服务。 这个init2建立了一个线程,来New Service和AddService来建立服务 第三步 Home启动 在ServerThreadSystemServer.java后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作: Android 开机启动流程最详细版 6 使用xxx.systemReady通知各个服务,系统已经就绪。 (2) 特别对于ActivityManagerService.systemReady(回调) Widget.w

15、allpaper,imm(输入法)等ready通知。 Home就是在ActivityManagerService.systemReady通知的过程中建立的。下面是ActivityManagerService.systemReady的伪代码: systemReadyActivityManagerService.java resumeTopActivityLocked startHomeActivityLocked;/如果是第一个则启动HomeActivity。 startActivityLockedCATEGORY_HOME Android 开机启动流程最详细版 7 Android Bootin

16、g: init is the first process after kernel started. The corresponding source code lies in: device/system/init. It does the following tasks step by step: 1.Initialize log system. 2.Parse /init.rc and /init.%hardware%.rc. 3. Execute early-init action in the two files parsed in step 2. 4. Device specifi

17、c initialize. For example, make all device node in /dev and download firmwares. 5. Initialize property system. Actually the property system is working as a share memory. Logically it looks like a registry under Windows system. 6. Execute init action in the two files parsed in step 2. 7. Start proper

18、ty service. 8. Execute early-boot and boot actions in the two files parsed in step 2. 9. Execute property action in the two files parsed in step 2. 10. Enter into an indefinite loop to wait for device/property set/child process exit events. For example, if an SD card is plugined, init will receive a

19、 device add event, so it can make node for the device. Most of the important process is forked in init, so if any of them crashed, init will receive a SIGCHLD then translate it into a child process exit event, so in the loop init can handle the process exit event and execute the commands defined in

20、*.rc(it will run command onrestart). The .rc file is a script file defined by Android. The default is device/system/rootdir/init.rc. We can take a loot at the file format(device/system/init/readme.txt is a good overall introduction of the script). Basically the script file contains actions and servi

21、ces. Actions Actions are named sequences of commands的组合). Actions have a trigger which is used to determine when the action should occur). When an event occurs which matches an actions trigger, that action is added to the tail of a to-be-executed queue (unless it is already on the queue). Each actio

22、n in the queue is dequeued in sequence and each command in that action is executed in sequence. Init handles other activities (device creation/destruction, property setting, process restarting) between the execution of the commands in activities. ,比如设备节点的创建/销毁,设置属性和重启进程等) Actions take the form of: o

23、n . Services Android 开机启动流程最详细版 8 Services are programs which init launches and (optionally) restarts when they exit. Services take the form of: service * . Options Options are modifiers to services. They affect how and when init runs the service. Triggers Triggers are strings which can be used to m

24、atch certain kinds of events and used to cause an action to occur. The builtin supported commands are defined in device/system/init/keywords.h. Commands are implementd in device/system/init/bultins.c. The init program only executes five kinds of triggers: early-init, init, early-boot, boot, property

25、:*. Take a look at the following line in default init.rc. class_start default This line is a command for the action corresponding to boot trigger. It will start all services whose class name equals to default. By default, if no class option is defined for a service, the services class name is defaul

26、t. So this line will start all the services in the order of position in the file by default. (BTW, you can start any service using start commands, if you like.) Any service is run as a forked process of init, take a look at the source code of service_start in device/system/init.c. So according to th

27、e default init.rc, the following services will be executed step by step: console: star a shell. The source is in device/system/bin/sh. adbd: start adb daemon. The source is in device/tools/adbd. By default is disabled. servicemanager: start binder system. The source is in device/commands/binder. ) m

28、ountd: mount all fs defined in /system/etc/mountd.conf if started, receive commands through local socket to mount any fs. The source is in device/system/bin/mountd. debuggerd: start debug system. The source is in device/system/bin/debuggerd. rild: start radio interface layer daemon. The source is in

29、 device/commands/rild. zygote: start Android Java Runtime and start system server. Its the most important service. The source is in device/servers/app. Android 开机启动流程最详细版 9 media: start AudioFlinger, MediaPlayerService and CameraService. The source is in device/commands/mediaserver. bootsound: play

30、the default boot sound /system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3. dbus: start dbus daemon, its only used by BlueZ. The source is in device/system/Bluetooth/dbus-daemon. hcid: redirect hcids stdout and stderr to the Android logging system. The source is in device/syste

31、m/bin/logwrapper. By default is disabled. hfag: start Bluetooth handsfree audio gateway, its only used by BlueZ. The source is in device/system/Bluetooth/bluez-utils. By default is disabled. hsag: start Bluetooth headset audio gateway, its only used by BlueZ. The source is in device/system/Bluetooth

32、/bluez-utils. By default is disabled. installd: start install package daemon. The source is in device/servers/installd. flash_recovery: load /system/recovery.img. The source is in device/commands/recovery/mtdutils. Zygote service does the following tasks step by step: 1. Create JAVA VM. 2. Register

33、android native function for JAVA VM. 3. Call the main function in the JAVA class named com.android.internal.os.ZygoteInit whose source is device/java/android/com/android/internal/os/ZygoteInit.java. a) Load ZygoteInit class b) Register zygote socket c) Load preload classes(the default file is device

34、/java/android/preloaded-classes) d) Load preload resources ,在该新的进程里调用com.android.server.SystemServer JAVA类进一步初始化) e) Call Zygote:forkSystemServer (implemented in device/dalvik/vm/InternalNative.c) to fork a new process. In the new process, call the main function in the JAVA class named com.android.s

35、erver.SystemServer, whose source is in device/java/services/com/android/server. i. Load libandroid_servers.so ii. Call JNI native init1 function implemented in device/libs/android_servers/com_android_server_SystemServers. It only calls system_init implemented in device/servers/system/library/system_

36、init.cpp. If running on simulator, instantiate AudioFlinger, MediaPlayerService and CameraService here. Call init2 function in JAVA class named com.android.server.SystemServer, whose source is in device/java/services/com/android/server. This function is very critical for Android because it start all

37、 of Android JAVA services. If not running on simulator, call IPCThreadState:self-joinThreadPool to enter into service dispatcher. Android 开机启动流程最详细版 10 SystemServer:init2 will start a new thread to start all JAVA services as follows: 新线程,以启动其它所有JAVA service) Core Services: 1. Starting Power Manager

38、/ 2. Creating Activity Manager 3. Starting Telephony Registry / 4. Starting Package Manager / 5. Set Activity Manager Service as System Process 6. Starting Context Manager 7. Starting System Context Providers 8. Starting Battery Service / 9. Starting Alarm Manager / 10. Starting Sensor Service 11. S

39、tarting Window Manager 12. Starting Bluetooth Service / 13. Starting Mount Service / Other services / 1. Starting Status Bar Service 2. Starting Hardware Service 3. Starting NetStat Service 4. Starting Connectivity Service 5. Starting Notification Manager 6. Starting DeviceStorageMonitor Service 7.

40、Starting Location Manager 8. Starting Search Service 9. Starting Clipboard Service 10. Starting Checkin Service 11. Starting Wallpaper Service 12. Starting Audio Service 13. Starting HeadsetObserver 14. Starting AdbSettingsObserver Finally SystemServer:init2 will call ActivityManagerService.systemRe

41、ady to launch the first activity by senting Intent.CATEGORY_HOME intent. There is another way to start system server, which is through a program named system_server whose source is device/servers/system/system_main.cpp. It also calls system_init to start system services. So there is a question: why

42、does Android have two methods to start system services? My guess is that directly start system_server may have synchronous problem with zygote because system_server will call JNI to start SystemServer:init2, while at that time zygote may not start JAVA VM yet. So Android uses another method. After z

43、ynote is initialized, fork a new process to start system services. Android 开机启动流程最详细版 11 Android 启动过程 1. Boot系统初始化, 具体过程参见(systemcoreinitInit.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示ANDROIDmsg。 2. 初始化成功后,就开始mounting系统,具体参见(systemcoremountdMountd.c) 中的main函数。 3接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。

44、 4. Java虚拟机启动成功后,开始系统初始化。系统初始的第一步是用JNI方式实现的,对应java代码为(frameworksbaseservicesjavacomandroidserverSystemServer.java) init1函数,对应的JNI C+代码为(frameworksbasecorejniservercom_android_server_SystemServer.cpp),而实现的C+代码为 (frameworksbasecmdssystem_serverlibrary System_init.cpp) 中的system_init函数。 5. system_init调用

45、SurfaceFlinger,SurfaceFlinger的readyToRun函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。 6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2。ServerThread将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。 7.这之后的事,应该就是进入系统了。 对Android启动过程的进一步研究 对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把Busybox安装到Android上去,这样,就有很多工具供我们使用了。 首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如 Build Option

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号