查看: 3055|回复: 6

芯灵思开发板安卓底层开发资料二十

[复制链接]
  • TA的每日心情
    奋斗
    2016-6-24 09:52
  • 签到天数: 112 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2015-11-6 12:11:42 | 显示全部楼层 |阅读模式
    分享到:
    这一期我们来学习一下Android  SystemServer所做的事情以及他的一个启动过程。
    首先我们要明白systemService是我们zygote孵化出来的第一个Android服务程序,而这个服务程序会在他的启动过程中,启动我们所有的Android的核心服务,下面我们来介绍几个主要的服务
    图片1.png
    其中Android systemserver他会派生出下面几个主要服务,首先是我们的电源相关的PowerManagerService以及BatteryService,一个是用来管理我们的电源,第二个是我们电池的一些服务,比如我们要从应用层得到我们电池的电量,我们就需要调用PowerManagerService,在写应用的时候要写上要有访问这个服务的权限。第二个是ActivityManagerService,这个是我们Android的一个核心服务,它主要用于我们Activity的一个管理。第三个是我们的PackageManagerService,他的启动过程需要一点时间,因为他在启动过程中要扫描我们系统中一些原有的jar包,如果我们用升级的方式将系统升级了,那么他会进行一下扫描,如果发现和我们升级前有所区别的话,就会重新生成这些包,第二个是要扫面我们系统中所有的应用程序,所提他的整个启动时间也需要1~2秒的时间。它主要是程序包的一个管理服务。第四个核心服务是WindowManagerService,它主要是用于管理我们窗口的一个服务,我们每一个activity申请的窗口都需要他来进行管理,而他主要是和我们的surfaceflinger这个服务来进行交互,我们没申请一个应用,他都需要拿过来申请一个窗口。第五个是我们打电话的服务。第六个是ContentService,这个主要提供进程数据交换的服务
    图片2.png
    一些外设的服务包括传感器服务,包括LightsService光感服务,和我们的震动服务VibratorService。当我们打电话时,手机接近我们的耳朵时,屏幕就会变黑,这就是我们光感来管理的。当我们来短信或者铃声时,手机会震动,它是由我们的震动服务来管理的。如果我们想操作手机震动,那么就必须获得这个服务,他才能触发底层的硬件,来完成这个动作。接下来就是我们的网络服务,他是我们Android系统中的一个重要的服务,在软件方面来看,也就是我们的上层来看,他可以分为手机网络管理服务;手机网络状态服务,他就是用来判断我们有没有连上网,联网的状态3g或者4g;还有就是WiFi热点的服务p2p的服务;还有就是WiFiservice,它主要是用于连接外网。最后一个是我们的网络连接状态服务。这些服务,他都是为我们WiFi这块来工作的。下面一个服务就是蓝牙服务,它主要是用来管理蓝牙的一些外设交互。还有就是一些其他的系统服务,比如输入法的服务等等,所以说我们Androidsystemservice是我们系统中很重要的一个服务。
    下面我们来看一下systemservice的一个启动过程
    图片3.png
    首先我们zygote启动之后他会启动我们的systemservice,创建一个进程,然后调用我们systemservice这噶函数的main方法去启动systemservice,当他启动之后,首先会对我们的dalvik.set进行一下自己的设置,然后去load我们systemservice所需要的native的库,load进来之后调用native的方法去把我们所需要的资源初始化一下,这个初始化过程主要是初始化sensorservice,比如我们的传感器,他都会在这里初始化完成,最后就会计入到我们的initAndLoop,把我们上边所说的所有服务,一条一条的初始化完成,嫁到我们的servicemanager中,加载完之后就会调用我们loop类中的loop方法,去处理一些消息,这个就是systemservice的一个启动过程
    下面我们来看一下代码systemservice是如何启动的,我们打开源代码frameworks/base/service/java/com/android/server/SystemServer.java,然后找到入口函数
    图片4.png
    在这里首先会进行一个SystemProperties.set的一个设置,设置完成之后,会对dalvik进行一下清理,然后进行一下自己的设置,然后load了我们的android_service.so,它主要是做一下sensorService的初始化工作,在这里也会调用我们的native方法,去把我们的sensorService初始化完成,我们来看一下这个native services。这个nativeInit是在我们的frameworks/base/services/jni/com_android_server_SystemServer.cpp
    图片5.png
    这里边只有一个jni的接口,就是我们的android_server_SystemServer_nativeInit,我们来看一下
    图片6.png
    他所做的事情就是service的一个初始化,当我们systemserver初始化的时候我们会在这里初始化sensorService,当他初始化完成之后,我们就进入到了initAndLoop,在这里我们会启动系统的所有服务
    图片7.png
    他在这里有一个setThreePriority的方法,它实际上就是定义一下我们线程的优先级,因为我们Android是一个多进程、多线程的一个操作系统。当我们使用这个方法来设置我们当前线程优先级的时候,我们Linux系统会根据你设置的优先级的策略,来决定他调度的一个频繁度,如果设置的等级比较高,那么他得到的调度时间和机会就比较大,在我们上层也可以设置这个setThreePriority。然后他就做了一些启动的操作,定义了所有相关的service,比如账号管理服务、LightsService等当我们把这些定义完之后,他会在接下来的操作过程中一个一个的进行初始化,就是创建一个对象,然后添加到我们的service的一个过程。其中一些服务是需要在我们systemservice的服务中来进行初始化的,比如我们的powermanagerservice,他在这里需要进行一个init,完成之后systemservice还需要判断一下他是否已经ready,这个就是来看一下我们的powermanagerservice是否完全起来,如果没有正常起来,那么就会剖出一个异常,打印一些消息出来,这时候我们必须保证我们这些关键的服务能正常init的。如果我们没有做这些ready的选项,那么当我们系统做一些其他操作的时候,我们很有可能去查一下他们有没有ready,如过没有ready,那么一些服务是不可用的,这时候就会出一些问题。当我们的systemservice把整个系统的服务全部启动,并且等待他完成之后呢,就会进入到一个Looper.loop(),他在这里要处理消息。我们来看一下
    图片8.png
    他在这里就是接收消息,处理一下消息,这些就是我们systemservice的一个启动过程

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-8-4 10:56
  • 签到天数: 242 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-11-6 12:22:37 | 显示全部楼层
    啥时候有块板子实践一下.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-24 09:52
  • 签到天数: 112 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-6 14:16:22 | 显示全部楼层
    木林森X 发表于 2015-11-6 12:22
    啥时候有块板子实践一下.

    看你想怎么得到板子了,如果做活动的话,得等一段时间,正在研发新的产品,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-11-6 20:28:09 | 显示全部楼层
    谢谢分享学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-24 09:52
  • 签到天数: 112 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-8 17:10:18 | 显示全部楼层
    suoma 发表于 2015-11-6 20:28
    谢谢分享学习一下

    常来哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-8-22 09:45
  • 签到天数: 44 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2015-11-8 18:09:08 | 显示全部楼层
    本帖最后由 芯灵思FAE 于 2015-11-9 09:29 编辑

    学习啦,多谢,先MARK
    FreescaleLogo.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-24 09:52
  • 签到天数: 112 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2015-11-9 09:32:39 | 显示全部楼层
    淘气坏坏 发表于 2015-11-8 18:09
    学习啦,多谢,先MARK

    常来啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 10:19 , Processed in 0.171958 second(s), 28 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.