在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务---Android8.0版本实现-对照老罗版本

本文介绍如何在Android 8.0的Application Frameworks层添加硬件服务,使应用程序能通过Java接口访问硬件。详细步骤包括编写JNI方法、定义接口、创建服务、修改SystemServer加载服务、设置selinux权限,以及编译系统。
摘要由CSDN通过智能技术生成

        老罗版本参见:https://blog.csdn.net/luoshengyang/article/details/6578352

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

      完整代码见:链接:https://pan.baidu.com/s/1xgPfnR-s-k-SLQ-B2IQR7g 
      提取码:hzx1

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

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

      zh@ubuntu:sourcecode/trunk/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源文件:

   LOCAL_SRC_FILES += /

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

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

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

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

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

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

package com.android.server;
import android.content.Context;
import android.os.IHelloService;
import android.util.Log;
public class HelloService extends IHelloService.Stub {
	private static final String TAG = "HelloService";
	HelloService() {
		Log.d(TAG, "HelloService init_native");
		init_native();
	}
	public void setVal(int val) {
        Log.d(TAG, "HelloService setVal val:" + val);
		setVal_native(val);
	}	
	public int getVal() {
        Log.d(TAG, "HelloService getVal val");
		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访问硬件服务接口---Android8.0版本实现-对照老罗版本一文)来提供硬件服务。

五. 修改frameworks/base/services/java/com/android/server/SystemServer.java文件,在startOtherServices()中增加加载HelloService的代码:

		 // add HelloService start
		 try {
			 traceBeginAndSlog("HelloService");
			  Slog.i(TAG, "add HelloService");
			  ServiceManager.addService("hello", new HelloService());
			 traceEnd();
         } catch (RuntimeException e) {
			 Slog.e("HelloService", "******************************************");
			 Slog.e("HelloService", "************ Failure starting HelloService", e);
		}
		 // add 
		} catch (RuntimeException e) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting core service", e);
   

六.为hello服务添加selinux权限:

    1.修改system/sepolicy/private/service_contexts

 bluetooth                                 u:object_r:bluetooth_service:s0
+hello                                     u:object_r:hello_service:s0

     2.修改system/sepolicy/public/service.te

+type hello_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
type search_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

七. 编译系统:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值