Android硬件访问服务框架思想初识
?Android的硬件訪問(wèn)服務(wù)提供了一個(gè)APP調(diào)用硬件實(shí)現(xiàn)的方法模型。我們從上往下來(lái)看。應(yīng)用層面對(duì)的都是一個(gè)個(gè)的服務(wù)叫service.比如電源管理服務(wù),震動(dòng)服務(wù)等等。應(yīng)用層代碼首先就需要去查詢(xún)系統(tǒng)是否存在這么一個(gè)服務(wù),或者目前是不是可以被獲取的。從這個(gè)角度,我們就牽扯出來(lái)兩個(gè)問(wèn)題。a:既然去系統(tǒng)里面查找這么個(gè)服務(wù),那么首先應(yīng)該又什么地方注冊(cè)加入系統(tǒng)的。b:有了這么個(gè)服務(wù),我也得創(chuàng)建一個(gè)接口函數(shù)來(lái)鏈接APP跟這個(gè)服務(wù)函數(shù)的橋梁。我們的應(yīng)用APP通過(guò)這么一個(gè)橋梁來(lái)去訪問(wèn)這個(gè)服務(wù)。
我們需要懟的就是這么個(gè)服務(wù)是怎么添加到系統(tǒng)的,以及他的前世今生。這個(gè)工作是由systemserver.java文件來(lái)做的。在 startotherservices函數(shù)中我們先去new 一個(gè)服務(wù)實(shí)例對(duì)象,然后再去addservice 將這個(gè)方法注冊(cè)到系統(tǒng)的service_manager.c這就是前面我說(shuō)的系統(tǒng)。那么這個(gè)服務(wù)的方法是根據(jù)誰(shuí)來(lái)實(shí)例化的呢?那么肯定會(huì)有一個(gè)class類(lèi)來(lái)做,也就是說(shuō)我們需要?jiǎng)?chuàng)建這么一個(gè)類(lèi)。
APP操作的根源還是在底層,現(xiàn)在我們講好了service,那么我們還需要一個(gè)地方去注冊(cè)管理底層的方法。這個(gè)仍舊是在SystemServer.java里面集中管理。這個(gè)是通過(guò)Loadlibrary函數(shù)調(diào)用JNIonload。cpp這里面并沒(méi)有直接做JNI的處理,因?yàn)榘沧扛鱾€(gè)方法如果都寫(xiě)在這么一個(gè)文件里面就會(huì)顯得特別亂。我們繼續(xù)通過(guò)調(diào)用下一層的JNI文件來(lái)處理。這個(gè)JNI文件是需要隨著系統(tǒng)一起編譯的。后期我們沒(méi)改一次JNI就去編譯一次Anroid系統(tǒng),太費(fèi)勁了。我們就引入了Hal文件。我們的jni只需要提供標(biāo)準(zhǔn)的接口。hal文件去實(shí)現(xiàn)這些jni。而且這些hal文件不需要跟著系統(tǒng)一起編譯,我們還可以把他做成.so文件,加載到庫(kù)里。這樣同時(shí)還解決了保密問(wèn)題。對(duì)吧。
說(shuō)的還是挺繞的。簡(jiǎn)而言之。我們把底層各種封裝處理,然后提供處理啊那么一個(gè)插頭(我們的service實(shí)例化后的方法就是一個(gè)插頭,里面包含了各種處理)。我們的應(yīng)用層也使用一個(gè)插頭,當(dāng)這倆插頭接到了一起,就實(shí)現(xiàn)了我們的安卓硬件訪問(wèn)服務(wù)。
如果某個(gè)硬件資源只能被某一個(gè)應(yīng)用使用,可以使用下面的方法訪問(wèn)硬件:
JAVA APP--->JNI_OnLoad()加載C庫(kù)---->將JAVA三個(gè)地方法與C庫(kù)函數(shù)進(jìn)行關(guān)聯(lián)并注冊(cè)---->調(diào)用JAVA本地Native方法就可以訪問(wèn)C庫(kù)的C接口------>進(jìn)而訪問(wèn)硬件驅(qū)動(dòng)中的open, read, write,從進(jìn)訪問(wèn)硬件。但是,以上場(chǎng)景僅限于只有一個(gè)APP使用這個(gè)硬件資源,如果有多個(gè)應(yīng)用想要使用某個(gè)硬件時(shí),如果還按上面方法,必須會(huì)造成硬件資源的沖突,所以此時(shí)需要有一種框架來(lái)解決這個(gè)問(wèn)題。解決方案就是訪問(wèn)硬件資源的程序只能并且只有一個(gè),我們稱(chēng)之為System Server, 其它要訪問(wèn)這個(gè)硬件資源的APP必須要給Server發(fā)請(qǐng)求,由Server間接的操作硬件,從而實(shí)現(xiàn)資源的訪問(wèn)。這個(gè)就稱(chēng)之為硬件訪問(wèn)服務(wù)。
關(guān)于硬件訪問(wèn)服務(wù)需要注意以下幾點(diǎn):1 System Server是由JAVA編寫(xiě)的,所以它要想訪問(wèn)硬件,必須要加載JNI的C庫(kù)(Loadlibrary).2 C庫(kù)的JNI_Onload函數(shù)里要注冊(cè)本地方法,分別調(diào)用各個(gè)硬件的函數(shù)來(lái)注冊(cè)本地方法。比如LED,振動(dòng)器,有串口。。。等等。。3 System Server:(1)對(duì)每個(gè)硬件都要添加服務(wù),add service前提需要實(shí)現(xiàn)的是:對(duì)每個(gè)硬件構(gòu)造service,使用本地Native方法(2)對(duì)于(1)添加的服務(wù)就是向service_manager.c注冊(cè),比如serialservice, vibratorservice, ledservice等。如果JAVA應(yīng)用程序需要使用某些Service的時(shí)候,就需要通過(guò)這個(gè)Service_manager查詢(xún)及獲取相應(yīng)的Service。
4 最終APP怎么使用?(1)APP使用之前需要獲得這個(gè)服務(wù)getService(2)最后就是使用這個(gè)服務(wù)了。執(zhí)行Service的方法
以后修改硬件驅(qū)動(dòng)的時(shí)候,把驅(qū)動(dòng)文件放在hal里面,如hal_led.c,有幾個(gè)好處:(1)容易修改(2)很多公司不愿意開(kāi)放其硬件操作,他們只提供so文件,出于保密的目的。試想一下,如果把硬件操作源代碼放到JNI文件里,如果要修改,需要編譯整個(gè)工程,此外,硬件源代碼暴露出來(lái)了,保密性不好。
分析一下:以上操作涉及到三個(gè)進(jìn)程,?1 SystemServer進(jìn)程:它提供的功能如下:---a: 它向service_manager.c注冊(cè)服務(wù)---b: 加載硬件Service JNI 的C庫(kù)---C: 接收其它app的硬件操作請(qǐng)求,訪問(wèn)硬件資源
2 Service_Manager進(jìn)程:負(fù)責(zé)硬件資源各種Service的注冊(cè)添加,以及接怍JAVA應(yīng)用app的各種service查詢(xún)請(qǐng)求及資源的獲取。
3 JAVA應(yīng)用APP進(jìn)程,它其實(shí)是一個(gè)客戶(hù)端,它首先向Service_Manager查詢(xún)獲得某一個(gè)Service, 最后,把這個(gè)Service發(fā)送給SystemServer進(jìn)程以請(qǐng)求相應(yīng)的服務(wù),
而以上三個(gè)進(jìn)程之間的內(nèi)部通信,主要依靠Android內(nèi)核的Binder Driver系統(tǒng)進(jìn)行內(nèi)部進(jìn)程間通信。這個(gè)Binder并不是linux內(nèi)核自帶的,是google公司對(duì)linux內(nèi)核進(jìn)行修改添加的一個(gè)驅(qū)動(dòng)程序,可實(shí)現(xiàn)更加高效的進(jìn)程間通信。
ps:注冊(cè)Server與Service的區(qū)別,可以這么理解,Server服務(wù)器提供各種服務(wù)Services.
思考:如何實(shí)現(xiàn)一個(gè)硬件訪問(wèn)服務(wù)。1 編寫(xiě)JNI和HAL,以led為例,先編寫(xiě)com_android_server_ledservice.cpp,用于注冊(cè)JNI本地方法。再編寫(xiě)hal_led.c,里面就是實(shí)現(xiàn)open,read,write等硬件訪問(wèn)接口。2 修改onload.cpp,調(diào)它調(diào)用com_android_server_ledservice.cpp內(nèi)實(shí)現(xiàn)的函數(shù),3 修改system server.java,?new ledservice()add ledservice()4編寫(xiě)LEDService.java提供一個(gè)類(lèi),做接口用的,他自己是不能調(diào)用本地方法的。他是通過(guò)在systemserver.java中實(shí)例化對(duì)象提供接口來(lái)實(shí)現(xiàn)功能的!!這個(gè)地方要謹(jǐn)記,很容易讓人混沌不清。
5 編寫(xiě)ILEDService.java接口給app使用。
?
總結(jié)
以上是生活随笔為你收集整理的Android硬件访问服务框架思想初识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 转://RMAN跨平台可传输表空间和数据
- 下一篇: 基于ZXing Android实现生成二