Android硬件访问服务框架代码编写流程

[复制链接]

1234

主题

-8

回帖

216

积分

游客

积分
216
a420995601 发表于 2018-12-20 23:39:16 | 显示全部楼层 |阅读模式
  Android硬件访问服务框架代码编写流程
  思路从最上层调用到底层编写,流程如下:
  1 实现与APP直接对接的操作硬件的接口,这个最简单。
  只需要实现AIDL文件(Android Interface Define Language),其目的是让安卓系统自动帮我们实现对应用JAVA接口文件。
  PS:可以搜索源码中的例子比如:IVibrator.aidl,修改成如下代码:
  package.android.os
  Interface ILedService
  {
  int ledctrl(int which, int status);
  }
  1 上传AIDL文件
  将AIDL文件上传编译之前,需要先编译整个安卓源码(目前编译4412开发板)。编译完后上传到目录中,But,哪个目录?
  模仿其它AIDL文件在哪个目录,然后上传到相应的目录。
  /android-5.0.2/frameworkds/base/core/java/android/os目录下
  2 修改/android-5.0.2/frameworkds/base/下的Android.mk文件:
  增加一行:
  core/java/android/os/ILedService.aidl\
  3 输入mmm ./回车编译当前目录
  4 编译的结果放在/android-5.0.2/out/下
  find -name "ILedService.java"
  5 ILedService.java这个文件接口如何使用。
  先获取Service,然后将其转换为接口对象,然后调用这个接口对象的成员方法。
  总结:
  1 编写ILedService.aidl文件 ==>编译生成ILedService.java文件
  2 app使用:ILedService iLedService;
  iLedService = ILedService.Stub.asInterface(ServiceManager.getService("Led"))
  调用:iLedService.ledctrl(0, 1);
  所以用户APP层调用iLedService接口,但是这个接口并不直接操作硬件,操作硬件的是LedService.java,下面描述这个LedService.java程序怎么编写。注意,这个LedService.java的作用是调用本地Native方法来操作硬件。
  以下是源码:
  package com.android.server;
  import android.os.ILedService;
  public class LedService extends ILedService.Stub{
  private static final String TAG= "LedService";
  /* call native c function to access hardware */
  public int ledCtrl(int which, int status ) throw //要实现ILedService内的接口就是这个。
  {
  return native_ledCtrl(which, status);
  }
  //in struct method call ledOpen()
  public LedService ()
  {
  native_ledOpen();
  }
  //declare native local methods.
  public static native int native_ledCtrl(int which, int status );
  public static native int native_ledOpen();
  public static native void native_ledClose();
  }
  现在已经把LedService.java文件写好了,但是需要把它的这项服务告诉给SystemServer.java,故需要在SystemServer.java中添加这项服务,这里称之为addService. 方法如下:
  Slog.i(TAG, "LedService");
  ServiceManager.addService("Led", new LedService()); //添加服务接口
  总结:编写好应用层接口的LedService.java文件后,需要在SystemServer.java修改,添加服务:
  ServiceManager.addService("Led", new LedService());
  以上工作完成后,后面就需要实现注册Native本地方法(如下文件),即编写驱动的JNI封装,供LedService.java调用。
  com.android.Server.LedService.cpp:
  #define LOG_TAG "LedService"
  #include "jni.h"
  #include "JNIHep.h"
  #include "androd_runtime/AndroidRuntime.h"
  namespace android
  {
  int register_android_server_LedService(JNIEnv *..)
  {
  return jniRegisterNativeMethods(env,"comm/android/server/LedService",
  method_table, NELEM(method_table));
  }
  }
  。。。(后面就是之前写过的JNI程序)
  还要修改onload.cpp,在里面调用注册方法,如下:
  register_android_server_LedService(env);
  然后修改其Android.mk,并编译。
  编译方法如下:
  $ mmm frameworks/base/services (由于有不同层的文件有变化,找最上一层的 捕鱼游戏 星力捕鱼)
  $ make snod (生成镜像文件) ==》生成out/target/product/tiny4412/system.img,后面只需要将这个镜像文件烧入开发板即可
  $./gen-img.sh: 在此目录下(work/android-5.0.2/下)生成镜像文件(与out/.../system.img是一样的),此脚本还可以生成userdata.img。
  后面用minitool工作烧写安卓system.img即可。

你喜欢看
  • python如何操作Sql Server 2008

      python如何操作Sql Server 2008   最近由于公司的一个项目需要,需要使用Sql Server 2008数据库,开 ...

  • linux内核如何管理进程

      linux内核如何管理进程   “进程”有诸多的定义,在许多的教材资料上,其定义是一个程序的执行实例, ...