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()+"");
截图如下: