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 动画之Scroller
  2. XmlPullParser.nextText() bug 好文章,使用pull解析xml注意
  3. 关于android instrumentation的理解、使用
  4. Android(安卓)对话框(Dialog)大全
  5. Android四种Activity的加载模式
  6. 服务端和Android客户端利用Socket传输JSON数据
  7. Android(安卓)Activity的启动过程(API27 源码分析)
  8. android服务和进程详解
  9. Android将Service服务打包jar供三方调用

随机推荐

  1. Android(安卓)gesture 原理
  2. android ViewPager 实现点击小圆点切换页
  3. activity的几种启动模式
  4. Android(安卓)display架构分析-SW架构分
  5. Android保存位图
  6. Android实现再图标右上角显示数字
  7. Android:SQLite数据库
  8. fatal error: libavutil/avconfig.h: No
  9. gradle批量打包Android(安卓)apk:不同的包
  10. android自定义属性三部曲