android内核字符驱动设备实战之----------应用框架层aidl服务编程篇

总结:

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接口:

    ~/Android$ mmm frameworks/base

   这样,就会根据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编译工具编译
      ~/Android$  mmm frameworks/base/services/java
  输出:out/target/product/generic/system/framework/services.jar
八、 重新打包Android系统镜像system.img:
      /Android$ make snod

你可能感兴趣的:(android内核字符驱动设备实战之----------应用框架层aidl服务编程篇)