Android HIDL - 2


前篇: Android HIDL - 1

IDL : interface definition language
是一種接口描述, 可以讓不同平台或不同語言撰寫的程式相互溝通

之前 Android 就有所謂的 AIDL
這次針對 hardware interface 定了一個 HIDL

有一個解譯器 hidl-gen , 他的程式碼放在
system/tools/hidl 目錄底下

編譯產生的執行檔在
out/host/linux-x86/bin/hidl-gen

用法
hidl-gen -o <output_dir_path> -L <language> -r <interface-root> fqname

interface-root(optional): prefix and root path for fqname.
If not set, use the default prefix: android.hardware and default root path
defined in $TOP.

fqname: fully qualified name of the input files.
For singe file input, follow the format: package@version::fileName
For directory input, follow the format: package@version

e.g. hidl-gen \
          -Ljava \
          android.hardware.test@1.0::ITest

我們來做一個簡單的範例實驗 - github

(1) 環境設置
     如上述的 hidl-gen , 使用時會用到一些 dynamic link library , e.g. libbase.so
     這個檔案原本會產生在 out/host/linux-x86/lib64
     可以把這個目錄設定到 LD_LIBRARY_PATH 的環境變數下

(2) 範例 ITest.hal

     在這檔案裡, 我們寫這幾行來做實驗




    - package : 用來申明當前 interface ITest 所屬的 package 名稱

      也因此, 這檔案會放在 hardware/interfaces/test/1.0 底下,
      同時要設定環境變數, ANDROID_BUILD_TOP 在 hardware 的上一層目錄

      或許會有疑問, 他的 package 是寫 android.hardware.test, 而目錄是 hardware/interfaces/test
      這是因為 -r <interface root> 轉換.
      在 hidl-gen source code 中 default 有設定 :

coordinator.addDefaultPackagePath("android.hardware", "hardware/interfaces");

       或像 Android.mk 用 -r android.hardware:hardware/interfaces 帶入
       所以 package 的目錄有被轉換

- interface : 用以聲明 HAL module 接口

       這邊會用到 system/libhidl/transport/ 底下 e.g. IBase
       所以得把這目錄放在 ANDROID_BUILD_TOP 下

結果

   可以發現, 才寫了兩三行 HIDL, 就可以產生出四百多行,
   按照 Treble 架構有 binder, IHwBinder,  的 Java code - ITest.java



...

後續..

留言

  1. Android HIDL - 2
    你好有一件關於 android O HIDL 問題想請教你一下方便嗎?

    line:tzeng0152014

    回覆刪除

張貼留言

熱門文章