总结:
AIDL服务建立过程:
1、定义AIDL接口。
2、根据接口,通过编译器内部规则,自动编译生成内部静态抽象类ITestService.Stub,这个类继承了Binder类,并实现ITestService接口。
3、创建一个继承这个ITestService.Stub类的具体类TestService
4、通过系统服务(SystemServer)的服务管理器(ServiceManager.)把这个类作为服务添加到系统服务中即可。
服务调用过程:
1、通过服务管理器(ServiceManager)获得给服务类ITestService.Stub
2、通过ITestService.Stub的函数asInterface获得接口。
3、通过接口,就可以调用接口里的函数了。
注意事项:
1、应用框架层,是系统的API,包含了应用开发所用的所有SDK类库,同时,也有一些没公开接口的类库,只能系统内部使用。
2、ServiceManager.addService("test", new TestService());,服务名test要小写,否则在调用服务时,可能出现异常(原因也许是API的编写规范要求)
3、mmm是对单个模块进行编译,一旦修改i啊了API则需要全部重新编译
4、该层的编程,由于改变了系统的API,所以要对整个android系统进行更新:make update-api更新API
5、然后对整个系统进行重新编译:make
一、预备知识及说明
1、什么是aidl:android interface definitiong language 即android 接口定义语言,它是为android进程间通信提出的。
android系统中,进程间不能共享内存,因此需要提供一种机制,使进程间进行数据通信,为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。
2、什么是aidl 服务:也属于android四大组件之一的服务service的一种,只不过它比普通的服务要复杂些
二、在/Android/frameworks/base/core/java/android/os目录下创建接口定义文件 ITestService.aidl
内容如下:
package android.os;
interface ITestService
{
void setVal(int val);
int getVal();
}
三、修改frameworks 基础编译文件
frameworks/base/Android.mk,
在LOCAL_SRC_FILES变量中,添加
ITestService.aidl文件路径
如下:
LOCAL_SRC_FILES += \
....
core/java/android/os/IHelloService.aidl \
添加这个路径,使编译时,能够编译该接口文件
四.、编译IHelloService.aidl接口:
这样,就会根据ITestService.aidl生成相应的内部静态抽象类ITestService.Stub,这个类在系统的android.os包中,类全名为android.os.ITestService,这个类继承了Binder类,并实现ITestService接口。
五、进入到frameworks/base/services/java/com/android/server目录,新增TestService.java文件
//该类属于android服务包
package com.android.server;
import android.content.Context;
import android.util.Slog;
//导入这个类要实现的类
import android.os.ITestService;
public class TestService extends ITestService.Stub
{
private static final String TAG = "TestService";
//构造函数,该类实例化时,最终将打开设备文件
TestService(){
init_native();
}
public void setVal(int val) {
setVal_native(val);
}
public int getVal() {
return getVal_native();
}
//以下是要调用jni函数的声明
private static native boolean init_native();
private static native void setVal_native(int val);
private static native int getVal_native();
};
六、修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载TestService的代码
//自己添加的测试服务
try {
Slog.i(TAG, "Test Service");
ServiceManager.addService("test", new TestService());
} catch (Throwable e) {
Slog.e(TAG, "Failure starting Test Service", e);
}
七.、编译:
//执行shell命令,获取mmm编译工具
~/Android$. ./build/envsetup.sh
//用mmm编译工具编译输出:out/target/product/generic/system/framework/services.jar