Android系统级服务

android framework java层服务分析1.android framework层服务

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层服务(闹铃,电源等)。

2.android framework层自己添加服务方式

根据需要有几种方式,

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

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

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

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

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

3.添加java 系统级服务步骤

目前网站上介绍的比较多,但是没有很详细的步骤和流程。现总结如下:以AlarmManagerService为例:

Java层服务顾名思义即为从Java层提供的服务,它与C++层的服务不同之处在于其服务进程的运行由系统(ServiceManager)统一维护。在文件frameworks /base /services /java /com /android /server /SystemServer.java 中我们可以看到以下代码:AlarmManagerService alarm = new AlarmManagerService (context );

ServiceManager .addService (Context .ALARM_SERVICE , alarm );

这个操作在系统启动时完成,由ServiceManager 负责创建服务进程并运行之。

在目录/frameworks/base/core/java中IAlarmManager.aidl文件.

在目录frameworks/base/services/java/com/android/server中AlarmManagerService的aidl 的实现类,

在目录frameworks/base/services/java/com/android/server增加service的实现文件. 4.实验测试添加java 系统级服务步骤:

1.增加aidl文件

在目录/frameworks/base/core/java/android/app下增加中IDvbService.aidl.

package android.app;

interface IDvbService {

int countTest(in int testvalue);

}

2.在目录frameworks/base/services/java/com/android/server中增加DvbManagerService 实现IDvbService.aidl类

package com.android.server;

import android.content.Context;

import android.util.Slog;

import android.app.IDvbService;

class DvbManagerService extends IDvbService.Stub {

private static final String TAG = "DvbManagerService";

private static final boolean localLOGV = false;

private final Context mContext;

public DvbManagerService(Context context) {

super();

mContext = context;

Slog.w(TAG, "DvbManagerService");

}

public int countTest(int value){

return value*2;

}

}

3.在文件frameworks /base /services /java /com /android /server /SystemServer.java 类中run()方法中增加

Slog.i(TAG, "Alarm DvbManagerService");

DvbManagerService dvb = new DvbManagerService(context);//dvb

Slog.i(TAG, "Alarm DvbManagerService dvb ="+dvb);

ServiceManager.addService(Context.DVB_SERVICE, dvb);

4.在文件/frameworks/base/core/java/android/content/Context.java中增加

public static final String DVB_SERVICE = "dvb";//dvb

5.在文件/frameworks/base/core/java/android/app中增加DvbManager.java

package android.app;

import android.content.Context;

import android.content.Intent;

import android.os.RemoteException;

import android.os.ServiceManager;

public class DvbManager{

//dvb

private final IDvbService mService;

/**

* package private on purpose

*/

DvbManager(IDvbService service) {

mService = service;

}

public int count(int value) {

try {

return mService.countTest(value);

} catch (RemoteException ex) {

}

return -1;

}

}

6.在文件/frameworks/base/core/java/android/app/ContextImpl.java中新增加属性

private static DvbManager sDvbManager;//dvb

在getSystemService(String name)方中增加

else if (DVB_SERVICE.equals(name)) {//dvb

return getDvbManager();

}

另外增加方法

private DvbManager getDvbManager() {//dvb

Log.e(TAG, "getDvbManager sSync = "+sSync);

Log.e(TAG, "getDvbManager sDvbManager = "+sDvbManager);

synchronized (sSync) {

if (sDvbManager == null) {

IBinder b = ServiceManager.getService(DVB_SERVICE);

Log.e(TAG, "getDvbManager IBinder = "+b);

IDvbService service = IDvbService.Stub.asInterface(b);

Log.e(TAG, "getDvbManager IDvbService = "+service);

sDvbManager = new DvbManager(service);

}

}

return sDvbManager;

}

7.在/frameworks/base/Android.mk中

LOCAL_SRC_FILES += \

下增加

core/java/android/app/IDvbService.aidl \

8.在应用调用如下:

导入import android.app.DvbManager;

用法

DvbManager dvb=(DvbManager)getSystemService(DVB_SERVICE);

int count = dvb.count(9);

Toast.makeText(

TVMainActivity.this,"dvb.count(9) back = "+count,

Toast.LENGTH_SHORT).show();

9.编译如下:

(1)首先编译frameworks

. build/envsetup.sh

choosecombo

make -j4 framework

编译后会生成framework.jar

(2)然后编译frameworks/base/services/java的service

make -j4 frameworks/base/services/java

编译后会生成services.jar

(3)编译应用

因为服务是自定义的,所有必须在自定义的sdk中编译才能使用。

相关文档
最新文档