在Ubuntu上為Android系統的ApplicationFrameworks層增加硬體訪問服務
在數字科技日新月異的今天,軟體和硬體的完美結合,造就了智慧移動裝置的流行。今天大家對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生成相應的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介面來訪問硬體,敬請期待。
相關文章
- Ubuntu 增加埠訪問控制Ubuntu
- 在Ubuntu上開啟SSH服務Ubuntu
- ubuntu系統docker部署java後端服務和redis時,內網不能訪問UbuntuDockerJava後端Redis內網
- 在Mac系統上安裝redis服務MacRedis
- 在虛擬機器上搭建主機可訪問的web服務虛擬機Web
- Ubuntu系統(十)-Web服務配置UbuntuWeb
- ubuntu系統samba服務的安裝配置UbuntuSamba
- 在UBUNTU上訪問同機windows下的資料夾:UbuntuWindows
- 訪問硬體的設計模式設計模式
- 如何用 GPU硬體層加速優化Android系統的遊戲流暢度GPU優化Android遊戲
- Android系統服務編寫例項-Binder(Java層AIDL)AndroidJavaAI
- 《Android系統服務開發》作者金大佑訪談問題有獎徵集(圖靈訪談)Android圖靈
- 在Ubuntu上配置SSH訪問並關閉防火牆Ubuntu防火牆
- 硬貨!Zabbix監控AIX系統服務案例AI
- 將redis作為windows系統的系統服務RedisWindows
- 配置ACL在網路服務中訪問控制
- SAP Cloud for Customer使用移動裝置訪問系統的硬體要求Cloud
- docker內服務訪問宿主機服務Docker
- 7 Android中常用的系統服務Android
- java程式在windows系統作為服務程式執行JavaWindows
- NPD:2021年玩家在PC遊戲硬體和配件上的支出增加25%遊戲
- 管理連線系統中 Web 服務的體系結構問題Web
- 在 Linux 上將 BQ Aquaris Ubuntu 手機刷成 Android 系統LinuxUbuntuAndroid
- MongoDB 為系統新增MongoDB服務MongoDB
- 如何在 Ubuntu LTS 系統上啟用 Canonical 的核心實時補丁服務Ubuntu
- Android的硬體抽象層模組編寫規範Android抽象
- 關於mes系統硬體配置問題
- nodejs訪問WCF服務NodeJS
- Zookeeper 在Linux系統上的安裝,並且啟動zookeeper服務Linux
- 各硬體在OSI參考模型中的層次模型
- 日誌服務之分析使用者訪問行為
- 寶塔 ftp訪問不了的問題 filezilla訪問不了Purefpt服務FTP
- 最新版 Harbor 在ubuntu系統上安裝Ubuntu
- 在Github上,如何成為一個為開源服務的園丁Github
- Android系統為什麼不允許線上程中訪問UI呢?AndroidUI
- 請問在spring的業務層如何直接訪問 session ?SpringSession
- Linux時間設定系統時間、硬體時間和時間服務Linux
- Kotlin + Netty 在 Android 上實現 Socket 的服務端KotlinNettyAndroid服務端