編輯:關於Android編程
在數字科技日新月異的今天,軟件和硬件的完美結合,造就了智能移動設備的流行。今天大家對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層增加硬件訪問服務實現方法,後續繼續補充相關知識,謝謝大家的支持!
這幾個月一直在忙項目上的事情,所以已經有一段時間不寫博客,抽時間整理下最近的收藏夾,感覺還是有一些新的知識點可以分享的。先從最近的說起,近期項目上需要支持視頻播放功能,雖
1. 什麼是服務: Android中的四大組件, 是一個可以長時間在後台運行的不提供用戶界面的一個類. 2.服務的特性: 服務一旦被啟動無論啟動它的界面還存不存
基本概念本文主要講述Launcher3屏幕滑動過程,首先需要了解Android的觸摸事件分發機制。關於分發機制,可查看文章Android事件分發機制。常用類
記得第一次見到ViewPager這個控件,瞬間愛不釋手,做東西的主界面通通ViewPager,以及圖片切換也拋棄了ImageSwitch之類的,開始讓Vie