Android启动过程详解(1)——总体启动框架

本文详细介绍了Android系统的启动过程,包括init进程服务、Native服务启动、SystemServer及Android服务启动、Home应用程序启动等四大步骤。重点讲解了ZygoteService、ServiceManager、SystemServer等关键组件的作用。

在接下来的几篇博客中我会主要给大家讲一下Android系统的启动过程,之前也断断续续讲过PackageMangerService和Home程序的启动过程,但是没有系统的讲过,接下来将系统性地介绍整个系统的启动过程。包括主要的四大步骤:

  1. init进程服务
  2. Native服务启动
  3. SystemServer,Android服务启动
  4. Home应用程序启动

总体的启动流程如下图所示:
这里写图片描述
接下来的《Android启动过程详解》系列将以本图为框架进行介绍,重点包括四大步骤,以及各个步骤中的重点组件:Zygyte,ServiceManager,Dalvik VM, SystemServer,ActivityManagerService,PackageManagerService等等。

本文首先对整体的启动过程做一个简单的梳理。

1.initial进程(system/core/init)

init是一个由内核启动的用户级进程,在Linux内核启动完成后就会启动init进程,再由init进程来完成接下来加载过程。可以说init进程的启动才标志着Android空间的启动。Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:

(1) ZygoteService
(2) ServiceManager
……

这里的Service并不是Android应用层的Service概念,而是为整个系统服务的基础服务,其实现也是在Native层完成的。Init.rc是Android规定的初始化脚本,其包括了四种类型:

  1. Service
  2. Commands
  3. Options
  4. Actions

而init程序正是通过读取init.rc的文件来读取相关配置:

  • 读取init.rc的相关服务,添加到service_list中
  • 通过service_start,建立service进程

2.ZygoteService&ServiceManager

在系统启动的第二步中,init会启动一系列的Native Service,这其中最重要的就是ZygoteService和ServiceManager两个组件,通过Android应用框架之应用启动过程一文可以知道,ZygoteService最重要的作用就是通过socket监听来自AMS的应用创建指令,然后fork出新的进程作为新的应用进程。而ServiceManager则是管理各个Android系统级Service。

3.SystemServer

在创建好ZygoteService之后,它就会fork出一个进的进程来运行SystemServer,而SystemServer最为重要的一个工作就是启动各个系统级的Android应用服务,包括PackageManagerService, ActivityManagerService,WindowManagerService等等。SystemServer会开启一个ServerThread,然后在这个线程中启动上述各个Service,并通过addService添加对应的服务。

4.Home应用程序

PackageManagerService在启动后会读取所有应用程序的注册信息,而ActivityManagerService会在启动后启动Home应用程序,具体的过程参见:Android应用程序框架之Home程序(Launcher)

android电子签名,屏幕上手写签名 搜集很多资料,项目能够完美运行,拿来即可使用,整理备用 应用场景: 就是在屏幕是用手写字,然后保存成图片,简称就是电子签名,可以用在手机上签合同,等技术。 使用技术: 使用了接口回调,绘制完成之后给用户去操作 自定义Dialog,在dialog上画图,给dialog设置主题,dialog的宽高设置为手机屏幕的宽高充满全屏 注意在计算高度的时候记得减去通知栏的高度 注意把画布的背景设置为白色,不然点击缩略图查看的时候是全黑色 参考如下资料: http://hbxflihua.iteye.com/blog/1512765 http://www.jianshu.com/p/c4f017603413 https://github.com/gcacace/android-signaturepad http://download.youkuaiyun.com/download/mmlinux/7687091 1,android 如何让自定义dialog的宽度跟屏幕的宽度一样? 在你dialog.show();后面加上 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); lp.width = (int)(display.getWidth()); //设置宽度 dialog.getWindow().setAttributes(lp); 2,如何获取通知栏的高度? public int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 3,如何对图片进行压缩? http://blog.sina.com.cn/s/blog_497f718e0100sl13.html http://www.cnblogs.com/Soprano/articles/2577152.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值