`
jiagou
  • 浏览: 2516481 次
文章分类
社区版块
存档分类
最新评论

android framework 启动流程

 
阅读更多
嵌入式设备启动时bootloader加载linux内核,linux内核启动后运行第一个用户级进程init,从此进程进入android世界,所以,android是一个框架而不是kernel。
在linux系统启动时,内核引导参数上一般都会设置“init=/init”,当android 最底层linux kernel 启动后会执行一个用户级进程init,此进程为所有进程的父进程,进程号为1,这里为整个android框架的入口,init进程为android内所有进程的父进程。init 可执行程序一般位于/xbin/init 下,init程序源码在Android源码的system/core/init中,我们的分析就从main开始进入android framework。


/system/core/init/init.c#main


init进程 为标准linux进程,它可以使用linux 内核提供的api,也可以使用标准库。


init 进程分两部分,boot 部分 及 daemon部分,


int main(int argc, char **argv)
{
/* Boot part */

for(;;) {
/* Daemon part */
}
}
首先执行boot 部分,此部分创建文件系统基本目录,包括 /dev, /proc, /sys 等。
初始化kmsg log 模块,此模块用于获取linux kernle log 信息。


boot部分 最后解析init.rc配置文件,init_parse_config_file("/init.rc");/system/core/rootdir/init.rc
init.rc 语法解释参考 /system/core/init/readme.txt


此文件定义了一系列 action及service。这里指定了系统启动时执行哪些动作,可以设置环境变量,
使用linux命令执行某个动作,启动服务,挂载文件系统等等。
action 是一个命令的序列,每个action定义了某一命令,action有触发机制,及在什么情况下执行此命令。当某一事件与此action的出发机制匹配,此action会被加到action执行队列中被执行。
parse_service 把解析后的 action 都放到 action_list链表,parse_action 把Service放在service_list。


boot部分最后遍历action_list执行相应命令,具体如下:
(1)console_init_action :初始化console,显示A N D R O I D 字样在终端上。
(2)property_init_action
(3)set_init_properties_action
(4)property_service_init_action


Daemon part :
for(;;)不断执行一下动作:
(1)启动service_list中指定的服务,所有android其他服务在此处通过service 方式启动,如虚拟机,servicemanager,mediaserver等,
每个服务对应init进程的一个子进程。


(2)不断调用poll 监控3个fd状态
property_set_fd
signal_recv_fd
keychord_fd
property_set_fd 解释:
作为一个系统服务管理着系统的配置和状态,所有的这些系统配置和状态都是属性(property)。属性(property)是一对键/值(key/value)组合,键和值都是字符串类型。Androd中非常多的应用程序和库直接或者间接的依赖于属性系统,并由此决定其运行期的行为。例如:adbd进程通过属性来决定是否当前运行在模拟器中。再比如:java.io.File.pathSeparator方法返回存储在属性服务中的值,property_service_init_action 在boot阶段调用,初始化android 属性系统,系统固定的属性在目录 "/data/property" 下面。init 进程管理android属性系统所有数据,其他进程通过android提供的ashmem驱动只读属性系统。
参考:
http://hi.baidu.com/runsheng2005/blog/item/84734fd6ac12363b06088b1f.html


signal_recv_fd :
子进程信号处理,waitpid等候子进程退出,清理资源,如果子进程是服务则重启子进程。
keychord_fd:
监控输入设备事件并启动相应服务。


至此,init进程启动完毕。


上面的daamon部分提到service_list保存了 init.rc中配置的启动项,android内给上层提供的一些主要服务都是在此处指定并启动。


如:servicemanager
service servicemanager /system/bin/servicemanager
user system
critical
onrestart restart zygote
onrestart restart media
--------------------#android运行时环境虚拟机启动
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
---------------------------------
service media /system/bin/mediaserver #多媒体service启动。
user media
group system audio camera graphics inet net_bt net_bt_admin net_raw
ioprio rt 4
------------------------------------------------------------------------


init进程通过创建子进程启动其他服务,这些服务作为damon进程在后台运行,给整个android上层应用提供服务。
这里对应init.rc中的 service 部分,
主要包括以下几个部分:
(1) servicemanager: start binder system,ipc 通信机制在此实现, device/commands/binder.
(2) installd, install package daemon, device/servers/installd.
(3) media 多媒体服务,启动 AudioFlinger, MediaPlayerService and CameraService,device/commands/mediaserver
(4) bluetoothd 蓝牙服务
(5) dhcpcd dhcp服务
(6)console , shell, device/system/bin/ash
(7)adbd, adb daemon进程,device/tools/adbd
(8)mountd,device/system/bin/mountd
(9)flash_recovery, device/commands/recovery/mtdutils
(10)bootsound ,播放默认 boot sound /system/media/audio/ui/boot.mp3. The source is in device/commands/playmp3.
(11)rild, start radio interface layer daemon. device/commands/rind.


(12)zygote 启动android java 运行时环境,同时启动system server (构建在java虚拟机之上),此子进程为android 中最重要的服务,device/servers/app


这些子进程构成了android framework基础。


zygote 进程启动流程:
Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。


(1) main(…)@frameworks/base/cmds/app_main.cpp
创建虚拟机,注册android本地函数。
建立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。 /java/android/com/android/internal/os/ZygoteInit.java


registerZygoteSocket();//登记Listen端口
startSystemServer(); 启动systemserver子进程,此进程非常重要,他分两部分,init1,init2,init1阶段启动用C++写的service, init2启动了android java 层所有服务。


内部调用forkSystemServer (implemented in device/dalvik/vm/InternalNative.c)启动新进程,
调用 main#SystemServer.java(/frameworks/base/services/java/com/android/server/systemserver.java),
内部分两个过程,init1,init2,init1为jni调用在com_android_server_SystemServer.cpp 中为init1是现代码。
system_init为init1的具体实现,
进入init2后启动java线程启动android java services (framesorks/base/services/java/com/android/server/SystemServer.java)


至此systemservice启动完毕,进入android。
更进一步分析应该进入 ini1,init2阶段启动的各种服务(SurfaceFlinger,CameraService.,Activity Manager。。。)




分享到:
评论

相关推荐

    探索Android FrameWork底层开发视频全套

    3.Android编译过程分析 4.android.mk初识 5.Android.mk学习1 6.Android.mk学习2 7.Android.mk学习3 8.Android启动课程大纲 9.Android启动模式 10.init启动分析 11.走入init启动脚本 12.init脚本解析分析 13.init脚本...

    深入Android Framework开发(入门篇)

    广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,...-学习怎么进行Android源码定位分析,实例:Activity启动流程源码分析 -实战开发Frameowork项目--去除第三方应用入口广告页

    Android 内核剖析之Framework的启动分析

    详细讲解了framework的启动过程和线程调用。各种service

    android开机启动流程

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

    如何深入学习AndroidFramework

    本篇文章主要介绍了什么是Framework,Framework开发学什么 ,Framework开发的主要内容 Framework开发学什么 Framework开发的...7. 系统启动过程分析 8. 应用层框架 9. 显示系统 10. Android 输入系统 11. 系统应用

    Android Framework实战开发篇

    广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主...

    《Android内核剖析》的附图(无乱码)

    《Android内核剖析》一书附带的图 附图名称如下: 附图1:Framework基本框架 附图2:Activity中创建窗口的过程 附图3:点击图标启动Activity 附图4:Activity的停止以及内存回收时机 附图5:按键消息获取流程 ...

    ANDROID框架揭秘.pdf下载高清完整扫描版

    《android框架揭秘》通过对android系统源代码的分析,主要介绍android框架的初始化过程及主要组件的工作原理。作者直接分析和整理了android框架的主要源代码,并详细讲解了理解框架工作原理所需的各种基础知识和构成...

    Android 护眼模式的简单实现

    https://blog.csdn.net/qq_20613731/article/details/106893239 此方法不涉及申请浮窗权限(用悬浮窗实现护眼模式,会涉及到优先级,然而高于系统弹框,部分机型系统弹框点击事件无效)

    Android框架揭秘(完整版pdf)

    其中的主要内容包括:通过启动程序了解Android框架的概要,移植Android以及如何开发适合各种机器的应用程序,分析Android框架所需的基础知识,JNI(Java Native Interface)与Binder基础知识,Zygote、Service Manager...

    Framework启动流程图

    非常详细了介绍了从Boot Rom 、Kernel 、init 、 Zygoae 、 SystemServer 、 App的整个过程

    Android启动-init启动介绍

    Linux内核启动之后,执行第一个进程 Init,init会启动本地服务,创建Zygote进程,并最终到达systemserver,systemserver再往上启动framework层相关服务和进程,启动launcher等完成整个开机流程。Android启动研究就从这里...

    Android插件框架Android-Plugin-Framework.zip

    Android-Plugin-Framework 此项目是Android插件框架完整源码以及实例。用来开发Android插件APK,并通过动态加载的方式在宿主程序中运行。 若插件APK是完全独立的APK,那么插件apk也可独立安装运行。 若...

    Android Launch Process(安卓系统启动过程)

    Android的系统启动流程,从开机到打开桌面的大概流程。

    Android的设计与实现(卷1)

    启动篇(第3~4章)深入分析了android启动过程的机制和实现原理,能帮助读者全面理解框架层系统服务的运行基础;binder篇(第5~6章)着重分析了binder在native框架层和java框架层的机制和实现,能让读者深入理解...

    Android-11-Activity 启动过程分析流程图原件

    Android_11_Activity 启动过程分析流程图原件

    Android系统源代码情景分析 / 罗升阳著

    全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层(Application Framework)以及应用程序层(Application)。 在组织上,《Android...

    APP启动流程详解

    详细的解说了APP的启动过程及其核心代码,为学习Android framework框架提供了很好的学习资料

    Android安卓 系统ODEX优化代码

    Android系统中运行的程序包主要分framework,system/app,data/app,三个路径,开机的时候启动内核后,就会逐个启动framework里的jar框架程序,再启动system/app的开机自启程序。 如果你想把整个ROM都odex化,就必须先...

    Android驱动开发权威指南

    19.3.2 Android USB Mass Storage流程分析 第20章Bootloader引导子系统 20.1 Bootloader流程分析 20.1.1 Bootloader概述 20.1.2 U-Boot启动流程分析 20.2 Bootloader修改指南 20.2.1开机第一帧图的修改 20.2.2开机...

Global site tag (gtag.js) - Google Analytics