android服务的启动过程,Android 启动过程

开机过程大致可以分为三个大阶段:

1. OS级别,由bootloader载入linux kernel后(注:bootloader和制造商有关,一般都是自己修改后的bootloader,大同小异,无外乎加载了自己的安全机制,我们可以用最常见的uboot来考虑),kernel开始初始化, 并载入built-in的驱动程序。Kernel完成开机后,载入init process,切换至user-space后,结束kernel 的循序过程(sequence),进入排程模式(process scheduling)。

2. Android-level,由init process 开始,读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server。

3. Zygote-Mode,Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。随后,使用者将看到一个桌面环境(Home Screen)。桌面环境由一个名为[Launcher]的应用程序负责提供。

注:Zygote干嘛用的?主要负责启动system server和执行android程序(APK)。成功启动system server后会使用socket方式监听(monitor android apps/prcesses)

20187621_1.jpg

我们的image都包含什么?

Bootloader,system(是Android镜像),data(用户数据/data),kernel(android linux kernel,基础OS,负责process管理,HAL和一些系统程序),ramdisk(init装载, /system/init/init.c).

关于开机时间长短问题,对于产品开机和关机时间长短,直接影响到用户的感受,所以我们需要对开机时间进行评估。

Bootloader阶段,linux kernel阶段,android boot阶段(preload阶段,启动android service,启动launcher)

Android阶段启动过程分析:

Init会读取init process启动ril-daemon, media, bootsound, bootanim, servicemanager......

最重要的init会启动Zygote,然后Zygote会启动Davik VM,davikVM会启动systemserver,紧接着会把Framework启动,比如Activity Manager,Windows Manager... 还有一些Android服务程序。Activity Manager负责把Home引导完毕。

Android第一个启动进程init(system\core\init),这个在OS级别启动之后的第一个程序(用户程序),用它来完成引导过程。她会读取init.rc, init_xxx.rc(跟制造商有关), 按照脚本引导。引导完毕之后init并不退出,继续负责property service的工作

20187621_2.jpg

需要首先阅读init.rc启动参数文档,里面有很多启动过程说明:

例子:

on boot

首先设置环境变量

export PATH /sbin:/system/sbin:/system/bin

export LD_LIBRARY_PATH /system/lib

创建文件目录并加载

mkdir /dev

mkdir /proc

mkdir /sys

mount tmpfs tmpfs /dev

mkdir /dev/pts

mkdir /dev/socket

mount devpts devpts /dev/pts

mount proc proc /proc

mount sysfs sysfs /sys

write /proc/cpu/alignment 4

ifup lo

hostname localhost

domainname localhost

mount yaffs2 mtd@system /system

mount yaffs2 mtd@userdata /data

导入init.conf

import /system/etc/init.conf

class_start default

启动service

service adbd /sbin/adbd

user adb

group adb

service usbd /system/bin/usbd -r

user usbd

group usbd

socket usbd 666

启动zygote,启动了它,我们的桌面就有着落了。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote

socket zygote 666

service runtime /system/bin/runtime

user system

group system

on device-added-/dev/compass

start akmd

on device-removed-/dev/compass

stop akmd

service akmd /sbin/akmd

disabled

user akmd

group akmd

第二步,就是要建立起android运行空间,担当此任务的是个重量级程序:Zygote,结合Servicemanager奠定了android运行基础。在init.rc(system\core\rootdir\init.rc)里面会有这一句话

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

如果zygote因为启动某些服务导致异常退出后,init将会重新去启动它

Zygote启动main函数(\frameworks\base\cmds\app_process\app_main.cpp)

里面有一句话是首先建立Android Runtime: runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);//建立虚拟机

//启动runtime在{\frameworks\base\core\jni\AndroidRuntime.cpp},

建立ZygoteInit(\frameworks\base\core\java\com\android\internal\os\zygoteinit.java)(装载Zygote,装载preloaded classes,装载Load preload资源,调用ForkSystemServer来fork一个systemserver新进程。)

里面包含了Zygote的机制(socket方式):

registerZygoteSocket()建立socket server

acceptCommandPeer()接受Android应用的socket命令

closeServerSocket()关闭Android应用的连接

startSystemServer()启动systemserver很重要的一步

经过这些步骤Zygote就建立好了,利用socket进程间通讯方式,接收ActivityManagerService的请求,Fork应用程序(runForkMode()这个函数里面的Zygote.fork();映射到linux进程得到一个pid)(关于linux fork函数,详细请参考http://doc.chinaunix.net/linux/201001/287354.shtml)

第三步: SystemServer:

在Zygote执行startSystemServer()之后,在Zygote上fork了一个进程com.android.server.SystemServer( pid = Zygote.forkSystemServer具体实现在具体实现在dalvik/vm/native/dalvik_system_Zygote.c)。

Android所有服务都是建立在SystemServer之上。这里需要简单介绍一下SystemServer(\frameworks\base\service\java\com\android\server\systemserver.java)

System.loadLibrary("android_servers");load android_servers.so,

调用Native方法init1()实现在com_android_server_SystemServer.cpp (frameworks\base\services\jni)其实仅调用system_init()(是现在System_init.cpp (frameworks\base\cmds\system_server\library)里面)

静态函数init2中启动一个新的线程来加载android服务:

(Entropy Service,Power Manager,Activity Manager,Telephony Registry,Package Manager,

Account Manager,Content Manager,SystemContent Providers,Battery Service,Hardware Service,Alarm Manager,Init Watchdog,Sensor Service,Window Manager,Bluetooth Service,Status Bar,Clipboard Service,InputMethod Service,NetStat Service,Connectivity Service,Accessibility Manager,Notification Manager,Mount Service,Device Storage Monitor,

Location Manager,Search Service,Checkin Service,Wallpaper Service,Audio Service,

Headset Observer,Dock Observer,Backup Service,AppWidget Service)

注意线程里面的这一句话,初始化完成了,给个systemReady()

// We now tell the activity manager it is okay to run third party

// code.  It will call back into us once it has gotten to the state

// where third party code can really run (but before it has actually

// started launching the initial applications), for us to complete our

// initialization.

((ActivityManagerService)ActivityManagerNative.getDefault())

.systemReady(new Runnable()

我们找到ActivityManagerService中的(实现在ActivityManagerService.java (frameworks\base\services\java\com\android\server\am))systemReady函数最后调用resumeTopActivityLocked,这个函数最终调用startHomeActivityLocked()来启动HOME程序,至此,我们的启动任务分析完成了。

参考文档:

http://blog.chinaunix.net/u1/38994/showart_1775465.html

http://blog.chinaunix.net/u1/38994/showart_1168440.html

http://blog.csdn.net/ruixj/archive/2010/05/26/5626816.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值