<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### **概述** Android硬件抽象層從開發到使用有一個清晰的層次。這個層次恰好對應了Android系統的架構層次,它向下涉及到Linux內核,向上涉及到應用程序框架層的服務,以及應用程序層對它的使用。Android硬件抽象層模塊的開發本身也遵循一定的規范。有了這個規范之后,系統就可以對它進行自動加載,方便上層的使用。 主要將通過一個具體的實例來分析Android硬件抽象層的開發、測試和使用,它在幫助我們理解Android系統架構的同時,也能教會我們如何在Android源代碼環境中開發C/C++代碼。 **Android硬件抽象層概述 Android硬件驅動程序開發 Android硬件驅動程序驗證 Android硬件抽象層模塊開發 Android硬件訪問服務開發 Android應用程序開發** ### **Android硬件抽象層概述** * 設備驅動分為內核空間和用戶空間兩部分 * 保護廠商利益(出發點) * 內核空間主要負責硬件訪問邏輯(GPL) * 用戶空間主要負責參數和訪問流程控制(Apache License) * 用戶空間部分設備驅動即為HAL Module HAL Module通過設備文件訪問內核空間部分設備驅動 * 系統服務通過HAL Module對硬件進行管理 系統服務通過JNI訪問HAL Module * 應用程序通過系統服務對硬件進行訪問 應用程序通過Binder IPC訪問系統服務 ![](https://box.kancloud.cn/993b4084be40134e34456e2907347f30_722x454.jpg) ### **Android硬件驅動程序開發** **與傳統的Linux硬件驅動程序開發是一樣的** * 實現驅動程序 * 包括源代碼文件、編譯腳本文件、編譯配置文件 * 提供proc、devfs和sysfs三種文件系統訪問接口 * 修改根Kconfig文件 * 修改根Makefile文件 * 編譯驅動程序 ### **Android硬件驅動程序驗證** * 驗證proc文件系統訪問接口 通過cat和echo命令驗證 * 驗證sysfs文件系統訪問接口 通過cat和echo命令驗證 * 驗證devfs文件系統訪問接口 編寫C程序通過open、read和write系統調用驗證 ### **Android硬件抽象層模塊開發** * 模塊文件命名規范 ![](https://box.kancloud.cn/fd6d65ff83bf01c48ccb60e9994bb0a0_621x295.png) * 定義模塊ID * 定義設備ID * 定義模塊結構體 * 第一個成員變量必須是標準的hw_module_t結構體 * 相當于是定義一個hw_module_t子類 * 定義設備結構體 * 第一個成員變量必須是標準的hw_device_t結構體 * 相當于是定義一個hw_device_t子類 * 定義符號HAL_MODULE_INFO_SYM,類型為自定義的模塊結構體 * 實現設備打開接口(必須) * 實現設備關閉接口(必須) * 實現設備訪問接口(可選) **模塊加載過程:hw_get_module** * 依次在/system/lib/hw和/vendor/lib/hw目錄中檢查是否存在相應的“<MODULE_ID>.variant.so”文件。其中,variant分別等于屬性“ro.hardware”、“ro.product.board”、“ro.board.platform”和“ro.arch”的值。只要其中一個存在,即停止查找。 * 如果上述文件均不存在,則繼續在/system/lib/hw目錄中檢查 “<MODULE_ID>.variant.so”文件是否存在。 * 調用dlopen打開上述找到的so文件。 * 調用dlsys獲得上述打開的so文件里面的符號HAL_MODULE_INFO_SYM。 * 將符號HAL_MODULE_INFO_SYM強制轉換為一個hw_moudle_t結構體。 **修改設備文件訪問權限** * 設備文件在默認情況下只有root用戶可以訪問 * 設備文件一般是在非root用戶進程中訪問的 * 修改ueventd.rc文件賦予設備文件非root用戶訪問權限 **修改ueventd.rc文件的方法** * 解壓ramdisk.img文件,得到ramdisk.img.gz歸檔文件 * 解除ramdisk.img.gz文件歸檔,得到ramdisk目錄 * 修改ramdisk目錄下的ueventd.rc文件 * 重新打包ramdisk.img鏡像文件 ### **Android硬件訪問服務開發** **定義硬件訪問接口IXXX** * 使用AIDL語言定義 * 編譯后會生成一個IXXX.Stub類 **實現硬件訪問服務XXX** * 從IXXX.Stub類繼承 * 實現硬件訪問接口IXXX * 通過JNI訪問硬件抽象層模塊 **實現硬件訪問服務XXX的JNI接口** * 調用函數hw_get_module加載硬件抽象層模塊 * 打開硬件設備 **啟動硬件訪問服務** * 在System Server進程中創建一個XXX實例 * 調用ServiceManager.addService接口將XXX實例注冊到Service Manager中 ### **Android應用程序開發** * 調用ServiceManager.getService接口獲得硬件訪問服務XXX的代理接口 * 通過代理接口訪問硬件訪問服務
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看