1)创建aidl文件frameworks/base/core/java/android/os目录添加IHookStatus.aidl,内容如下
interface IHookStatus {
boolean IsOffhookByHost();
boolean IsOnhookByHost();
boolean IsOffhookByFxs();
boolean IsOnhookByFxs();
void setstatus(int which, boolean value);
}
frameworks/base/Android.mk添加编译
LOCAL_SRC_FILES += core/java/android/os/IHookStatus.aidl
2)frameworks/base/services/core/java/com/android/server/os目录添加HookStatusService.java,实现aidl文件定义的接口
package com.android.server.os;
import android.os.IHookStatus;
public class HookStatusService extends IHookStatus.Stub {
private static final String TAG = "HookStatusService";
@Override
public boolean IsOffhookByHost() {
return true;
}
@Override
public boolean IsOnhookByHost() {
return true;
}
@Override
public boolean IsOffhookByFxs() {
return true;
}
@Override
public boolean IsOnhookByFxs() {
return true;
}
@Override
public void setstatus(int which, boolean value) {
}
}
3) 将自定义Service 加入到SystemServer 启动进程,
先在 frameworks/base/core/java/android/content/Context.java 中添加一行
public static final String HOOKSTATUS_SERVICE = "hookstatus";
在frameworks/base/core/services/java/com/android/server/SystemServer.java startOtherServices函数的try块添加下面代码
traceBeginAndSlog("Start hookstatus service");
ServiceManager.addService(Context.HOOKSTATUS_SERVICE, new HookStatusService());
traceEnd();
4)创建服务Manager,即HookStatusManager
在frameworks/base/core/java/android/app/ 下创建HookStatusManager.java 文件,内容如下
package android.app;
import android.content.Context;
import android.util.Log;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.IHookStatus;
public class HookStatusManager {
private static final String TAG = "HookStatusManager";
private IHookStatus mService;
public static final int OFFHOOK_HOST = 0;
public static final int ONHOOK_HOST = 1;
public static final int OFFHOOK_FXS = 2;
public static final int ONHOOK_FXS = 3;
public HookStatusManager(Context ctx, IHookStatus service){
mService = service;
}
public boolean IsOffhookByHost() {
try {
return mService.IsOffhookByHost();
}catch(Exception e){
Log.e(TAG, "exception=" + e);
e.printStackTrace();
}
return false;
}
public boolean IsOnhookByHost() {
try {
return mService.IsOnhookByHost();
}catch(Exception e){
Log.e(TAG, "exception=" + e);
e.printStackTrace();
}
return false;
}
public boolean IsOffhookByFxs() {
try {
return mService.IsOffhookByFxs();
} catch(Exception e){
Log.e(TAG, "exception=" + e);
e.printStackTrace();
}
return false;
}
public boolean IsOnhookByFxs() {
try {
return mService.IsOnhookByFxs();
} catch(Exception e){
Log.e(TAG, "exception=" + e);
e.printStackTrace();
}
return false;
}
public void setstatus(int which, boolean value) {
try {
mService.setstatus(which, value);
}catch(Exception e){
Log.e(TAG, "exception=" + e);
e.printStackTrace();
}
}
}
5)自定义服务添加到SystemService
修改frameworks/base/core/java/android/app/SystemServiceRegistry.java 在静态代码块中增加
registerService(Context.HOOKSTATUS_SERVICE, HookStatusManager.class,
new CachedServiceFetcher<HookStatusManager>() {
@Override
public HookStatusManager createService(ContextImpl ctx) throws ServiceNotFoundException {
IBinder b = ServiceManager.getServiceOrThrow(Context.HOOKSTATUS_SERVICE);
return new HookStatusManager(ctx, IHookStatus.Stub.asInterface(b));
}
});
6)自定义服务sepolicy权限策略配置
system/sepolicy/prebuilts/api/26.0/private/service_contexts 以及 system/sepolicy/private/service_contexts两个配置文件分别添加
hookstatus u:object_r:hookstatus_service:s0
system/sepolicy/prebuilts/api/26.0/public/service.te 以及 system/sepolicy/public/service.te两个配置文件分别添加
type hookstatus_service, system_api_service, system_server_service, service_manager_type;