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系统启动过程中就启动的服务,包括上面提到的三种方式,所以如果你想在系统启动时就提供类似的服务,
最好按照这种方式添加你的服务,而有的功能是不需要系统启动时候就初始化,那就没必要这么做,比如你可以在你的应用被调用时启动。