android系统启动时会加载bootloader,之后会boot(kernel),之后会加载文件系统ramdisk,这里面包括加载的system,userdata,init.c,init.rc等,在解析init.rc 时会解析

service servicemanager/system/bin/servicemanager 会执行servicemanager.java servicemanager.cpp 会启动一个守护进程,

zygote /system/bin/app-process-xzygote/system/bin --zygote --start -system-server 会执行frameworks/base/cmds/app-process/ app -main.cpp(main()) ------------>

AndroidRuntime.cpp(start())----------------->JNI invoke-------------------------->ZygoteInit.java(main())--------------------------------->JNI----------->Systemserver VM--------> systemserver.java

到Systemserver .java时会首先执行main()方法,在main()方法里会调用init1(),init1()方法里会调用com-android-server-systemservice.cpp 会调到 system- init.cpp (完成了SurfaceFlinger的实例化等)------------------------------------>又调回到Systemserver.java里的init2()方法,这是一个循环闭合管理框架,我们下面重点看init2()方法

android framework层服务 是android启动时由systemServer ini2阶段的第一个java线程ServerTHread 初始化的,

framesorks/base/services/java/com/android/server/SystemServer.java

public static final void init2() {

Slog.i(TAG, "Entered the Android system server!");

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

ServerThread#run

- Entropy Service

- Power Manager

- Activity Manager

- Telephony Registry

- Package Manager

- Account Manager

- Content Manger

- System Content Providers

- Battery Service

- Lights Service

- Vibrator Service

- Alarm Manager

- Init Watchdog

- Window Manager

- Bluetooth Service

- Device Policy

- Status Bar

- Clipboard Service

- Input Method Service

- NetStat Service

- NetworkMnagement Service

- Connectivity Service

- Throttle Service

- Accessibility Manager

- Mount Service

- Notification Manager

- Device Storage Monitor

- Location Manager

- Search Service

- DropBox Service

- Wallpaper Service

- Audio Service

- Headset Observer

- Dock Observer

- USB Observer

- UI Mode Manager Service

- Backup Service

- AppWidget Service

- Recognition Service

- DiskStats Service

大部分服务都启动一个java线程在后台运转。

android framework层服务代码路径

android/frameworks/base/services

包含java层和jni层,有些服务需要访问硬件抽象层而需要jni层,jni提供给java层接口,java层最终生成service.jar,service.jar 依赖android.policy.jar,作为framework一部分存在。

jni通过c++访问硬件抽象层(libhardware),获取硬件功能,比如按键事件通过EventHub.cpp 提供硬件抽象层接口。

jni层生成动态库libandroid_servers.so

此库包含的服务如下:

com_android_server_AlarmManagerService.cpp //闹铃提醒服务

com_android_server_BatteryService.cpp //电源服务

com_android_server_KeyInputQueue.cpp //按键事件服务

com_android_server_LightsService.cpp //各种灯服务

com_android_server_SensorService.cpp //传感器服务

com_android_server_SystemServer.cpp //系统服务

com_android_server_VibratorService.cpp //步进电机服务

onlaod.cpp中 调用上面注册接口,加载动态库时调用JNI_Onload 初始化本地调用的绑定。

libandroid_servers.so 初始化时机:

由SystemServer进程加载,SystemServer 是虚拟机启动后运行的第一个java进程,SystemServer 代码位置 :

frameworks/base/services/java/com/android/server/SystemServer.java

加载完libandroid_servers.so后调用init1(system_init)初始化一些c/C++系统服务(media,camera等),

init2(ServerThread)创建java线程启动上面提到的java层各种服务(runtime->callStatic("com/android/server/SystemServer", "init2");)

在加载libandroid_servers.so时会调用JNI_OnLoad 函数,注册上面提到的各种jni 层服务(闹铃,电源等)。

android framework层添加自己服务方式:

根据需要有几种方式,

1. 如果服务不依赖底层库,可以直接在java层添加

2. 如果依赖外部c/c++库,则需要提供jni,在 android/frameworks/base/services/jni下对应添加jni层服务

3. 如果依赖硬件,则需要添加硬件抽象层接口和jni层,最终添加java层。

需要注意的是,上面提到的服务是在android系统启动过程中就启动的服务,包括上面提到的三种方式,所以如果你想在系统启动时就提供类似的服务,

最好按照这种方式添加你的服务,而有的功能是不需要系统启动时候就初始化,那就没必要这么做,比如你可以在你的应用被调用时启动。


更多相关文章

  1. Android中AppWidget加载流程(一)
  2. Android下拉刷新和上拉加载更多
  3. 实现Android ListView 自动加载更多内容
  4. Android 关于WebView加载完成的多种监听方式
  5. Android studio 下拉刷新,加载更多使用LoadingViewFinal
  6. Android 下拉加载更多 上拉刷新 框架 (太极 八卦样式刷新,支持自定
  7. Android 4.0: 旋转屏幕时禁止Activity重新加载

随机推荐

  1. android代码执行adb shell终端命令(linux
  2. Android(安卓)一个简易的自定义软键盘
  3. 让JNI告诉你 你的应用为什么被卸载
  4. 用.Net打造一个移动客户端(Android/IOS)的
  5. Android沉浸式状态栏完全解析
  6. 把Android源代码加入SDK,就可以按F3查看类
  7. android单元测试中的多线程以及handler消
  8. 彻底掌握Android多分包技术MultiDex-用An
  9. Android(安卓)学习笔记(9)—— ListView
  10. :关于做android+J2ee系统集成开发的一点心