導航:首頁 > 操作系統 > androidrpc框架

androidrpc框架

發布時間:2024-09-19 21:51:18

android 管理介面地址

說到 android 驅動是離不開 linux 驅動的。Android 內核採用的是 Linux2.6 內核 (最近Linux 3.3 已經包含了一些 Android 代碼)。但 Android 並沒有完全照搬 Linux 系統內核,除了對Linux 進行部分修正,還增加了不少內容。android 驅動 主要分兩種類型:Android 專用驅動 和 Android 使用的設備驅動(linux)。 Android 專有驅動程序: 1)Android Ashmem 匿名共享內存; 為用戶空間程序提供分配內存的機制,為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存。 2)Android Logger 輕量級的LOG(日誌) 驅動; 3)Android Binder 基於 OpenBinder 框架的一個驅動; 4)Android Power Management 電源管理模塊; 5)Low Memory Killer 低內存管理器; 6)Android PMEM 物理內存驅動; 7)USB Gadget USB 驅動(基於 gaeget 框架); 8)Ram Console 用於調試寫入日誌信息的設備; 9)Time Device 定時控制設備; 10)Android Alarm 硬體時鍾; Android 上的設備驅動: 1)Framebuff 顯示驅動; 2)Event 輸入設備驅動; 3)ALSA 音頻驅動; 4)OSS 音頻驅動; 5)v412攝像頭:視頻驅動; 6)MTD 驅動; 7)藍牙驅動; 8)WLAN 設備驅動; Android 專有驅動程序 1.Android Ashmem 為用戶空間程序提供分配內存的機制,為進程間提供大塊共享內存,同時為內核提供回收和管理這個內存。 設備節點:/dev/ashmen .主設備號 10. 源碼位置: include/linux/ashmen.h Kernel /mm/ashmen.c 相比於 malloc 和 anonymous/named mmap 等傳統的內存分配機制,其優勢是通過內核驅動提供了輔助內核的內存回收演算法機制(pin/unoin) 2.Android Logger 無論是底層的源代碼還上層的應用,我們都可以使用 logger 這個日誌設備看、來進行調試。 設備節點: /dev/log/main /dev/log/event /dev/log/radio 源碼位置:include/linux/logger.h include/linux/logger.c 3.Android Binder IPC Binder 一種進程間通信機制。他的進程能夠為其它進程提供服務 ----- 通過標準的 Linux 系統調用 API。 設備節點 :/dev/binder 源碼位置:Kernel/include/linux/binder.h Kernel/drivers/misc/binder.c 4.Android Power Management 一個基於標准 linux 電源管理的輕量級 Android 電源管理系統,在 drivers/android/power.c kernel/power/ 5.Low Memory Killer 它在用戶空間中指定了一組內存臨界值,當其中某個值與進程描述中的 oom_adj 值在同一范圍時,該進程將被Kill掉(在parameters/adj中指定oome_adj 的最小值)。它與標準的Linux OOM機制類似,只是實現方法不同 源碼位置:drivers/misc/lowmemorykiller.c 6.Android PMEM PMEM 主要作用就是向用戶空間提供連續的物理內存區域。 1.讓 GPU 或 VPU 緩沖區共享 CPU 核心。 2.用於 Android service 堆。 源碼位置:include/linux/android_pmem.h drivers/android/pmem.c 7.USB Gadget 基於標准 Linux USB gaeget 驅動框架的設備驅動。 源碼位置:drivers/usb/gadet/ 8.Ram Console 為了提供調試功能,android 允許將調試日誌信息寫入這個設備,它是基於 RAM 的 buffer. 源碼位置: drivers/staging/android/ram_console.c 9.Time Device 定時控制,提供了對設備進行定時控制的功能。 源碼位置:drivers/staging/android/timed_output.c(timed_gpio.c) 10.Android Alarm 提供一個定時器,用於把設備從睡眠狀態喚醒,同時它還提供了一個即使在設備睡眠時也會運行的時鍾基準。 設備節點:/dev/alarm 源碼位置:drivers/trc/alarm.c Android 設備驅動 1. Framebuffer 幀緩存設備 Framebuffer 驅動在 Linux 中是標準的顯示設備的驅動。對於 PC 系統,它是顯卡的驅動 ; 對於嵌入式 SOC 處理器系統,它是 LCD 控制器或者其他顯示控制器的驅動。它是一個字元設備,在文件系統中設備節點通常是 /dev/fbx 。 每個系統可以有多個顯示設備 , 依次用 /dev/fbO 、 /dev/fb l 等來表示。在 Android 系統中主設備號為 29 ,次設備號遞增生成。 Android 對 Framebuffer 驅動的使用方式是標準的 , 在 / dev / graphie / 中的 Framebuffer 設備節點由 init 進程自動創建 , 被 libui 庫調用 。 Android 的 GUI 系統中 , 通過調用 Framebuffer 驅動的標准介面,實現顯示設備的抽象。 Framebuff的結構框架和實現 : linux LCD驅動(二)--FrameBuffer Linux LCD驅動(四)--驅動的實現 2.Event輸入設備驅動 Input 驅動程序是 Linux 輸入設備的驅動程序 , 分為游戲桿 (joystick) 、 滑鼠 (mouse 和 mice)和事件設備 (Event queue)3 種驅動程序。其中事件驅動程序是目前通用的程序,可支持鍵盤 、 滑鼠、觸摸屏等多種輸入設備。 Input 驅動程序的主設備號是 l3 ,每一種 Input 設備從設備號占 用5 位 , 3 種從設備號分配是 : 游戲桿 0 ~ 61 ; Mouse 滑鼠 33 ~ 62 ; Mice 滑鼠 63 ; 事件設備 64 ~ 95 ,各個具體的設備在 misc 、 touchscreen 、 keyboard 等目錄中。 Event 設備在用戶空問使用 read 、 ioctl 、 poll 等文件系統的介面操作, read 用於讀取輸入信息, ioctl 用於獲取和設置信息, poll 用於用戶空間的阻塞,當內核有按鍵等中斷時,通過在中斷中喚醒內核的 poll 實現。 Event 輸入驅動的架構和實現: Linux設備驅動之——input子系統 3.ALSA音頻驅動 高級 Linux 聲音體系 ALSA(Advanced Linux Sound Architecture ) 是為音頻系統提供驅動 的Linux 內核組件,以替代原先的開發聲音系統 OSS 。它是一個完全開放源代碼的音頻驅動程序集 ,除了像 OSS 那樣提供一組內核驅動程序模塊之外 , ALSA 還專門為簡化應用程序的編寫提供相應的函數庫,與 OSS 提供的基於 ioctl 等原始編程介面相比, ALSA 函數庫使用起來要更加方便一些 利用該函數庫,開發人員可以方便、快捷地開發出自己的應用程序,細節則留給函數庫進行內部處理 。 所以雖然 ALSA 也提供了類似於 OSS 的系統介面 , 但建議應用程序開發者使用音頻函數庫,而不是直接調用驅動函數。 ALSA 驅動的主設備號為 116 ,次設備號由各個設備單獨定義,主要的設備節點如下: / dev / snd / contmlCX —— 主控制 ; / dev / snd / pcmXXXc —— PCM 數據通道 ; / dev / snd / seq —— 順序器; / dev / snd / timer —— 定義器。 在用戶空問中 , ALSA 驅動通常配合 ALsA 庫使用 , 庫通過 ioctl 等介面調用 ALSA 驅動程序的設備節點。對於 AIJSA 驅動的調用,調用的是用戶空間的 ALsA 庫的介面,而不是直接調用 ALSA 驅動程序。 ALSA 驅動程序的主要頭文件是 include / sound ./ sound . h ,驅動核心數據結構和具體驅動的注冊函數是 include / sound / core . h ,驅動程序 的核心實現是 Sound / core / sound . c 文件。 ALSA 驅動程序使用下面的函數注冊控制和設備: int snd _ pcm _ new (struct snd _ card * card , char * id , int device , int playback _ count , int capture _ count , struct snd _ pcm ** rpcm) ; int snd ctl _ add(struct snd _ card * card , struct snd _ kcontrol * kcontro1) ; ALSA 音頻驅動在內核進行 menuconfig 配置時 , 配置選項為 「 Device Drivers 」 > 「 Sound c ard support 」 一 > 「 Advanced Linux Sound Architecture 」 。子選項包含了 Generic sound devices( 通用聲音設備 ) 、 ARM 體系結構支持,以及兼容 OSS 的幾個選項。 ALsA 音頻驅動配置對應的文件是sound / core / Kconfig 。 Android 沒有直接使用 ALSA 驅動,可以基於 A-LSA 驅動和 ALSA 庫實現 Android Audio 的硬體抽象層; ALSA 庫調用內核的 ALSA 驅動, Audio 的硬體抽象層調用 ALSA 庫。 4.OSS音頻驅動 OSS(Open Sound System開放聲音系統)是 linux 上最早出現的音效卡驅動。OSS 由一套完整的內核驅動程序模塊組成,可以為絕大多數音效卡提供統一的編程介面。 OSS 是字元設備,主設備號14,主要包括下面幾種設備文件: 1) /dev/sndstat 它是音效卡驅動程序提供的簡單介面,它通常是一個只讀文件,作用也只限於匯報音效卡的當前狀態。(用於檢測音效卡) 2)/dev/dsp 用於數字采樣和數字錄音的設備文件。對於音頻編程很重要。實現模擬信號和數字信號的轉換。 3)/dev/audio 類似於/dev/dsp,使用的是 mu-law 編碼方式。 4)/dev/mixer 用於多個信號組合或者疊加在一起,對於不同的音效卡來說,其混音器的作用可能各不相同。 5)/dev/sequencer 這個設備用來對音效卡內建的波表合成器進行操作,或者對 MIDI 匯流排上的樂器進行控制。 OSS 驅動所涉及的文件主要包括: kernel/include/linux/soundcard.h kernel/include/linux/sound.h 定義 OSS 驅動的次設備號和注冊函數 kernel/sound_core.c OSS核心實現部分 5.V4l2視頻驅動 V4L2是V4L的升級版本,為linux下視頻設備程序提供了一套介面規范。包括一套數據結構和底層V4L2驅動介面。V4L2提供了很多訪問介面,你可以根據具體需要選擇操作方法。需要注意的是,很少有驅動完全實現了所有的介面功能。所以在使用時需要參考驅動源碼,或仔細閱讀驅動提供者的使用說明。 V4L2的主設備號是81,次設備號:0~255,這些次設備號里也有好幾種設備(視頻設備、Radio設備、Teletext、VBI)。 V4L2的設備節點: /dev/videoX, /dev/vbiX and /dev/radioX Android 設備驅動(下) MTD 驅動 Flash 驅動通常使用 MTD (memory technology device ),內存技術設備。 MTD 的字元設備: /dev/mtdX 主設備號 90. MTD 的塊設備: /dev/block/mtdblockX 主設備號 13. MTD 驅動源碼 drivers/mtd/mtdcore.c:MTD核心,定義MTD原始設備 drivers/mtd/mtdchar.c:MTD字元設備 drivers/mtd/mtdblock.c:MTD塊設備 MTD 驅動程序是 Linux 下專門為嵌入式環境開發的新一類驅動程序。Linux 下的 MTD 驅動程序介面被劃分為用戶模塊和硬體模塊: 用戶模塊 提供從用戶空間直接使用的介面:原始字元訪問、原始塊訪問、FTL (Flash Transition Layer)和JFS(Journaled File System)。 硬體模塊 提供內存設備的物理訪問,但不直接使用它們,二十通過上述的用戶模塊來訪問。這些模塊提供了快閃記憶體上讀、寫和擦除等操作的實現。 藍牙驅動 在 Linux 中,藍牙設備驅動是網路設備,使用網路介面。 Android 的藍牙協議棧使用BlueZ實現來對GAP, SDP以及RFCOMM等應用規范的支持,並獲得了SIG認證。由於Bluez使用GPL授權, 所以Android 框架通過D-BUS IPC來與bluez的用戶空間代碼交互以避免使用未經授權的代碼。 藍牙協議部分頭文件: include/net/bluetooth/hci_core.h include/net/bluetooth/bluetooth.h 藍牙協議源代碼文件: net/bluetooth/* 藍牙驅動程序部分的文件: drivers/bluetooth/* 藍牙的驅動程序一般都通過標準的HCI控制實現。但根據硬體介面和初始化流程的不同,又存在一些差別。這類初始化動作一般是一些晶振頻率,波特率等基礎設置。比如CSR的晶元一般通過BCSP協議完成最初的初始化配置,再激活標准HCI控制流程。對Linux來說,一旦bluez可以使用HCI與晶元建立起通信(一般是hciattach + hciconfig),便可以利用其上的標准協議(SCO, L2CAP等),與藍牙通信,使其正常工作了。 WLAN 設備驅動(Wi-Fi)(比較復雜我面會專門寫個wifi分析) 在linux中,Wlan設備屬於網路設備,採用網路介面。 Wlan在用戶空間採用標準的socket介面進行控制。 WiFi協議部分頭文件: include/net/wireless.h WiFi協議部分源文件: net/wireless/* WiFi驅動程序部分: drivers/net/wireless/*

② Android基於vsomeIp3與VDC或者VIU通信

部門需要開發一款App用於演示VDC或者VIU的功能,進一步控制汽車部件做出反應

作為一個對硬體,甚至對汽車沒一絲了解的Android開發,第一時間並不想跳出舒適圈,腦子里立馬浮現出一個場景,同一區域網內直接使用Socket通信。說干就干,啪啪啪,編碼完成,一個基於C/S架構的Demo完成,領導看了看,有沒有一種可能,板子上不需要重新寫程序,直接使用板子已有的someIp協議進行通訊。what?

SOME/IP全稱Scalableservice-Oriented Middleware over IP,基於IP的可擴展面向服務的中間件,是一種專用於汽車嵌入式的客戶端/伺服器通信機制,訪問方式分別為事件通知event和RPC遠程調用

Message ID(Server ID) :16bit,服務的ID,標識出一個服務;
Message ID(Method ID) :16bit,方法的ID,表示出一個方法;
Length:報文長度,32bit,標識從request ID到報文結束的總長度;
Request ID(Client ID) :客戶端ID,16bit。區分不同的客戶端;
Request ID(Session ID) :會話ID,區分同一個客戶端的多次調用;
Protocol Version :協議的版本號,固定值為x01;
Interface Version:服務介面版本;
Message Type :報文類型,在AUTOSAR中,總共包含五種,包括REQUEST,REQUEST_NO_RETURN,NOTIFICATION,RESPONSE,ERROR;
Return Code :返回碼,包括四種,REQUEST,REQUEST_NO_RETURN,NOTIFICATION,RESPONSE;
Payload :數據段,用於放置需要傳輸的數據

平時開發App,Android的主要的開發語言是java和kotlin,那如果我們能通過java直接構建Someip消息體是否就能正常通信了?然後悲哀的發現光是按標准組建消息體 就是一個難度不小的挑戰,更別說還要能構建通信通道,正常解析數據。又是一頓google search,發現BMW開源了一個實現someip的庫vSomeIp

查看這個庫的過程中,我發現了一個名字非常數據的文件CMakeLists.txt,Android開發中使用JNI的方式調用函數,通過Cmake構建so庫好像都跟這個文件有關,那是不是意味著Android可以通過JNI 的方式調用vSomeIp庫,從而實現與硬體的通訊

基於上個git項目,其實已經能夠完成單個應用內的someip通訊了,所以對於那個git項目已有的配置就不多做描述了。
但是要想與VDC或者VIU在一個區域網環境內通訊還要另外做配置。

以上是Android作為client端 基於someip協議與硬體通訊的一個大致配置,本人已驗證,可行,撒花~~

③ android怎麼與pc上的進程進行rpc通信

理解Android系統的進程間通信原理(二)----RPC機制

理解Android系統中的輕量級解決方案RPC的原理,需要先回顧一下JAVA中的RMI(Remote Method Invocation)這個易於使用的純JAVA方案(用來實現分布式應用)。有關RMI的相關知識,可以通過下圖來歸納:
RMI原理 (2)
Android中的RPC也是參考了JAVA中的RMI方案,這里我們再詳細了解一下RPC的實現過程。
Android中的RPC機制是為了實現一個進程使用另一個進程中的遠程對象,它使用了Android自己的AIDL(介面定義語言),使用戶很方便地定義出一個介面作為規范,通過一個遠程Service為代理 ,客戶端在綁定該遠程Service過程中獲取遠程對象,進而使用該對象。可參考下圖所示:
Android的RPC原理及應用 (2)
補充:RPC的另一個目的是對客戶端只聲明介面及方法,隱藏掉具體實現類,供客戶端直接獲取此介面實例。
實例代碼:
實例一:通過Service來遠程調用一個介面子類的函數方法
功能描述:在MainActivity中通過綁定MyService服務類,來遠程調用MyPlayer(實現了IPlayer介面)的方法過程。需要定義一個IPlayer.aidl文件,ADT工具會自動生成一個IPlayer介面類,然後再由MyPlayer繼承IPlayer介面類中的靜態內部抽象類,實現介面方法,進而供其它應用程序遠程調用。(在本例中為了方便,MainActivity與MyService類同處一個應用程序中,實現運用時,可以不在同一個應用程序中,只要有許可權訪問MyService服務,就能得到IPlayer介面,進而執行該介面實例方法)
程序清單:IPlayer.aidl

閱讀全文

與androidrpc框架相關的資料

熱點內容
為啥文件夾移到桌面成word了 瀏覽:858
命令符的安全模式是哪個鍵 瀏覽:758
編程中學 瀏覽:955
單片機求助 瀏覽:992
ug加工側面排銑毛坯怎麼編程 瀏覽:271
程序員有關的介紹 瀏覽:736
支付寶使用的什麼伺服器 瀏覽:210
安卓看本地書用什麼軟體好 瀏覽:921
經傳軟體滾動凈利潤指標源碼 瀏覽:522
螢石雲視頻已加密怎麼解除 瀏覽:574
一命令四要求五建議 瀏覽:30
qq文件夾遷移不了 瀏覽:19
液體粘滯系數測定不確定度演算法 瀏覽:332
輕棧源碼 瀏覽:426
把圖片壓縮到500k 瀏覽:35
命令你自己 瀏覽:369
51單片機c語言pdf下載 瀏覽:177
androidactivity堆棧 瀏覽:821
mac執行命令 瀏覽:897
圖片壓縮工具注冊碼 瀏覽:495