Binder系列-7-AIDL-aidl命令行工具

基于A12

一、aidl简介

AIDL 从 Android 10 起支持 native C++ 代码生成。若输入 aidl tab键,可以发现 out/soong/host/linux-x86/bin 下有两个工具,分别是 aidl 和 aidl-cpp,其区别是:

---------------------------------------------------------------------------------------------------------------
工具/命令   用途                     输出前端                 说明
---------------------------------------------------------------------------------------------------------------
aidl        通用 AIDL 编译工具       Java/C++/Rust(按参数)    标准工具,由 -backend 参数决定生成语言
aidl-cpp    专门生成 C++ 的编译器    仅 C++                   旧版或特定版本的别名;新版AOSP推荐用 aidl
---------------------------------------------------------------------------------------------------------------

aidgen 通常是:第三方或某些厂商基于 aidl 二次包装的工具,IDE 或自动化构建脚本的一部分,旧版 Android Studio 的代码生成助手。不是 AOSP 标准工具链的一部分。


2. aidl --help

android$ aidl --help

AIDL 编译器:构建于平台 SDK 版本 32

用法:

aidl --lang={java|cpp|ndk|rust} [OPTION]... INPUT...

为 AIDL 文件生成 Java、C++ 或 Rust 文件。

aidl --preprocess OUTPUT INPUT... 创建一个包含 AIDL 文件声明的 AIDL 文件。

aidl --dumpapi --out=DIR INPUT... 将 AIDL 文件的 API 签名转储到 DIR 目录。

aidl --checkapi[={compatible|equal}] OLD_DIR NEW_DIR 检查 NEW_DIR 目录下的 API 转储是否是 OLD_DIR 目录下的 API 转储的 {compatible|equal} 扩展名。默认值:compatible

aidl [OPTION]... INPUT [OUTPUT] 为 AIDL 文件生成 Java 文件。

选项 OPTION:

-I DIR, --include=DIR 使用 DIR 作为导入语句的搜索路径。

-m FILE, --import=FILE 直接导入 FILE,无需在搜索路径中查找。

-p FILE, --preprocessed=FILE 包含由 --preprocess 创建的 FILE。

-d FILE, --dep=FILE 生成依赖文件为 FILE。当存在多个输入文件时,请勿使用此选项。此时请使用 -a。

-o DIR, --out=DIR 使用 DIR 作为生成文件的基本输出目录。

-h DIR, --header_out=DIR 在 DIR 目录下生成 C++ 头文件。

-a 在输出文件旁边生成一个依赖文件,其名称基于输入文件。

-b 尝试编译 Parcelable 时触发失败。

--ninja 以 Ninja 可识别的格式生成依赖文件。

--structured 此接口是否仅在 AIDL 中定义。因此,它符合稳定化要求。

--stability=<level> 此接口的稳定性要求。

-t, --trace 包含用于 systrace 的跟踪代码。请注意,如果客户端或服务代码不是由该工具自动生成的,则该部分将不会被跟踪。

--transaction_names 生成事务名称。

--apimapping 生成已声明的 aidl 方法签名到原始行号的映射。例如:如果 foo/bar/IFoo.aidl 的第 39 行包含:void doFoo(int bar, String baz); 则结果为:
    foo.bar.Baz|doFoo|int,String,|void
    foo/bar/IFoo.aidl:39

-v VER, --version=VER 将接口和 parcelable 的版本设置为 VER。VER 必须是大于 0 的整数。

--hash=HASH 将接口哈希值设置为 HASH。

--log 通过回调提供有关事务的信息,例如方法名、参数值、执行时间等。

-Werror 将警告转换为错误。

-Wno-error=<warning> 即使指定了 -Werror,也将其转换为警告。

-W<warning> 启用指定的警告。

-Wno-<warning> 禁用指定的警告。

-w 禁用所有诊断。-w 优先于 -Weverything。

-Weverything 启用所有诊断。

--help 显示此帮助信息。

INPUT: 一个 AIDL 文件。

OUTPUT: 生成的 Java 或 C++ 源文件的路径。当指定了 -o 或 --out,或者输入文件的数量超过一个时,此参数将被忽略。对于 Java,如果省略此参数,Java 源文件将生成在与输入 AIDL 文件相同的目录下。

HEADER_DIR:C++ 头文件的生成路径。


3. 小结

aidl 工具可以生成 Native C++ 代码。在 Android 9(API 28) 前 AIDL 只生成 Java 代码,在 Android 10(API 29)及以后 AIDL 支持生成 Native C++代码、Rust代码、Java代码等。

在 Android.bp 里用 aidl_interface 管理版本稳定性。示例(常见 Vendor 写法):

aidl_interface {
    name: "vendor.samsu.demo",
    srcs: ["aidl/vendor/samsu/demo/*.aidl"],
    stability: "vintf",
    vendor_available: true,
    backend: {
        ndk: { enabled: true },
        cpp: { enabled: false },
        java: { enabled: false },
    },
}


二、用法举例

1. 生成C++代码

aidl --lang=cpp -I vendor/samsu/interfaces/aidl/path -o out/gen_aidl_1 vendor/samsu/interfaces/aidl/IMyService.aidl
//即:
aidl --lang=cpp -I . -o out/gen --header_out out/include aidl/vendor/demo/IMyService.aidl


2. 生成Java代码

aidl -I vendor/samsu/interfaces/aidl/path -o out/gen_aidl_2 vendor/samsu/interfaces/aidl/IMyService.aidl
//即:
aidl --lang=java -I src -o out/gen src/com/demo/IMyService.aidl


3. 生成 NDK Backend(Vendor HAL推荐)

aidl --lang=ndk -I . -o out/gen --header_out out/include aidl/vendor/demo/IMyService.aidl


4. 先预处理,再编译(大工程提速/统一依赖)

aidl --preprocess -o out/preprocessed.aidl -I frameworks/base/core/java frameworks/base/core/java/android/os/IInterface.aidl
aidl --lang=java -p out/preprocessed.aidl -I src -o out/gen src/com/demo/IMyService.aidl


5. 最小排错组合(路径/导入问题)

aidl --lang=java -I aidl -I system -o out/gen aidl/vendor/demo/IMyService.aidl

 

 

TODO: 试下加 systrace 的。

 

posted on 2020-09-26 19:40  Hello-World3  阅读(379)  评论(0)    收藏  举报

导航