1. 程式人生 > >android hardware 簡述(Android系統原始碼情景分析 筆記)

android hardware 簡述(Android系統原始碼情景分析 筆記)

轉自 https://blog.csdn.net/u013377887/article/details/52965988

 

1.Android原始碼開發的C可執行原始檔一般存在external目錄下 

2  Android的幾層框架. 

   application

---------------------------------------------

   java framework

   java natice interface

   native framework

    hardware     

  --------------------------------------------------- 

  driver 

   kernel   

-----------------------------------------------------

3.硬體抽象層以模組來管理各個硬體訪問介面
  每個硬體模組都對應有一個動態連結庫檔案
  
  每個硬體抽象層都使用 hw_module_t 來描述
  硬體裝置      使用 hw_device_t 來描述
  
4.硬體抽象層檔案的命名規範
    hardware/libhardware/hardware.c
    
  hw_module_t 和hw_device_t  定義
  hardware/libhardware/include/hardware/hardware.h 中
  
 5.每一個硬體抽象層 在核心中都對應一個驅動程式
   硬體抽象層就是通過這些驅動程式訪問硬體裝置的 
       通過讀寫裝置檔案來進行通訊的
       
  6.目錄結構
      hardware/libhardware 
      .
├── include
│ └── hardware  //標頭檔案的存放目錄  存放的是xxx.h 檔案
├── modules
│ ├── audio     //具體模組的存放     xxx.cpp   Android.mk 
│ ├── audio_remote_submix
│ ├── camera
│ ├── consumerir
│ ├── fingerprint
│ ├── gralloc
│ ├── hwcomposer
│ ├── local_time
│ ├── nfc
│ ├── nfc-nci
│ ├── power
│ ├── sensors
│ │  └── tests
│ ├── soundtrigger
│ ├── tv_input
│ ├── usbaudio
│ └── vibrator
└── tests


xxx.h  xxx.cpp是原始碼檔案 
Android.mk是模組的編譯腳步檔案

 

需要注意的是:

這裡的目錄是android自帶的目錄,除此之外,還有一些廠商的目錄,比如MTK,在vender目錄下,他同樣有一個 hardwar目錄,

 

7.  每一個 模組都需要自定義一個模組結構體
以高通的lights 為例

定義模組ID 
#define LIGHTS_HARDWARE_MODULE_ID "lights" 

struct light_device_t {
    struct hw_device_t common; //第一項必須為hw_device_t  這個結構
    
    /**
     * Set the provided lights to the provided values.
     *
     * Returns: 0 on succes, error code on failure.
     */
    int (*set_light)(struct light_device_t* dev,
            struct light_state_t const* state);
};

原始檔 
/hardware/qcom/display/liblight$ 

每一個硬體模組必須匯出一個名稱HAL_MODULE_INFO_SYM符號
    他指向一個自定義的硬體抽象層模組結構體。
    第一個型別為hw_module_t 的tag (必須為HARDWARE_MODULE_TAG )
    
8. 一個硬體抽象層可能包含多個硬體裝置
    而這些硬體裝置的開啟操作是由xxx_device_open來完成的。
        
9.編譯指令碼
    編譯完成後,存在 out/target/produce/gerneric/system/hw 下 
    名字xxx.default.so 

10.mmm  make snod 
    
    mmm 編譯  snod 打包
    
11.可能存在的問題
    open的時候,沒有許可權
解決方案:
    通過uevent 機制
        system/core/rootdir  
            ueventd.rc的配置檔案
                /dev/freg  0666 root root 
                
更加簡單的方法:
    2.3 節 (Android系統原始碼情景分析)
            
    
12.在硬體抽象層模組之後,需要在應用程式框架層中實現一個硬體訪問服務,

硬體訪問服務:通過硬體抽象層模組開為應用程式提供硬體讀寫操作。

硬體抽象層模組使用 C++  

Java Native Interface 

硬體訪問服務使用Java 

13.硬體訪問服務執行在系統程序system中,
   使用硬體訪問服務的應用程式執行在另外的程序中,
       即應用程式通過程序間通訊機制來訪問這些硬體訪問服務
           binder 程序間通訊機制
                   應用程式通過binder來訪問執行在系統程序System中的硬體服務
                   
           binder程序間通訊機制 要求提供服務的一方必須實現一個具有 跨程序訪問能力的服務介面,以便使用服務的一方可以通過這個服務介面來訪問它 

     binder 機制,在C。C++ java 都有相應的實現方法。對於java層,則可以使用下邊的方法。          

14.硬體訪問服務介面
    跨程序 訪問能力的服務介面
        AIDL  (frameworks/base/core/java/andriod/os/xxx.aidl)
    同時需要修改 frameworks/base 目錄下的Android.mk 
        mmm ./frameworks/base  編譯這個介面
        
    aidl 定義的服務藉口是用來進行程序間通訊的。其中提供服務的程序成為server程序,

        而使用服務的程序成為client程序。

 不僅僅需要定義aidl,還需要實現server的具體功能,即下邊的方法

15.硬體訪問服務
    frameworks/base/services/java/com/android/server
    
    實現介面的成員函式  

16.硬體訪問服務的jni方法。 呼叫硬體抽象層模組

    /frameworks/base/services/core/jni  
    命名com_android_server_xxx.cpp  
    
    實現java本地介面方法表
    註冊java本地介面方法
     在onload.cpp中新增xxx函式的宣告和呼叫 
     修改Android.mk  
     
     jni層

com_android_server_lights_LightsService.cpp (frameworks\frameworks\base\services\core\jni)    

這是一個對於使用java編寫的jni,通用的寫法,除此之外還有C++的實現,典型程式碼Camera的框架,

  
17. 啟動硬體訪問服務 
     Android的硬體訪問服務通常在系統程序system中啟動, 
     系統程序system是由應用程式孵化器程序Zygote負責啟動的。
         zygote 在系統啟動時啟動。
     
     -->把硬體訪問服務執行在系統程序system 中就實現了開機時自動啟動
      
     新增到哪裡?
         frameworks/base/services/java/com/android/server/SystemServer.java 
         
         android5.1 和書有點不同 
         

17.編寫應用程式 
         
kernel         hal                jni             system                      binder                應用程式的程序
核心驅動         
        硬體抽象層模組使用 C++                                                通訊方法
        
                    Java Native Interface 
        
                                    硬體訪問服務使用Java                                                                         
                                        硬體訪問服務介面                             訪問介面