笔记:自定义系统服务

108 阅读1分钟

构建服务基本框架

框架基本成员

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