Ubuntu中为Android实现Application Frameworks层增加硬件访问服务

在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的。硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序;而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能。对Android系统上的应用软件来说,就是要在系统的Application Frameworks层为其提供硬件服务。在前面的几篇文章中,我们着重介绍了Linux内核层、硬件抽象层和运行时库层提供的自定义硬件服务接口,这些接口都是通过C或者C++语言来实现的。在这一篇文章中,我们将介绍如何在Android系统的Application Frameworks层提供Java接口的硬件服务。

一. 参照在Ubuntu Android HAL编写JNI方法提供JAVA访问硬件服务接口一文所示,为硬件抽象层模块准备好JNI方法调用层。

  二. 在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间的通信需要通过代理来进行。为此,我们要先定义好通信接口。进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件:

USER-NAME@MACHINE-NAME:~/Android$ cd frameworks/base/core/java/android/os

USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl

IHelloService.aidl定义了IHelloService接口:

package android.os; 

interface IHelloService {
 void setVal(int val);
 int getVal();
} 

IHelloService接口主要提供了设备和获取硬件寄存器val的值的功能,分别通过setVal和getVal两个函数来实现。

三.返回到frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加IHelloService.aidl源文件:

## READ ME: ########################################################

 ##

 ## When updating this list of aidl files, consider if that aidl is

 ## part of the SDK API. If it is, also add it to the list below that

 ## is preprocessed and distributed with the SDK. This list should

 ## not contain any aidl files for parcelables, but the one below should

 ## if you intend for 3rd parties to be able to send those objects

 ## across process boundaries.

 ##

 ## READ ME: ########################################################

 LOCAL_SRC_FILES += /

 ....................................................................

 core/java/android/os/IVibratorService.aidl /

 core/java/android/os/IHelloService.aidl /

 core/java/android/service/urlrenderer/IUrlRendererService.aidl /

 .....................................................................

  四. 编译IHelloService.aidl接口:

USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base

这样,就会根据IHelloService.aidl生成相应的IHelloService.Stub接口。

五.进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件:

package com.android.server;
import android.content.Context;
import android.os.IHelloService;
import android.util.Slog;
public class HelloService extends IHelloService.Stub {
 private static final String TAG = "HelloService";
 HelloService() {
 init_native();
 }
 public void setVal(int val) {
 setVal_native(val);
 }
 public int getVal() {
 return getVal_native();
 } 

 private static native boolean init_native();
 private static native void setVal_native(int val);
 private static native int getVal_native();
}; 

HelloService主要是通过调用JNI方法init_native、setVal_native和getVal_native(见在Ubuntu Android HAL编写JNI方法提供JAVA访问硬件服务接口一文)来提供硬件服务。

   六. 修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码:

 @Override

 public void run() {

 ....................................................................................

 try {

  Slog.i(TAG, "DiskStats Service");

  ServiceManager.addService("diskstats", new DiskStatsService(context));

 } catch (Throwable e) {

  Slog.e(TAG, "Failure starting DiskStats Service", e);

 }

 try {

  Slog.i(TAG, "Hello Service");

  ServiceManager.addService("hello", new HelloService());

 } catch (Throwable e) {

  Slog.e(TAG, "Failure starting Hello Service", e);

 }

 ......................................................................................

 } 

   七. 编译HelloService和重新打包system.img:

USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/java

USER-NAME@MACHINE-NAME:~/Android$ make snod

这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务HelloService了,并且会在系统启动的时候,自动加载HelloService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。我们将在下一篇文章中描述如何编写一个Java应用程序来调用这个HelloService接口来访问硬件,敬请期待。

以上就是Android Application Frameworks层增加硬件访问服务实现方法,后续继续补充相关知识,谢谢大家的支持!

(0)

