Android/v8.log
上面三个红色标示的目录比较常用,建议用source insight建立好工程。
Android应用系统启动流程
上一节提到内核在最后加载根目录下的/init外部程序,从而离开kernel进入Android应用系统,/init的实现代码在system/core/init/init.c,入口函数是main(),这也是Android第一个启动进程和第一个用户进程/init,用它来完成引导。/init进程会读取init.rc, init_xxx.rc(跟制造商有关,MSD6A608是init_eagle.rc), 按照脚本引导。引导完毕之后init并不退出,继续负责property service的工作。
在脚本文件init.rc和init.eagle.rc里包含action和service,service通过fork()创建为一个个进程,如下图所示几个重量级进程:
servicemanager
ServiceMananger从名字上就可以看出来它是用来管理系统中的service,比如:tvservice、ActivityManagerService等。在ServiceManager中有两个比较重要的方法:add_service、check_service。系统的service需要通过add_service把自己的信息注册到ServiceManager中,当需要使用时,通过check_service检查该service是否存在。
servicemanager的代码在目录:
ics/frameworks/base/cmds/servicemanager
从它的主函数代码开始:
从main函数中可以看出,它主要做了三件事情:
1.打开/dev/binder设备,并在内存中映射128K的空间。 2.通知Binder设备,把自己变成context_manager
3.进入循环,不停的去读Binder设备,看是否有对service的请求,如果有的话,就去调用svcmgr_handler函数回调处理请求。
再来看看ServiceManager中是怎么样去注册服务的。当有对service的请求时,调用回调函数svcmgr_handler:
在该回调函数中会判断Service有什么需要,如果是请求注册service,那么就执行:
这样在ServiceManager中就完成了服务的注册和查找。来看下ServiceManager的功能图:
Svcmgr handler svclist Binder Looper ServiceManager
Binder Open
Binder块设备 system server system server用于启动各种系统服务线程,大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。
system server的代码在目录:
\\ics\\frameworks\\base\\services\\java\\com\\android\\server
从init2()函数开始:
该函数首先创建了一个ServerThread对象,该对象是一个线程,然后直接运行该线程,从ServerThread的run()方法内部开始真正启动各种服务线程。
Android IR按键处理流程
按键分为两种,虚拟按键和物理按键。IR按键属于物理按键的范畴,IR要作为输入设备,必须经过kernel驱动层注册为输入设别,这里主要是调用到kernel\\drivers\\input\\input.c里面的input_register_device函数去实现,如下:
@kernel\\drivers\\mstar\\ir\\mdrv_ir.c
@kernel\\drivers\\input\\input.c
Kernel负责处理按键,然后通过设备文件的方式提供给framework。frameworks/base/services/input定义各功能模块实现按键处理:
EventHub.cpp:实现对设备进行扫描并且判断是哪种设备; InputReader.cpp:对原始数据进行读取; InputDispatcher.cpp:实现数据的派发;
InputManager.cpp:按键事件处理的核心,通过创建两个线程InputReader和InputDispatcher,实现管理功能;
如果有输入法存在,则按键交给pinyinIME.java的onKeyDown处理;否则会判断是否是system key,如果是system key,交由PhoneWindwoManager.java和MstarTvServiceServerImpl.java处理,如果不是system key,交由具体activity处理。特别说明一下,hotkey的处理在MstarTvServiceServerImpl.java的onKeyDown函数。