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
...
後續..
Android HIDL - 2
回覆刪除你好有一件關於 android O HIDL 問題想請教你一下方便嗎?
line:tzeng0152014