先准备aidl文件,文件目录结果如下。
aidl文件内容,参见:【Android AIDL系列 1:手动编译aidl文件,生成Java、C++(android)、C++(ndk)、Rust接口】
$ tree
.
├── Android.bp
└── com
└── my
└── pkg
├── IMyServiceCallback.aidl
└── IMyServiceInterface.aidl
在Android源码里编译,关键是Android.bp文件。适用aidl_interface编译指令,可以支持4中后端语言接口:Java,cpp,ndk,rust。根据需要选择开启(enabled: true),生成对应语言的接口文件。
编译生成ndk的后端接口,关闭其他后端语言接口。
aidl_interface {
name: "MyServiceAidlInterface",
srcs: [ "com/my/pkg/*.aidl", ],
unstable: true,
backend: {
java: {
enabled: false,
platform_apis: true,
},
cpp: {
enabled: false,
},
ndk: {
enabled: true,
vndk: {
enabled: false,
},
},
// Android 12以下不支持编译生成rust后端
// rust: {
// // By default, the Rust backend is not enabled
// enabled: true,
// },
},
}
源码中文件路径
.bp文件和.aidl文件在Android源码路径如下,这个路径是任选的。说明是为了下一步找到生成的接口文件。
$android_source/vendor/service/my_service
生成接口文件路径:
a n d r o i d s o u r c e / o u t / s o o n g / . i n t e r m e d i a t e s / v e n d o r / s e r v i c e / m y s e r v i c e 这个路径是编译时系统自动生成的。前半部分( android_source/out/soong/.intermediates/vendor/service/my_service 这个路径是编译时系统自动生成的。 前半部分( androidsource/out/soong/.intermediates/vendor/service/myservice这个路径是编译时系统自动生成的。前半部分(android_source/out/soong/.intermediates/)是Android源码编译生成的中间文件所在目录,后半部分(vendor/service/my_service)是对应的.aidl文件在源码中的目录。
编译后生成4个文件夹,其中带“-source”后缀的2个文件夹中,包含头文件和源码文件,另外两个文件夹中是编译过程中的.o文件和编译完成的动态库.so文件。
MyServiceAidlInterface-ndk-source和MyServiceAidlInterface-ndk_platform-source目录下源码是一样的,diff没有差别。生成的二进制文件是不同的。(TODO 这个和platform_apis的关系还不确定,ndk的后端没有platform_apis的属性。还是对于ndk来说,platform_apis是必须开启的?)
分类 | 源码 | 二进制 |
---|---|---|
MyServiceAidlInterface-ndk | MyServiceAidlInterface-ndk-source | MyServiceAidlInterface-ndk |
MyServiceAidlInterface-ndk_platform | MyServiceAidlInterface-ndk_platform-source | MyServiceAidlInterface-ndk_platform |
ndk生成结果
# 生成以下4个文件夹
$ ls -1
MyServiceAidlInterface-ndk
MyServiceAidlInterface-ndk-source
MyServiceAidlInterface-ndk_platform
MyServiceAidlInterface-ndk_platform-source
$ find . -name *.cpp
./MyServiceAidlInterface-ndk-source/gen/com/my/pkg/IMyServiceCallback.cpp
./MyServiceAidlInterface-ndk-source/gen/com/my/pkg/IMyServiceInterface.cpp
./MyServiceAidlInterface-ndk_platform-source/gen/com/my/pkg/IMyServiceCallback.cpp
./MyServiceAidlInterface-ndk_platform-source/gen/com/my/pkg/IMyServiceInterface.cpp
$ find . -name *.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BpMyServiceCallback.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BpMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/IMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BnMyServiceInterface.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/BnMyServiceCallback.h
./MyServiceAidlInterface-ndk-source/gen/include/aidl/com/my/pkg/IMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BpMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BpMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/IMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BnMyServiceInterface.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/BnMyServiceCallback.h
./MyServiceAidlInterface-ndk_platform-source/gen/include/aidl/com/my/pkg/IMyServiceCallback.h
Java后端接口的编译结果
$ ls -1
MyServiceAidlInterface-java
MyServiceAidlInterface-java-source
$ find . -name *.java
./MyServiceAidlInterface-java-source/gen/com/my/pkg/IMyServiceInterface.java
./MyServiceAidlInterface-java-source/gen/com/my/pkg/IMyServiceCallback.java
生成cpp、rust后端情况类似,不再重复。