aidl文件生成Java、C++[android]、C++[ndk]、Rust接口

目录


前言

在 Android 开发中,AIDL 文件通常会被自动编译,生成对应语言的接口文件。对于应用层 Java 开发者来说,使用 AIDL 和 Binder 封装的接口可以让他们更加专注于应用逻辑,而不需要过多关注 Binder 的调用细节或 AIDL 的编译过程。

然而,对于中下层开发者来说,包括 framework 和 native 层开发,可能需要编写 native service,并且有必要理解 Binder 的底层机制。

关于编译 AIDL 文件的过程,通常是由构建系统自动完成。在编译过程中,AIDL 文件会被处理并生成相应的接口文件,以便后续开发使用。生成的接口文件内容会根据具体的需求和语言类型而有所不同,可以根据生成的接口文件来进行后续的开发工作。

  • 如果使用 SDK 中的 aidl 工具,需要将其路径添加到系统的 PATH 环境变量中。通常位于路径:~/Android/Sdk/build-tools/33.0.2/aidl。
  • 而如果使用源码中的 aidl 工具,则在设置好源码编译环境后,这个工具会自动添加到系统的 PATH 环境变量中。源码中的 aidl 工具通常位于路径:out/soong/host/linux-x86/bin/aidl。

准备文件
ITestAudio.aidl

java 复制代码
package henry.test.audio;

interface ITestAudio{
    int requestAudioFocus(int streamType, int durationHint);
    int abandonAudioFocus();
    void requestAudioFocusForCall(int streamType, int durationHint);
    void abandonAudioFocusForCall();
    void setMode(int mode);
}

环境

源码环境:out/soong/host/linux-x86/bin/

aidl命令

aidl --lang={java|cpp|ndk} [options] input_aidl_file。

  • --lang={java|cpp|ndk}
    指定生成接口类型。如果不指定,默认生成Java文件。
  • -o 指定输出目录
    Java:省略-o参数,java文件生成到aidl文件目录下。
    C++/Rust:必选参数。
  • -I DIR, --include=DIR
    指定依赖的aidl文件所在目录。不是C++头文件目录。
    例如:A.aidl引用了B.aidl,在生成A.aidl的时候需要指定-I参数才能正常编译。
    只要是AIDL文件中有依赖,生成任何类型的接口(Java、C++、Rust)都要指定这个参数。

一、Java

java 复制代码
aidl -o ./java --lang=java henry/test/audio/ITestAudio.aidl
java 复制代码
tree ./java
./java
└── henry
    └── test
        └── audio
            └── ITestAudio.java

3 directories, 1 file

二、C++[android]

cpp:生成的代码是为了在Android源码中编译,代码中会调用Android源码中的native接口。

例如,引用的头文件:

<binder/IBinder.h>,<binder/IInterface.h>,<binder/Status.h>,<android-base/macros.h>

--lang=cpp,参数指定生成Android源码下编译的C++接口文件。

-o和-h参数分别指定.cpp文件和.h文件输出的路径。可以指定不同的目录。

C++接口文件比较多,一个aidl文件生成4个文件。第一步编译ITestAudio.aidl后,生成文件包括:

3个头文件:

一个Interface头文件:ITestAudio.h

一个Bp头文件:BpTestAudio.h

一个Bn头文件:BnTestAudio.h

一个源码文件:ITestAudio.cpp

java 复制代码
aidl -h ./cpp_android/ -o ./cpp_android --lang=cpp henry/test/audio/ITestAudio.aidl
java 复制代码
tree ./cpp_android/
./cpp_android/
└── henry
    └── test
        └── audio
            ├── BnTestAudio.h
            ├── BpTestAudio.h
            ├── ITestAudio.cpp
            └── ITestAudio.h

3 directories, 4 files

三、C++[ndk]

ndk:生成的代码是为了使用ndk独立编译,调用的是ndk的接口,

例如,引用的头文件:

<android/binder_interface_utils.h> <android/binder_ibinder.h>

--lang=ndk

java 复制代码
aidl -h ./cpp_ndk -o ./cpp_ndk --lang=ndk henry/test/audio/ITestAudio.aidl
java 复制代码
tree ./cpp_ndk/
./cpp_ndk/
├── aidl
│   └── henry
│       └── test
│           └── audio
│               ├── BnTestAudio.h
│               ├── BpTestAudio.h
│               └── ITestAudio.h
└── henry
    └── test
        └── audio
            └── ITestAudio.cpp

7 directories, 4 files

四、Rust接口

--lang=rust指定生成rust后端接口文件
较新Android 版本才支持

java 复制代码
aidl -o ./rust --lang=rust henry/test/audio/ITestAudio.aidl
java 复制代码
tree ./cpp_ndk/
./rust/
── henry
    └── test
        └── audio
            └── ITestAudio.rs
相关推荐
元亓亓亓1 小时前
Leet热题100--208. 实现 Trie (前缀树)--中等
java·开发语言
拿破轮1 小时前
不小心在idea中点了add 到版本控制 怎么样恢复?
java·ide·intellij-idea
cynicme6 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
青云交7 小时前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu7 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
ShineSpark8 小时前
Crashpad 在windows下编译和使用指南
c++·windows
Lei活在当下8 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
星释8 小时前
二级等保实战:MySQL安全加固
android·mysql·安全
不穿格子的程序员9 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
lkbhua莱克瓦249 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github