1. 程式人生 > >android framework新增系統服務

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);