构建服务基本框架
框架基本成员
1.1 AIDL (IArakawaManager.aidl)
文件位置:frameworks/base/core/java/android/app/IArakawaManager.aidl
package android.app;
/**
* @hide
*/
interface IArakawaManager {
String request(String msg);
}
1.2 ArakawaManager.kt
文件位置:frameworks/base/core/java/android/app/ArakawaManager.java
package android.app;
import android.annotation.SystemService;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.annotation.Nullable;
import android.os.ServiceManager;
import android.util.Singleton;
@SystemService(Context.ARAKAWA_SERVICE)
public class ArakawaManager {
private Context mContext;
/**
* @hide
*/
public ArakawaManager() {
}
/**
* @hide
*/
public static IArakawaManager getService() {
return IArakawaManagerSingleton.get();
}
@UnsupportedAppUsage
private static final Singleton<IArakawaManager> IArakawaManagerSingleton =
new Singleton<IArakawaManager>() {
@Override
protected IArakawaManager create() {
final IBinder b = ServiceManager.getService(Context.ARAKAWA.SERVICE);
final IArakawaManager im = IArakawaManager.Stub.asInterface(b);
return im;
}
};
@Nullable
public String requset(@Nullable String msg) {
try {
return getService().request(msg);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
1.3 修改Context
文件位置:frameworks/base/core/java/android/content/Context.java中 加入如下代码:
public abstract class Context {
@StringDef(suffix = { "_SERVICE" }, value = {
...,
ARAKAWA_SERVICE
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName
public static final String ARAKAWA_SERVICE="arakawa"
}
1.4 ArakawaManagerService
文件位置:frameworks/base/services/core/java/com/android/server/arakawa/ArakawaManagerService.java
public class ArakawaManagerService extends IArakawaManager.Stub{
@Override
public String request(String msg) throws RemoteException {
return "ArakawaManagerService get data:" + msg;
}
}
1.5 注册系统服务
文件位置:frameworks/base/services/java/com/android/server/SystemServer.java
在startOtherServices方法中增加如下代码
t.traceBegin("ArakawaService");
ServiceManager.addService(Context.ARAKAWA_SERVICE,new ArakawaManagerService());
t.traceEnd();
1.6 注册服务获取器
文件位置:frameworks/base/services/java/com/android/server/SystemServer.java 在静态块添加如下代码
registerService(Context.ARAKAWA_SERVICE, ArakawaManager.class, new CachedServiceFetcher<ArakawaManager>() {
@Override
public ArakawaManager createService(ContextImpl ctx) throws ServiceNotFoundException {
return new ArakawaManager();
}
});
1.7 配置SELinux
配置位于 system/sepolicy/prebuilts/api/32.0/private
system/sepolicy/private
的一些文件
service_contexts
activity_task u:object_r:activity_task_service:s0
#配置自定义服务selinux角色
arakawa u:object_r:arakawa_service:s0
service.te
type arakawa_service, app_api_service,ephemeral_app_api_service,system_server_service,service_manager_type;
untrusted_app_all.te
allow untrusted_app_all arakawa_service:service_manager find;
1.8 更新并编译
# 更新api
make update-api
# 编译
make
#运行模拟器
emulator