飞道的博客

五、Android硬件访问服务编写系统代码

274人阅读  评论(0)
  • 应用程序通过向service_manger查询请求获得getService调用ILedService.java这个接口,然后通过这个接口向SystemServer请求服务,实现对硬件的操作。这里的ILedService.java这个接口,不用自己写,只需要实现一个AIDL文件。我们写出这个aidl文件之后,用android系统里边的编译命令,让它帮我们自动生成这个接口文件。
    AIDL:Android Interface Definition Language,即Android接口定义语言。
  • 怎么写出这个aidl文件
    搜获aidl文件以振动器为例 * vibrator *aidl 找到IVibratorService.aidl文件
    拷贝这个文件到自己的目录,命名为ILedService.aidl ,修改内容,led服务中对于led应用程序,只需要点亮或者熄灭,所以声明一个接口,如下:
	package android.os;、
	interface ILedService
	{
		int ledCtrl(int which,int status);
	}

把这个aidl文件上传到服务器编译之前,要先编译好整个android系统。
Android系统庞大复杂,把aidl文件上传到哪里去呢,可以模仿振动器来做。

  1. 将aidl文件放到系统目录 /work/android-5.0.2/frameworks/base/core/java/android/os

  2. 修改 ``/work/android-5.0.2/frameworks/base/` 目录下的Android.mk,添加aidl文件

  3. 执行mmm

    命令 ,命令会根据目录下的Android.mk 把目录里边的文件编译出来,,编译可以生成ILedService.java,使用mmm命令的前提是要根据文档设置好环境变量,选择单板

    执行mmm命令是有可能找不到命令错误
    跳转到源码顶层目录,执行**. build/envsetup.sh**
    执行成功
    编译结果会放在 out目录中,搜索 find -name "ILedService.java"

    拿到windows下看下这个文件
    ILedService.java 文件中接口类 ILedService可以看到定义了ledCtrl() 接口方法

  4. 怎么调用ILedService 这个接口类呢,参考安卓源代码

  • 以振动器为例,全局搜索 IVibratorService


    首先定义了一个IVibratorService对象,
    实例化mService,从ServiceManager中获取"vibreator"名字的这个服务,然后转成接口赋给mService
    然后就可以掉用这些接口方法了

    编码

    1. 编写ILedService.aidl文件,编译得到ILedService.java这个文件

    2. 定义接口对象 ,实例化对象
      ILedSercice iLedService;
      iLedService = ILedService.Stub.asInterface(
      ​ ServiceManger.getService(“led”);
      );

    3. 就可以调用led控制方法了
      iLedService.ledCtrl(0,1);
      这个函数不会直接调用我们写的C函数,会把服务请求发送给LedService.java ,我们要编写LedService.java 在其中调用本地方法操作led

    4. 实现LedService.java 参考VibratorService.java

      • 定义类VibratorService
    5. 修改SystemServer.java
      addService

    6. 添加JNI文件,注册本地方法,供LedService.java使用

    - 
    

转载:https://blog.csdn.net/m0_46291920/article/details/104735933
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场