相关推荐

  • Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务

    我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务.        一. 参照在Ubuntu Android实现Application Frameworks层增加硬件访问服

  • Zend Framework教程之Application用法实例详解

    本文实例讲述了Zend Framework教程之Application用法.分享给大家供大家参考,具体如下: Zend_Application是Zend Framework的核心组件.Zend_Application为Zend Framework应用程序提供基本功能,是程序的入口点.它的主要功能有两个:装载配置PHP环境(包括自动加载),并引导应用程序. 通常情况下,通过配置选项配置Zend_Application构造器,但也可以完全使用自定义方法配置.以下是两个使用用例. Zend_Appli

  • Android Framework Application Framework层简单介绍

    引言 Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Framework层为我们开发应用程序提供了非常多的API,我们通过调用特殊的API构造我们的APP,满足我们业务上的需求.写APP的人都知道,学习Android开发的第一步就是去学习各种各样的API,什么Activity,Service,Notification等.这些都是framework提供

  • Zend Framework教程之配置文件application.ini解析

    本文分析了Zend Framework配置文件application.ini用法.分享给大家供大家参考,具体如下: 最方便,常用的配置方式使用配置文件.配置文件的具体的相关设置选项如下: php.ini的相关的配置选项,具体格式如下: phpSettings.配置选项,例如 phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 includePath相关配置 includePaths.library = APP

  • Zend Framework教程之Application和Bootstrap用法详解

    本文实例讲述了Zend Framework教程之Application和Bootstrap用法.分享给大家供大家参考,具体如下: 在一个MVC应用程序中,我们需要初始化建立数据库链接,配置视图和视图助手,配置布局,注册相关插件,注册action 助手等等,这些配置和准备工作我们都需要一一完成.有时候可能有一些初始化操作需要,但是在有些情况下这些初始化可能不需要.通过Zend_Application不仅仅可以完成这些操作,而且可以让这些配置和初始化工作更统一有序,重用性更高. Zend_Appli

  • Ubuntu中为Android实现Application Frameworks层增加硬件访问服务

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的.硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序:而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能.对Android系统上的应用软件来说,就是要在系统的Application Frameworks

  • Ubuntu中为Android HAL编写JNI方法提供JAVA访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务.我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口如何去访问C接口呢?众所周知,Java提供了JNI方法调用,同样,在Android系统中,Java应用程序通过

  • Ubuntu中为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

    在Ubuntu Android简单介绍硬件抽象层(HAL)一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着Ubuntu Android系统上编写Linux内核驱动程序实现方法一文中举例子说明了如何在Linux内核编写驱动程序.在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一方面实现,即如何在硬件抽象层中增加硬件模块来和内核驱动程序交互.在这篇文章中,我们还将学习到

  • Ubuntu中为Android系统上实现内置C可执行程序测试Linux内核驱动程序

    在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello.proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val.进一步,还通过cat命令来直接访问/proc/hello和/sys/class/hello/hello/val文件来,以验证驱动程序的正确性.在这一篇文章里,我

  • Ubuntu中为Android简单介绍硬件抽象层(HAL)

    Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节. 对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间.为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益.我们知道,Linux内

  • Ubuntu中为Android系统上编写Linux内核驱动程序实现方法

    在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore.随着Android系统逐步扩大市场占有率,终端设备的多样性亟需更多的移动开发人员的参与.据业内统计,Android研发人才缺口至少30万.目前,

  • Ubuntu中添加应用程序快速启动器的方法

    一些应用程序(例如很多.sh程序)如果想在Ubuntu中添加到Dash home中进行快速的启动,则需要找到/usr/share/applications这个目录,其中存放的全部是dash中的启动器,将你需要的程序xxx添加其中即可.具体操作步骤为: 命令行操作内容: cd /usr/share/applications sudo gedit xxx.desktop 打开需要编辑的文本内容为: [Desktop Entry] Version=1.0 Name=xxx Exec=/home/use

  • 在 Ubuntu 中使用 NTP 进行时间同步设置

    NTP 是通过网络来同步时间的一种 TCP/IP 协议.通常客户端向服务器请求当前的时间,并根据结果来设置其时钟. 这个描述是挺简单的,实现这一功能却是极为复杂的 - 首先要有多层 NTP 服务器,第一层 NTP 服务器连接原子时钟,第二层.第三层服务器则担起负载均衡的责任,以处理因特网传来的所有请求.另外,客户端可能也超乎你想象的复杂 - 它必须排除通讯延迟,调整时间的同时不干扰其它在服务器中运行的进程.幸运的是,所有的这些复杂性都进行了封装,你是不可见也不需要见到的. 在 Ubuntu 中,

随机推荐