Android_开机启动流程

上传人:无*** 文档编号:163398258 上传时间:2022-10-21 格式:DOC 页数:8 大小:120.50KB
收藏 版权申诉 举报 下载
Android_开机启动流程_第1页
第1页 / 共8页
Android_开机启动流程_第2页
第2页 / 共8页
Android_开机启动流程_第3页
第3页 / 共8页
资源描述:

《Android_开机启动流程》由会员分享,可在线阅读,更多相关《Android_开机启动流程(8页珍藏版)》请在装配图网上搜索。

1、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、分析正常启动的情况)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) 说明:

3、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的服务(这里的服务指framewo

4、rks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 ()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/int

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

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

7、server用于管理android后台服务,启动步骤及顺序。10. 参考Android 启动过程详解Android从Linux系统启动有4个步骤;(1) init进程启动(2) Native服务启动(3) System Server,Android服务启动(4) Home启动总体启动框架图如:第一步:initial进程(system/core/init) init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程.Init.rcInit.ma

8、rvell.rcInit进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:servicemanamger zygote 。最后Init并不退出,而是担当起property service的功能。1.1脚本文件initSystem/Core/InitInit.c: parse_config_file(Init.rc) parse_config_file(Init.marvel.rc)解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)Init.rc是Android自己规定的初始化脚本(Android Init Language, System/

9、Core/Init/readme.txt)该脚本包含四个类型的声明:Actions Commands Services Options. 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 Servicemana

10、ger和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/app_main.cpp建立Java Ru

11、ntime runtime.start(com.android.internal.os.ZygoteInit, startSystemServer); (2) runtime.startAndroidRuntime.cpp建立虚拟机 运行:com.android.internal.os.ZygoteInit:main函数。 (3)main()com.android.internal.os.ZygoteInit/正真的Zygote。registerZygoteSocket();/登记Listen端口 startSystemServer(); 进入Zygote服务框架。 经过这几个步骤,Zygot

12、e就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。第三步 System ServerstartSystemServercom.android.internal.os.ZygoteInit在Zygote上fork了一个进程:com.android.server.SystemServer.于是SystemServer(SystemServer.java)就建立了。Android的所有服务循环框架都是建立SystemServer(SystemServer.java)上。在SystemServer.java中看不到循环结构,只是可以看到建立

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

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

15、ady(回调) Widget.wallpaper,imm(输入法)等ready通知。Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是ActivityManagerService.systemReady()的伪代码:systemReady()ActivityManagerService.java resumeTopActivityLocked() startHomeActivityLocked();/如果是第一个则启动HomeActivity。 startActivityLocked(。)CATEGORY_HOMEAndroid 启

