java
frameworks/base/services/java/com/android/server/SystemServer.java
java
t.traceBegin("StartMyService");
ServiceManager.addService("MyService", new MyService());
t.traceEnd();
在进行定制化开发的时候,有时候需要通过AIDL的方式新建一些系统服务来满足特定的需求。一般来说都是客户自己的应用需要进行某些操作,但是通过现有的公开api没办法做到,这样就需要通过aidl服务来实现了。
关于aidl的内容就不多赘述了,今天主要是遇到了新增的服务向系统注册后,运行时系统找不到对应的selinux域(之前新增没有遇到过这种情况😂)。
错误:
java
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:949)
2026-06-09 15:30:08.537 27376-27376 AndroidRuntime system_server E *** FATAL EXCEPTION IN SYSTEM PROCESS: main
java.lang.SecurityException: SELinux denied.
at android.os.Parcel.createExceptionOrNull(Parcel.java:3079)
at android.os.Parcel.createException(Parcel.java:3063)
at android.os.Parcel.readException(Parcel.java:3046)
at android.os.Parcel.readException(Parcel.java:2988)
at android.os.IServiceManager$Stub$Proxy.addService(IServiceManager.java:468)
at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:72)
at android.os.ServiceManager.addService(ServiceManager.java:213)
at android.os.ServiceManager.addService(ServiceManager.java:180)
at com.android.server.SystemServer.startOtherServices(SystemServer.java:3367)
at com.android.server.SystemServer.run(SystemServer.java:988)
at com.android.server.SystemServer.main(SystemServer.java:700)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
问了下deepseek:
-
直接原因 :
SystemServer.startOtherServices中调用ServiceManager.addService()时被 SELinux 拒绝,抛出SecurityException,引发system_server进程FATAL EXCEPTION。 -
根本原因 :新添加的系统服务(很可能就是之前实现的
DeviceCtrlService)缺少相应的 SELinux 策略。system_server进程向servicemanager注册服务时,需要允许service_manager的add权限,并且服务名称需在策略中声明。
解决方法:
-
在
device/rockchip/common/sepolicy/private/service_contexts文件末尾添加一行:javaMyService u:object_r:my_service:s0 -
然后在同一目录下的
service.te(若不存在则新建)中定义类型和规则:javatype my_service, service_manager_type; -
最后在
system_server.te中允许添加该服务(可在device/rockchip/common/sepolicy/private/system_server.te中添加):javaallow system_server my_service:service_manager add;可能不同方案的sepolicy的路径不一样,这个就要根据自己的方案去找了。
-
亲测有效😊