[Android AIDL系列 2] Android源码中编译.aidl文件

文章详细介绍了如何在Android源码中使用Android.bp文件和aidl_interface指令编译AIDL文件,以生成Java、cpp和ndk的后端语言接口。重点在于配置Android.bp文件,启用ndk后端并关闭其他后端。编译后,会自动生成对应语言的头文件、源码文件以及编译产物。文章还提到了平台APIs在ndk后端的作用以及编译结果的目录结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先准备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-ndkMyServiceAidlInterface-ndk-sourceMyServiceAidlInterface-ndk
MyServiceAidlInterface-ndk_platformMyServiceAidlInterface-ndk_platform-sourceMyServiceAidlInterface-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后端情况类似,不再重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抓饼先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值