APP應用程式->應用程式框架層->硬體抽象層-> 硬體驅動程式
一、硬體驅動層
進入kernel/drivers檔案夾中,建立一檔案夾,放入驅動程式。包括標頭檔,C檔案,Makefile,Kconfig。同時對drivers下的Makefile跟Kconfig進行相應的添加,這樣配置編譯選項後,即可編譯。編譯完後,可以在/dev,/proc,/sys/class中得到相應的檔案,其中dev下的檔案即為該裝置檔案。
二、硬體抽象層
進入源碼根目錄下的hardware/libhardware/include/hardware建立標頭檔,在hardware/libhardware/modules中建立目錄,在該目錄下放入C檔案調用裝置檔案(open函數開啟/dev/XXX裝置檔案),最後在該目錄下建立Android.mk檔案,編譯後得到XXX.default.so檔案。重新打包後,system.img就包含我們定義的硬體抽象層模組XXX.default。
三、應用程式框架層
進入frameworks/base/services/jni目錄,建立com_android_server_XXXService.cpp檔案(#include <hardware/hello.h> 以此調用抽象層方法 ),實現jni方法。com_android_server首碼表示的是包名,表示硬體服務XXXService是放在frameworks/base/services/java目錄下的com/android/server目錄的。對同目錄下的onload.cpp檔案進行修改,這樣,在Android系統初始化時,就會自動載入該JNI方法調用表。同時修改該目錄下的Android.mk。
進入到frameworks/base/core/java/android/os目錄,新增IXXXService.aidl介面定義檔案,該檔案提供功能函數。在frameworks/base目錄下的Android.mk添加該aidl檔案。進入frameworks/base/services/java/com/android/server目錄,新增XXXService.java(主要是通過調用JNI方法來提供硬體服務),修改同目錄的SystemServer.java檔案,在ServerThread::run函數中增加載入HelloService的代碼。
這樣,重新打包後的system.img系統鏡像檔案就在Application Frameworks層中包含了我們自訂的硬體服務XXXService了,並且會在系統啟動的時候,自動載入XXXService。這時,應用程式就可以通過Java介面來訪問Hello硬體服務了。
四、APP應用程式層
用eclipse編寫應用程式層的APP。程式通過ServiceManager.getService("XXX")來獲得XXXService,接著通過IXXXService.Stub.asInterface函數轉換為IXXXService介面。然後把出R檔案的其他檔案都拷到/packages/experimental下,在該APP目錄下建立Android.mk檔案。編譯後安裝該產生的apk即可使用該程式調用底層硬體驅動。
大概整個過程就這樣,上層app調用架構層的java介面,java介面通過jni調用硬體抽象層,硬體抽象層則通過開啟裝置檔案調用底層硬體驅動。