android framework添加系统服务

http://blog.csdn.net/pierce0young/article/details/24424991
在android源码中添加系统服务,如在android.app包下增加DevInfoManager.java, 按照如下步骤处理:
1. 在framework/base/core/java/android/app/目录下增加 DevInfoManager.java 及 IDevInfoManager.aidl 文件
注意:此处可以根据实际情况添加到合适的包中,在framework/base/core/java/andorid目录下。
DevInfoManager.java如下:
**************************************************************************************************
package android.app;

import android.os.Handler;
import andorid.os.RemoteException;
import android.util.Log;

public class DevInfoManager{

public static final String TAG = "DevInfoManager";
IDevInfoManager mService;
Handler mHandler;

public DevInfoManager(IDevInfoManager service, Handler handler){
mService = service;
mHandler = handler;
}

public String getValue(String name){
try{
return mService.getValue(name);
}catch(RemoteException e){
Log.d(TAG, "get value RemoteException");
}
return null;
}

public int update(String name, String value, int attribute){
try{
return mService.update(name, value, attribute);
}catch(RemoteException e){
Log.d(TAG, "update value RemoteException");
}
return -1;
}
}
**************************************************************************************************
IDevInfoManager.aidl文件如下:
**************************************************************************************************
package android.app;

/**{@hide}*/
interface IDevInfoManager{
String getValue(String name);
int setValue(String name, String value, int attribute);
}
**************************************************************************************************
如果在方法上面添加 /**{@hide}*/ 修饰的话,表示api不提供对外接口,在执行make update-api后不会出现在framework/base/core/java/android/content/Context中。

2. 添加相应的Service类,在framework/base/services/java/com/android/server下添加DevInfoService.java文件
DevInfoService.java文件如下:
**************************************************************************************************
package com.android.server;

import android.app.IDevInfoManager;
import android.util.Log;
import android.content.Context;

public class DevInfoService extends IDevInfoManager.Stub{

private static final String TAG = "DevInfoManagerService";
private Context mContext;

public DevInfoService(Context context){
mContext = context;
}

public String getValue(String name){
Log.d(TAG, "get name: " + name);
return name;
}

public int setValue(String name, String value, int attribute){
return 0;
}
}
**************************************************************************************************
注意:此处最好自建一个目录,不要打乱系统的存放目录的结构

3. 在SystemServer中生成该Service并添加到ServiceManager中:
在framework/base/services/java/com/android/server/SystemServer.java中添加:同其他服务一样,在startOtherServices()方法中添加:
**************************************************************************************************
DevInfoService devInfoService = null;

try{
devInfoService = new DevInfoService(context);
ServiceManager.addService(Context.DEVINFO_SERVICE, devInfoService);
}catch(Throwable e){
Slog.e(TAG, "add DevInfoService failure");
}
**************************************************************************************************
表示在SystemServer中启动服务

4. 需要在framework/base/core/java/android/app/ContextImpl.java中增加servcie注册,如下:
在StaticServiceFetcher抽象类中添加如下内容
**************************************************************************************************
registerService(DEVINFO_SERVICE, new DevInfoService(){
public Object createService(ContextImpl ctx){
IBinder b = ServiceManager.getService(DEVINFO_SERVICE);
IDevInfoManager service = IDevInfoManager.Stub.asInterface(b);
return new DevInfoManager(service, ctx.mMainThread.getHandler());
}
});
**************************************************************************************************

5. 在framework/base/core/java/android/content/Context.java中添加Services名称定义:
**************************************************************************************************
public static final String DEVINFO_SERVICE = "devinfo";
**************************************************************************************************

6. 在framework/base/Android.mk文件中的LOCAL_SRC_FILES添加 aidl 的声明:
LOCAL_SRC_FILES += \
core/java/android/app/IDevInfoManager.aidl \

7. 进行编译,因为framework有变更,所以需要先update-api,在然后编译framework
此处,执行make update-api去更新,如果方法没有家hide标记,就会在current.txt中找到你新加的服务方法。

8. 调用
import android.app.DevInfoService;
DevInfoService devInfoservice = (DevInfoService)this.getSystemService(Context.DEVINFO_SERVICE);






















你可能感兴趣的:(rom开发)