AOSP添加服务

AOSP添加服务


framework中添加我们自己的服务,添加步骤如下:

  • 整理知识

1.添加定义的接口
/framework/base/core/java/android/os/Iybftest.aidl

package android.os
interface Iybftest{
    int getNumber();
}

/framework/base/Android.mk
添加aidl文件
core/java/android/os/Iybftest.aidl
编译aidl ./framework/base$ mm -B
2.添加Manager
/framework/base/core/java/android/app/YbfManager.java

package android.app
import android.os.Iybftest;
import android.os.RemoteException;

public class YbfManager{
    private Iybftest mybftest;
    
    public YbfManager(Context context,Iybftest test){
    mybftest = test;
    }
    
    public int getNumber(){
        try{
        return mybftest.getNumber();
        }catch(RemoteException e){
            return -1;
        }
    }
}

3.添加服务
/framework/base/services/core/java/com/android/server/YbfService.java

package com.android.server
import android.os.Iybftest;
 
 pulice class YbfService extends Iybftest.Stub{
 public YbfService(){}
     @Override
     public int getNumber(){
     //可以调用jni接口
     return 10086;
    
    }
 }

4.添加到系统服务
/framework/base/services/java/com/android/server/systemServer.java

    startOtherServices(){
        ...
        try{
        ServiceMamager.addService("ybfserver",new YbfService());
        }catch(){}
    }
```
5.注册服务
/framework/base/core/java/android/app/SystemServiceRegistry.java

```
    static{
    
        ...
        registerService("ybfserver",YbfManager.class, new CachedServiceFetcher<YbfManager>()){
        @Oveeride
        public YbfManager createService(ContextImpl ctx){
        IBinder binder = ServiceMAnager.getService("ybfserver");
        Iybftest ybftes = Iybftest.Stub.asInterface(binder);
        retun new YbfManager(ybftes);
        }
    });

6.添加SELinux权限
/system/sepolicy/service_contexts

ybfserver    u:object_r:my_ybfserver:s0

/system/sepolicy/service.te

type my_ybfserver,app_api_service,system_api_service,system_server_service,service_manager_type;

更新api
make update-api -j8
7.代码全编
make -j8
8.编译完成后 刷如system.img 和boot.img

adb reboot bootloader
fastboot flash system    system.img
fastboot flash boot       boot.img
fastboot reboot

注意,如果不刷入boot.img 会出现SELinux权限问题
如下:

01-01 12:15:50.420 E/SELinux (  409): avc:  denied  { add } for service=ybfserver pid=1844 uid=1000 scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=0
01-01 12:15:50.420 E/ServiceManager(  409): add_service('ybfserver',25) uid=1000 - PERMISSION DENIED

测试添加的服务是否OK

YbfManager ybfmanager = (YbfManager)getSystemService("ybfserver");
Log.i(TAG,ybfmanager.getNumber()+"");

截图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了83 篇原创文章 · 获赞 19 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_38148680/article/details/105055582