AIDL 概覽
Android 接口定義語(yǔ)言 (AIDL) 是一款可供用戶用來(lái)抽象化 IPC 的工具很魂。以在 .aidl
文件中指定的接口為例焙糟,各種構(gòu)建系統(tǒng)都會(huì)使用 aidl
二進(jìn)制文件構(gòu)造 C++ 或 Java 綁定斩跌,以便跨進(jìn)程使用該接口(無(wú)論其運(yùn)行時(shí)環(huán)境或位數(shù)如何)挽唉。
AIDL 可以在 Android 中的任何進(jìn)程之間使用:在平臺(tái)組件之間使用或在應(yīng)用之間使用均可雪标。但是篙耗,AIDL 絕不能用作應(yīng)用的 API。例如引润,可以使用 AIDL 在平臺(tái)中實(shí)現(xiàn) SDK API巩趁,但 SDK API Surface 絕不能直接包含 AIDL API。在 APEX(從 Android 10 開(kāi)始)或 HAL(從 Android 11 開(kāi)始)等單獨(dú)更新的平臺(tái)組件之間使用 AIDL 時(shí)淳附,必須使用稱為穩(wěn)定的 AIDL的版本控制系統(tǒng)议慰。
示例
以下是一個(gè) AIDL 接口示例:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz); // synchronous method
oneway void doFoo(int a); // async method
}
Android 10 及更高版本支持 parcelable 聲明蠢古。例如:
package my.package;
import my.package.Boo;
parcelable Baz {
@utf8InCpp String name = "baz";
Boo boo;
}
Android 11 及更高版本支持枚舉聲明。例如:
package my.package;
enum Boo {
A = 1 * 4,
B = 3,
}
Android 12 及更高版本支持聯(lián)合聲明别凹。例如:
package my.package;
import my.package.FooSettings;
import my.package.BarSettings;
union Settings {
FooSettings fooSettings;
BarSettings barSettings;
@utf8InCpp String str;
int number;
}
Android T(AOSP 實(shí)驗(yàn)版)及更高版本支持嵌套類型聲明草讶。 例如:
package my.package;
import my.package.Baz;
interface IFoo {
void doFoo(Baz.Nested nested); // defined my/package/Baz.aidl
void doBar(Bar bar); // defined below
parcelable Bar { ... } // union/enum types can be nested, while
// an interface can't.
}
服務(wù)器進(jìn)程注冊(cè)接口并提供對(duì)它的調(diào)用,客戶端進(jìn)程則調(diào)用這些接口番川。在許多情況下到涂,進(jìn)程既是客戶端又是服務(wù)器脊框,因?yàn)樗赡軙?huì)引用多個(gè)接口颁督。如需詳細(xì)了解可供您用來(lái)使用這些接口的各種運(yùn)行時(shí)環(huán)境,請(qǐng)參閱 AIDL 后端浇雹。這些類型聲明與給定語(yǔ)言中的類聲明完全相同沉御,但可以跨進(jìn)程工作。
工作原理
AIDL 使用 Binder 內(nèi)核驅(qū)動(dòng)程序進(jìn)行調(diào)用昭灵。當(dāng)您發(fā)出調(diào)用時(shí)吠裆,系統(tǒng)會(huì)將方法標(biāo)識(shí)符和所有對(duì)象打包到某個(gè)緩沖區(qū)中,然后將其復(fù)制到某個(gè)遠(yuǎn)程進(jìn)程烂完,該進(jìn)程中有一個(gè) Binder 線程正在等待讀取數(shù)據(jù)试疙。Binder 線程收到某個(gè)事務(wù)的數(shù)據(jù)后,該線程會(huì)在本地進(jìn)程中查找原生樁對(duì)象抠蚣,然后此類會(huì)解壓縮數(shù)據(jù)并調(diào)用本地接口對(duì)象祝旷。此本地接口對(duì)象正是服務(wù)器進(jìn)程所創(chuàng)建和注冊(cè)的對(duì)象。當(dāng)在同一進(jìn)程和同一后端中進(jìn)行調(diào)用時(shí)嘶窄,不存在代理對(duì)象怀跛,因此直接調(diào)用即可,無(wú)需執(zhí)行任何打包或解壓縮操作柄冲。
與設(shè)備上的服務(wù)互動(dòng)
Android 具有一些命令吻谋,可供您用來(lái)與設(shè)備上的服務(wù)互動(dòng)。請(qǐng)嘗試輸入:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing