iT邦幫忙

第 11 屆 iThome 鐵人賽

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

import (導入)

導入採用以下3 種格式之一:

  • 完整導入:import PACKAGE-NAME;
  • 部分導入:import PACKAGE-NAME::UDT;
    (或者,如果導入的類型是在同一個軟件包中,則為 import UDT;
  • 類型導入:import PACKAGE-NAME::types;

例如:

import android.hardware.nfc@1.0;             // 完整導入
import INfcClientCallback;                   // 部份導入
import android.hardware.example@1.0::types;  // 類型導入

部份導入因為是在一個 package 中,可以直接導入接口名稱。當然也可以改為:

import android.hardware.nfc@1.0::INfcClientCallback;

當然,也可以導入 types.hal 中定義的 UDT(user definition types),例如:

import android.hardware.nfc@1.0::NfcStatus;

NfcStatus 為types.hal 中定義的枚舉類型的名稱,
如果在 INfc.hal 中只是使用這一個type,可以這樣導入。

一般情況下,types.hal 中定義的類型都是給整個軟件包使用,
如果在Android.bp中聲明,那麼在文件中是不需要導入的,例如:

hidl_interface {
    name: "android.hardware.nfc@1.0",
    root: "android.hardware",
    vndk: {
        enabled: true,
    },
    srcs: [
        "types.hal",
        "INfc.hal",
        "INfcClientCallback.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    types: [
        "NfcEvent",
        "NfcStatus",
    ],
    gen_java: true,
    gen_java_constants: true,
}

inheritance (繼承)

這裡一樣跟 JAVA 繼承的方法類似,只是有點不同。
所以建議你完全不知道繼承是什麼東東的人,
先上 Google 好好仔細研究一下,
因為不只有 JAVA 會用,
其實很多開發語言都有所謂的像是封裝、繼承、多型。
套一句老前輩說的範例,
你要是學會九陽神功,學什麼武功都很快!
(因為我想不到更好的例子!呵呵!)

interface (接口) 可以是之前定義的接口的 extends (擴展)。
擴展可以是以下三種類型中的一種:

  • 接口可以向其他接口添加功能,並按原樣納入其API。
  • 軟件包可以向其他軟件包添加功能,並按原樣納入其API。
  • 接口可以從軟件包或特定接口導入類型。

接口只能擴展一個其他接口(不支持多重繼承)。
具有非零 Minor 版本號的軟件包中的每個接口必須擴展一個以前版本的軟件包中的接口。
例如,如果 4.0 版本的軟件包 derivative 中的接口 IBar ,
是基於(擴展了)1.2 版本的軟件包 original 中的接口 IFoo,
並且您又創建了 1.3 版本的軟件包 original,
則 4.1 版本的 IBar 不能擴展 1.3 版本的 IFoo。

相反,4.1 版本的 IBar 必須擴展 4.0 版本的 IBar,
因為後者是與 1.2 版本的 IFoo 綁定的。
如果需要,5.0 版本的 IBar 可以擴展 1.3 版本的 IFoo。

接口擴展並不意味著生成的代碼中存在代碼庫依賴關係或跨 HAL 包含關係,
接口擴展只是在 HIDL 級別導入數據結構和方法定義。
HAL 中的每個方法必須在相應HAL 中實現。

例如:

enum NfcEvent : @1.0::NfcEvent {
    /** In case of an error, HCI network needs to be re-initialized */
    HCI_NETWORK_RESET = 7
};

這裡就繼承了 1.0 版本中的 NfcEvent,在之前的基礎上多加了一個枚舉值(1.0 中是 0~6)。

例如:

package android.hardware.nfc@1.1;

import @1.1::INfcClientCallback;
import @1.0::INfc;
import @1.0::NfcStatus;

interface INfc extends @1.0::INfc {
    factoryReset();
    ...
};

這裡是 1.1 版本的 INfc 繼承了 1.0 版本,
在 1.0 的接口基礎上多加了一個接口 factoryReset()


總結

下列表格是使用方法的總整理:
至於後面還有介紹很多雜七雜八的小規範,
我一樣就不贅述了,參考網址在下方。

很多時候開發的原則就是這樣,
你得先抓到大方向或大架構,
再來許多枝微末節對你來說就只是補充而已。
不小心又碎唸了,哈哈!

名稱 定義
Application Binary Interface (ABI) 應用編程接口+ 所需的任何二進制鏈接
Fully-qualified name (FQName) 用於區分 HIDL 類型的名稱, (例如:android.hardware.foo@1.0::IFoo)
Package 包含 HIDL 接口和類型的軟件包, (例如:android.hardware.foo@1.0)
Package root 包含 HIDL 接口的根目錄軟件包, (例如:HIDL 接口android.hardware, 在軟件包根目錄 android.hardware.foo@1.0 中)
Package root path 軟件包根目錄映射到的 Android 源代碼樹中的位置

Reference :

Interfaces & Packages | Android Open Source Project


上一篇
[Day-10] Android HIDL (5) interface & package
下一篇
[Day-12] Android HIDL (7) 實作 (上)
系列文
Android Pie 底層開發學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言