关于系统服务的分析,以及如何实现添加系统服务,分析详细跳转链接:
Android系统服务(SystemService)简介
添加系统Service涉及的文件
修改文件:
Android.mk
api/current.txt
api/system-current.txt
api/test-current.txt
core/java/android/app/SystemServiceRegistry.java
core/java/android/content/Context.java
services/java/com/android/server/SystemServer.java
添加文件:
core/java/android/app/bingka/BingkaManager.java
core/java/android/app/bingka/Book.aidl
core/java/android/app/bingka/Book.java
core/java/android/app/bingka/IBingka.aidl
services/core/java/com/android/server/BingkaService.java
添加aidl文件后编译framework层,service,或者make update-api都提示没有aidl对应的java存在,一直编译不过。
处理方式如下:
- 去除所有相关修改,编译framework层;
- 重新添加相关修改,编译framework层,发现out目录下确实编译出了对应的java文件
添加后修改以上文件后,整编,烧录后手机不能正常启动,抓取log如下:
16263 16263 I SystemServer: StartBingkaService
16263 16263 D [BingkaService]: init...
321 321 E SELinux : avc: denied { add } for service=bingka pid=16263 uid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
321 321 E ServiceManager: add_service('bingka',3e) uid=1000 - PERMISSION DENIED
16263 16263 E System : ******************************************
16263 16263 E System : ************ Failure starting core service
16263 16263 E System : java.lang.SecurityException
16263 16263 E System : at android.os.BinderProxy.transactNative(Native Method)
16263 16263 E System : at android.os.BinderProxy.transact(Binder.java:764)
16263 16263 E System : at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:150)
16263 16263 E System : at android.os.ServiceManager.addService(ServiceManager.java:88)
16263 16263 E System : at com.android.server.SystemServer.startOtherServices(SystemServer.java:838)
16263 16263 E System : at com.android.server.SystemServer.run(SystemServer.java:416)
16263 16263 E System : at com.android.server.SystemServer.main(SystemServer.java:284)
16263 16263 E System : at java.lang.reflect.Method.invoke(Native Method)
16263 16263 E System : at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:452)
16263 16263 E System : at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:837)
发现应该是添加的系统Service因为权限问题被拒绝添加,导致系统的其他Service也无法正常启动,各种异常抛出,手机无法正常启动(回退SystemServer中的修改后手机可以正常启动)
需做如下修改(“bingka”:添加的系统Service名称):
AOSP/system/sepolicy
private/service_contexts
bingka u:object_r:bingka_service:s0
public/service.te
type bingka_service, app_api_service, system_server_service, service_manager_type;
AOSP/device/mediatek/sepolicy/
bsp/private/compat/26.0/26.0.ignore.cil
bingka_service
full/private/compat/26.0/26.0.ignore.cil
bingka_service
basic/private/compat/26.0/26.0.ignore.cil
bingka_service
修改后整编,即可解决。
对于AIDL中的方法入参TAG(in,out,inout)的分析:
- in:客户端的入参数据正常传给服务端,服务端对入参的修改对客户端的入参数据无任何影响;
- out:客户端的入参数据为空传给服务端,服务端对入参的修改同时作用于客户端的入参数据;
- inout:客户端的入参数据正常传给服务端,服务端对入参的修改同时作用于客户端的入参数据;
- 基本数据类型的前面不需要TAG来修饰,默认为in;
- 可以明显的看出,在TAG为inout的时候,系统的操作明显增加,所以在不必要的情况下,不轻易使用inout,一般情况下都是使用in。
修改文件如下:
SystemServer.java
import com.android.server.BingkaService;
private void startOtherServices() {
....
BingkaService bingka = null;
traceBeginAndSlog("StartBingkaService");
bingka = new BingkaService(context);
Ser