iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
  • Guide:
    • Treble 是什麼?
    • Treble 架構
    • HIDL 概述
    • HIDL 編碼規範
    • HIDL 中的 hidl-gen 使用
    • HIDL interface 和 package
    • HIDL import & inheritance
    • HIDL 實作

終於到最後一個步驟了!
我們將結合前面所提到的一些方法和規範,
通過創立一個 Helloworld 的 HIDL 範例,
來了解先前提到的 passthrough 模式是怎麼兼容舊版的 HAL;
binderized 模式又是怎麼透過 Service 運作的。
這裡內容有點多,所以就拆成上、下篇來進行吧,
廢話不多說!讓我們給它看下去!


step 1. 確定環境

HIDL (3) 編碼規範 一文中有提到需要下面的結構:

  • ROOT-DIRECTORY
    • MODULE
      • SUBMODULE(可選,可以有多層)
        • VERSION
          • Android.mk
          • IINTERFACE_1.hal
          • IINTERFACE_2.hal
          • IINTERFACE_N.hal
          • types.hal(可選)

HIDL (5) interface & package 一文中提到 package 前綴的規範如下表:

Package Prefix Location Interface Type
android.hardware.* hardware/interfaces/* HAL
android.frameworks.* frameworks/hardware/interfaces/* frameworks/ 相關
android.system.* system/hardware/interfaces/* system/ 相關
android.hidl.* system/libhidl/transport/* core

HIDL (5) interface & package 一文中又有提到,
一般 OEM 的 HAL ,也就是廠商自己新增的通常都是在 vendor 目錄下。
本文中 helloworld 設定位於 hardware/interfaces 中,
所以目錄路徑為 hardware/interfaces/helloworld/1.0
hardware/interfaces 目錄下的 package 為 android.hardware
所以 package name 應該是 android.hardware.helloworld@1.0


Step 2. 建立 hal 檔

確定 HIDL 模塊的路徑和包名之後,
需要創建一個hal 文件,
這個文件包含了client 需要調用 HAL 的入口 api,
這裡命名為 IHelloWorld.hal
代碼如下:

	1 package android.hardware.helloworld@1.0; 
  2   
  3 interface IHelloWorld { 
  4     justTest(string name) generates (string result, HelloTest value);
  5   
  6     justTest1(HelloTest name);
  7 };

其中 HelloTest 是用戶自定義類型,
如果是模塊公共的類型,
可以定義在 types.hal 中,
例如這裡:

	1 package android.hardware.helloworld@1.0; 
  2       
  3 enum HelloTest : uint8_t { 
  4     V_TEST1 = 0, 
  5     V_TEST2 = 1, 
  6 };

Step 3. 創建 Android.bp

根據 Step 2. 中的 hal 文件利用 hidl-gen (詳細看 HIDL (4) hidl-gen),
先執行 source build/envsetup.sh && lunch 後,

再執行 ./hardware/interfaces/update-makefiles.sh
生成對應的 Android.bp 檔案如下:

	1 // This file is autogenerated by hidl-gen -Landroidbp.                                                                                                                               
  2  
  3 hidl_interface {
  4     name: "android.hardware.helloworld@1.0",
  5     root: "android.hardware",
  6     vndk: {
  7         enabled: true,
  8     },
  9     srcs: [
 10         "types.hal",
 11         "IHelloWorld.hal",
 12     ],
 13     interfaces: [
 14         "android.hidl.base@1.0",
 15     ],
 16     types: [
 17         "HelloTest",
 18     ],
 19     gen_java: true,
 20 }
 21

注意:

  • name 需要與 package name 相同,編譯的時候會根據需要生成對應的 so 或 jar 檔
  • root 即為與 hidl 對應的 root name,詳細看 Step 1. 確定環境
  • interfaces 為編譯過程中依賴的接口名稱,如 c 中的 shared library
  • types 為模塊中所需要的自定義類型
  • 如果 binderized 模式將 gen_java 設為 true;
    如果 passthrough 模式需要將這裡設為 false。
    不過一般通過 update_makefiles.sh 就可以自動生成。

Step 4. 編譯 HIDL

在對應的 HIDL 目錄下 mm 編譯或者在根目錄下 make <FQName> 即可,
最終在 out/soong/.intermediates/hardware/interfaces/helloworld/1.0
下會生成對應模塊的 obj,詳細如下:

 android.hardware.helloworld@1.0/
 android.hardware.helloworld@1.0-adapter/
 android.hardware.helloworld@1.0-adapter_genc++/
 android.hardware.helloworld@1.0-adapter-helper/
 android.hardware.helloworld@1.0-adapter-helper_genc++/
 android.hardware.helloworld@1.0-adapter-helper_genc++_headers/
 android.hardware.helloworld@1.0_genc++/
 android.hardware.helloworld@1.0_genc++_headers/
 android.hardware.helloworld-V1.0-java/
 android.hardware.helloworld-V1.0-java_gen_java/

其中:

  • android.hardware.helloworld@1.0 就是模塊對應的庫文件;

  • android.hardware.helloworld@1.0_genc++
    為生成對應的 C++ 臨時文件,在使用的時候都是鏈接到這裡;

    android.hardware.helloworld@1.0_genc++
    └── gen
    └── android
    └── hardware
    └── helloworld
    └── 1.0
    ├── HelloWorldAll.cpp
    ├── HelloWorldAll.cpp.d
    └── types.cpp

  • android.hardware.helloworld@1.0_genc++_headers 為生成的 C++ 所需的頭文件;

    android.hardware.helloworld@1.0_genc++_headers
    └── gen
    └── android
    └── hardware
    └── helloworld
    └── 1.0
    ├── BnHwHelloWorld.h
    ├── BpHwHelloWorld.h
    ├── BsHelloWorld.h
    ├── hwtypes.h
    ├── IHelloWorld.h
    ├── IHelloWorld.h.d
    ├── IHwHelloWorld.h
    └── types.h

  • android.hardware.helloworld-V1.0-java 為 java 代碼所使用的 java 庫文件;

  • android.hardware.helloworld-V1.0-java_gen_java 為 java 代碼所使用的 java 文件

    android.hardware.helloworld-V1.0-java_gen_java
    └── gen
    └── android
    └── hardware
    └── helloworld
    └── V1_0
    ├── HelloTest.java
    ├── IHelloWorld.java
    └── IHelloWorld.java.d

還沒完喲!下集待續!


上一篇
[Day-11] Android HIDL (6) import & inheritance
下一篇
[Day-13] Android HIDL (8) 實作 (下)
系列文
Android Pie 底層開發學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言