16、动过程1. Boot系统初始化, 具体过程参见(systemcoreinitInit.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。 2. 初始化成功后,就开始mounting系统,具体参见(systemcoremountdMountd.c) 中的main函数。 3接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。 4. Java虚拟机启动成功后,开始系统初始化。系统初始的第一步是用JNI方式实现的,对应java代码为(frameworksbaseservicesjavacomandroidserverS

17、ystemServer.java) init1(Native)函数,对应的JNI C+代码为(frameworksbasecorejniservercom_android_server_SystemServer.cpp),而实现的C+代码为 (frameworksbasecmdssystem_serverlibrary System_init.cpp) 中的system_init()函数。 5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个

18、动态的小机器人。 6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。ServerThread将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。 7.这之后的事,应该就是进入系统了。(这部分没有调查过)。对Android启动过程的进一步研究对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪

19、Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把Busybox安装到Android上去,这样,就有很多工具供我们使用了。 首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如Build Options Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。Do you want to build BusyBox with a Cross Compi

20、ler? (/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu 这是交叉编译器的路径,要根据具体的情况来设置。Installation Options Dont use /usr这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。busybox的功能选项根据需要自选,但是不要太贪心.OK,这里就不纠缠于编译busybox的东西了,网上资料无数。接下来,我们把busybox安装到模拟器上去。先在模拟器上随便建一个busybox的文件夹,然后进入busybox

21、可执行文件目录,使用命令adb push busybox.asc /data/busybox/busybox然后进入adb shell,chmod 777 ./busybox,就可以直接使用了。但现在还是不方便,总不能每用一个命令就输一次busybox吧?所以,我们可以先用./busybox -install将程序都安装到当前目录下,然后把当前目录添加到PATH变量中即可。暂时使用export来添加吧,如果想永久添加,往下看。好了,准备工作完成,开始研究的工作了。既然是研究启动过程,那当然是先看看init.rc文件。去etc目录打开它,分析一下内容,首先是对env的定义,也就是全局环境变量的定

22、义,接下来的建立和初始化里面的内容目前还不清楚什么意思,紧接着就是系统启动时运行的初始进程信息,这个比较有意思,包括了usbd-config和qemu,qemu自不用说,而usbd-config作为初始启动的进程,应该就是和上一篇文章猜的一样,用来调试或者usb通信的。往下看,是在初始启动进程完成之后开始启动的服务进程,这些进程如果因故退出,会自动重启。这里面包括了console控制台,adbd监护进程,usbd监护进程,debuggerd监护进程等.除去这些守护进程,能引起我们注意的,是runtime和zygote。这两个进程似乎掌管着其他进程以及应用程序的启动。现在,来让我们做一个实验吧,

23、将自动调用的启动过程变成手动,看看启动流程具体是什么样的。想达到这个目的,首先就是要修改init.rc文件,当然不是在模拟器的console中改,一是不能改,二是你改了也没用,下次加载就会给你覆盖了。所以,我们要从原始镜像ramdisk.img入手了。从2.6标准Linux内核开始,initrd.img都采用cpio压缩,猜测ramdisk.img也一样,需要使用gunzip解压缩,然后再使用cpio解包。好,进入tools/lib/images目录下,先用file命令看看ramdisk.img的类型,没错,系统提示ramdisk.img: gzip compressed data, from

24、 Unix很好,然后将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令gunzip ramdisk.img.gz然后新建一个文件夹,叫ramdisk吧,进入,输入命令cpio -i -F ./ramdisk.img这下,你就能看见并操作ramdisk里面的内容了。当然你也可以直接在外面进行操作,但是还是建议把cpio解压缩出来的内容全部集中在一个文件夹里面,因为一会我们还要将其压缩成新的ramdisk.img。OK,现在开始修改步骤吧。用任何一款编辑器打开init.rc,首先在PATH那里加上你的Busybox安装路径,然后注释内容,我们要手

25、工启动他们。# zygote # exec /system/bin/app_process# args # 0 -Xzygote# 1 /system/bin# 2 zygote# # autostart 1# # runtime # exec /system/bin/runtime# autostart 1# 在这里需要注意,不要同时把两者都注释了,注释某一个,再试验手工启动它,如果两者同时注释我这里有问题,无法启动。好,接下来,使用下列命令重新打包成镜像cpio -i -t -F ./ramdisk.img listcpio -o -H newc -O lk.img list当前目录下生成

26、的lk.img就是我们的新镜像了。使用自己的镜像启动emulator;emulator -console -ramdisk lk.img如果我们注释的是zygote,那么在#后输入app_process -Xzygote /system/bin zygote手工启动,命令行中输出的信息是Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk:/system/app/Develop

27、ment.apk:/system/app/GDataFeedsProvider.apk:/system/app/Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk:/system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk:/system/app/Maps.apk:/system/app/MediaPickerActivity.apk:/system/app/MediaProvider.apk:/system

28、/app/Phone.apk:/system/app/PimProvider.apk:/system/app/ApiDemos.apk:/system/app/SettingsProvider.apk:/system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk:/system/app/XmppService.apk:/system/app/YouTube.apkFile not found: /system/app/AlarmProvider.apkFile not found: /sys

29、tem/app/Calendar.apkFile not found: /system/app/Camera.apkFile not found: /system/app/GDataFeedsProvider.apkFile not found: /system/app/Gmail.apkFile not found: /system/app/GmailProvider.apkFile not found: /system/app/MediaPickerActivity.apkFile not found: /system/app/PimProvider.apkFile not found:

30、/system/app/ApiDemos.apkFile not found: /system/app/Sms.apkFile not found: /system/app/SyncProvider.apkFile not found: /system/app/YouTube.apkPrep complete嘿嘿,从File not found的信息中可以看到一些Google可能会即将推出的应用,比如Gmail什么的。当然,这些都是Java框架的启动信息,我们以后还要借助其他工具来进行进一步探索。如果我们注释的是runtime,那么输出信息是:+ post-zygote老实说,没有明白这是啥意思,呵呵,吃饭时间到了,懒得看了。好了,今天就说到这,基本的方法就是这样,有兴趣的朋友可以进一步深入研究。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!