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

先准备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后端情况类似,不再重复。

猜你喜欢

转载自blog.csdn.net/yinminsumeng/article/details/129409178