热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Android核心分析之八Android启动过程详解

原文地址:http:blog.csdn.netmaxlengarticledetails5508372 Android启动过程详解Android从Linux系统启动有4个步骤;(1

 


Android 启动过程详解

Android





Linux



系统启动有



4



个步骤;










(1)

init

进程启动










(2)

Native

服务启动










(3)

System Server





Android



服务启动










(4)

Home

启动











总体启动框架图如:




 



第一步:initial

进程

(system/core/init)



 

     init

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



init



的方式,完成引导进程。



init



始终是第一个进程





.








I



nit.rc








I



nit.marvell.rc









Init

进程一起来就根据



init.rc







init.xxx.rc



脚本文件建立了几个基本的服务:













  •  

    servicemanamger








  •  

    zygote









。。。









最后

Init



并不退出,而是担当起



property service



的功能。













1.1

脚本文件











[email protected]



System/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/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













S




ervicemanager





zygote



进程就奠定了



Android



的基础。





Z



ygote

这个进程起来才会建立起真正的



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 Runtime








  • runtime.start("com.android.internal.os.ZygoteInit",



    startSystemServer);








(2)



runtime.start



@AndroidRuntime.cpp











  • 建立虚拟机






  • 运行:



    com.android.internal.os.ZygoteInit





    main





    函数。








(3)

main()@



com.android.internal.os.ZygoteInit



//

正真的



Zygote

















  • registerZygoteSocket();



    //

    登记



    Listen



    端口










  • startSystemServer();






  • 进入

    Zygote



    服务框架。







经过这几个步骤,

Zygote



就建立好了,利用



Socket



通讯,接收



ActivityManangerService



的请求,



Fork



应用程序。














第三步

System Server











 

startSystemServer



@



com.android.internal.os.ZygoteInit





Zygote











fork



了一个进程



:





 

com.android.server.SystemServer



.

于是



SystemServer





@(SystemServer.java





就建立了。Android

的所有服务循环框架都是建立



[email protected](SystemServer.java



)上。在



SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。










main() @ com/android/server/SystemServer


{




init1();





}


Init1()

是在



Native



空间实现的(



com_andoird_server_systemServer.cpp



)。我们一看这个函数就知道了,



i



nit1->system_init() @System_init.cpp




 



system_init()



我们看到了循环闭合管理框架。






{




Call "com/android/server/SystemServer", "init2"







…..







ProcessState::self()->startThreadPool();





   

IPCThreadState::self()->joinThreadPool();



}




init2()@SystemServer.java

中建立了



Android



中所有要用到的服务。






这个

init2



()建立了一个线程,来



New Service







AddService



来建立服务













第三步

Home



启动













[email protected]









后半段,我们可以看到系统在启动完所有的

Android



服务后,做了这样一些动作:










(1)

使用

xxx.systemReady()



通知各个服务,系统已经就绪。










(2) 

特别对于



ActivityManagerService.systemReady(



回调



)












W




idget.wallpaper,imm(

输入法



)







ready



通知。











Home

就是在



ActivityManagerService.systemReady()



通知的过程中建立的。下面是



ActivityManagerService.systemReady()



的伪代码:










systemReady()@ActivityManagerService.java










resumeTopActivityLocked()











startHomeActivityLocked();




//

如果是第一个则启动



HomeActivity
















startActivityLocked




(。。。)



CATEGORY_HOME







推荐阅读
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文详细介绍了VMware的多种认证选项,帮助你根据职业需求和个人技能选择最合适的认证路径,涵盖从基础到高级的不同层次认证。 ... [详细]
  • 本文介绍如何通过更改软件源来提前体验Ubuntu 8.10,包括详细的配置步骤和相关注意事项。 ... [详细]
  • 本文介绍如何在Linux服务器之间使用SCP命令进行文件传输。SCP(Secure Copy Protocol)是一种基于SSH的安全文件传输协议,支持从远程机器复制文件到本地服务器或反之。示例包括从192.168.45.147复制tomcat目录到本地/home路径。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了Python编程语言的学习路径,涵盖基础语法、常用组件、开发工具、数据库管理、Web服务开发、大数据分析、人工智能、爬虫开发及办公自动化等多个方向。通过系统化的学习计划,帮助初学者快速掌握Python的核心技能。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
author-avatar
小果康康维五_469
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有