[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

这篇具有很好参考价值的文章主要介绍了[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AIDL文件在Android系统上应用广泛,和底层的Binder机制紧密关联。
在Android源码或者Android Studio中通常是自动编译aidl文件,生成对应语言的接口文件。
做应用层Java开发,aidl和binder封装的比较“干净”,不用太多的涉及binder的调用细节,也不用太关心aidl的编译过程。
如果是做中下层开发,包括framework、native层开发,可能需要编写native service,有必要理解binder的底层机制。

先从编译aidl开始。这里只说明编译aidl生成各种类型后端接口文件的过程。生成的接口文件内容再写文章单独介绍。

以下演示是在Ubuntu系统上测试的。

一、准备

1. aidl编译工具

即aidl命令,Android sdk或者Android源码中都有。

sdk中aidl,需要把路径添加到path中。
位置:~/Android/Sdk/build-tools/33.0.2/aidl

源码中aidl,设置源码编译环境后,自动添加到path中。
位置:out/soong/host/linux-x86/bin/aidl

2. 演示用的aidl文件

写2个简单的aidl文件,一个是服务接口,一个是回调接口。可用覆盖大部分的实际场景。
文件目录结构和文件内容如下。

$ tree .
.
└── aidl
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.aidl
                └── IMyServiceInterface.aidl

回调接口定义:

// IMyServiceCallback.aidl
package com.my.pkg;

 interface IMyServiceCallback {
    void onEvent(int code, String message);
}

服务接口定义:

// IMyServiceInterface
package com.my.pkg;

interface IMyServiceInterface {
    int doSomething(in String str, int num);
    void setCallBack(com.my.pkg.IMyServiceCallback callback);
}

二、生成Java接口

执行如下命令,生成Java接口文件。
说明:

  1. aidl使用说明
    aidl --lang={java|cpp|ndk} [options] input_aidl_file。
    在命令行中,aidl不带任何参数,打印使用说明。
  2. –lang={java|cpp|ndk}
    指定生成接口类型。如果不指定,默认生成Java文件。
  3. -o 指定输出目录
    Java:省略-o参数,java文件生成到aidl文件目录下。
    C++/Rust:必选参数。
    为了清除查看效果,指定到单独的目录:-o ./java
  4. -I DIR, --include=DIR
    import搜索路径,指定依赖的aidl文件所在目录。不是C++头文件目录。
    例如:IMyServiceInterface.aidl引用了IMyServiceCallback.aidl,在生成IMyServiceInterface.aidl的时候需要指定-I参数才能正常编译。
    只要是AIDL文件中有依赖,生成任何类型的接口(Java、C++、Rust)都要指定这个参数。
# 前2条命令效果相同,不指定--lang参数,默认生成Java文件
$ aidl -o ./java --lang=java aidl/com/my/pkg/IMyServiceCallback.aidl 
$ aidl -o ./java aidl/com/my/pkg/IMyServiceCallback.aidl 

$ aidl -I ./aidl/ -o ./java aidl/com/my/pkg/IMyServiceInterface.aidl

$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── java
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.java
                └── IMyServiceInterface.java

三、生成C++[Android]接口

  1. cpp和ndk的区别
    cpp:生成的代码是为了在Android源码中编译,代码中会调用Android源码中的native接口。
    例如,引用的头文件:
    <binder/IBinder.h>,<binder/IInterface.h>,<binder/Status.h>,<android-base/macros.h>

    ndk:生成的代码是为了使用ndk独立编译,调用的是ndk的接口,
    例如,引用的头文件:
    <android/binder_interface_utils.h> <android/binder_ibinder.h>

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

  3. -o和-h参数分别指定.cpp文件和.h文件输出的路径。可以指定不同的目录。
    1)C++接口文件比较多,一个aidl文件生成4个文件。第一步编译IMyServiceCallback.aidl后,生成文件包括:
    3个头文件:
    一个Interface头文件:IMyServiceCallback.h
    一个Bp头文件:BpMyServiceCallback.h
    一个Bn头文件:BnMyServiceCallback.h
    一个源码文件:IMyServiceCallback.cpp

$ aidl -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceCallback.aidl
$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── cpp_android
    └── com
        └── my
            └── pkg
                ├── BnMyServiceCallback.h
                ├── BpMyServiceCallback.h
                ├── IMyServiceCallback.cpp
                └── IMyServiceCallback.h

$ aidl -I ./aidl/ -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceInterface.aidl
$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── cpp_android
    └── com
        └── my
            └── pkg
                ├── BnMyServiceCallback.h
                ├── BnMyServiceInterface.h
                ├── BpMyServiceCallback.h
                ├── BpMyServiceInterface.h
                ├── IMyServiceCallback.cpp
                ├── IMyServiceCallback.h
                ├── IMyServiceInterface.cpp
                └── IMyServiceInterface.h

四、生成C++[ndk]接口

除了–lang=ndk指定生成ndk后端接口,过程和结果都和cpp类似。文章来源地址https://www.toymoban.com/news/detail-478191.html

$ aidl -I ./aidl/ -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceInterface.aidl 
$ aidl -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceCallback.aidl 

$ tree cpp_*
cpp_android
└── com
    └── my
        └── pkg
            ├── BnMyServiceCallback.h
            ├── BnMyServiceInterface.h
            ├── BpMyServiceCallback.h
            ├── BpMyServiceInterface.h
            ├── IMyServiceCallback.cpp
            ├── IMyServiceCallback.h
            ├── IMyServiceInterface.cpp
            └── IMyServiceInterface.h
cpp_ndk
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── BnMyServiceCallback.h
│               ├── BnMyServiceInterface.h
│               ├── BpMyServiceCallback.h
│               ├── BpMyServiceInterface.h
│               ├── IMyServiceCallback.h
│               └── IMyServiceInterface.h
└── com
    └── my
        └── pkg
            ├── IMyServiceCallback.cpp
            └── IMyServiceInterface.cpp

五、生成Rust接口文件

  1. –lang=rust指定生成rust后端接口文件。
  2. 只需通过-o参数设置输出路径即可,输出结果和Java类似,一个aidl文件对应一个.rs文件。
  3. Rust后端是比较新版本的aidl才支持的,可能是Android 12以后,可以查看aidl命令帮助确认。
$ aidl -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceCallback.aidl 
$ aidl -I ./aidl/ -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceInterface.aidl

$ tree 
.
├── aidl
│   └── com
│       └── my
│           └── pkg
│               ├── IMyServiceCallback.aidl
│               └── IMyServiceInterface.aidl
└── rust
    └── com
        └── my
            └── pkg
                ├── IMyServiceCallback.rs
                └── IMyServiceInterface.rs

到了这里,关于[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Android AIDL] --- AIDL原理简析

    上一篇文章已经讲述了如何在Android studio中搭建基于aidl的cs模型框架,只是用起来了,这次对aidl及cs端如何调用的原理进行简单分析 AIDL 文件可以分为两类。 一类是用来定义接口方法,声明要暴露哪些接口给客户端调用; 一类用来声明实现了 Parcelable 接口的数据类型,以供其

    2024年02月10日
    浏览(43)
  • Android AIDL基本使用

    AIDL是Android多进程通讯方式一种。 如要使用 AIDL 创建绑定服务,请执行以下步骤: 创建 .aidl 文件 此文件定义带有方法签名的编程接口。 实现接口 Android SDK 工具会基于您的  .aidl  文件,使用 Java 编程语言生成接口。此接口拥有一个名为  Stub  的内部抽象类,用于扩展  B

    2024年02月09日
    浏览(36)
  • Android:AIDL实战详解

    AIDL:Android Interface Definition Language AIDL是为了实现进程间通信而设计的Android接口语言 Android进程间通信有多种方式,Binder机制是其中最常见的一种 AIDL的本质 就是基于对Binder的运用从而实现进程间通信 这篇博文从实战出发,用一个尽可能精简的Demo,实现两个App (也是两个进程:

    2024年02月08日
    浏览(40)
  • android aidl进程间通信封装通用实现

    接上一篇的分析,今天继续 aidl复杂流程封装-CSDN博客 今天的任务就是将代码梳理下放进来 1 项目gradle配置:    需要将对应的代码放到各自的目录下,这里仅贴下关键内容,细节可以下载代码慢慢看     sourceSets {         main {             manifest.srcFile \\\'src/main/AndroidManife

    2024年02月22日
    浏览(37)
  • Android Binder——APP中AIDL实现(十九)

            AIDL(Android Interface Definition Language)其实就是对 Binder 通信的一个封装,方便在开发中对 Binder 通信的使用,这里我们就从头开始来看一下 AIDL 通信的创建过程。         通过 Android Studio 的 File -New - AIDL 的方式就会生成对应包名的 aidl 文件。即 aidl 文件要与应用

    2024年04月28日
    浏览(28)
  • Android:AIDL简单介绍+传递简单数据+传递复杂数据

    对于AIDL的学习,这些也只能说是我在学习中的理解,有理解不到位或者错的地方也欢迎指正。 AIDL的目的就是实现进程之间的通信, 尤其是在涉及多进程并发情况下的进程间通信 。可以将aidl理解为两个进程之间的桥梁,并制定规则,使其传输特定数据。 1.AIDL支持的数据类型

    2024年02月21日
    浏览(40)
  • Android中AIDL的简单使用(Hello world)

    AIDL:Android Interface Definition Language(Android接口定义语言) 作用:跨进程通讯。如A应用调用B应用提供的接口 A应用创建aidl接口,并且创建一个Service来实现这个接口(在onBind方法里面return我们这个接口的实例)。 把A应用创建的aidl文件原封不动的搬至B应用中(注意包名类名都

    2024年02月11日
    浏览(49)
  • 深入解析Android AIDL:实现跨进程通信的利器

    Android Interface Definition Language (AIDL) 是一种Android系统中的跨进程通信机制。AIDL允许一个应用程序的组件与另一个应用程序的组件通信,并在两者之间传输数据。 AIDL的主要作用是帮助不同进程间共享数据和服务,让他们能够互相调用。例如,在开发一个多功能的音乐播放器时,

    2024年02月19日
    浏览(42)
  • android aidl进程间通信封装通用实现-用法说明

    接上一篇:android aidl进程间通信封装通用实现-CSDN博客 该aar包的使用还是比较方便的 一先看客户端 1 初始化 2 发送事件:  就是通过json的形式将参数包裹进来,另一端统一解析  唯一标志位:KEY_CLIENT_REQUEST_AUTHOR 是必须要加的,不然区分不出来是那个客户端 二再看服务端

    2024年02月20日
    浏览(34)
  • Android高版本(targetSdkVersion >= 30)AIDL bindService失败问题

    (一)解决办法 方案1:         项目的 targetSdkVersion 版本修改到30以下。 方案2【推荐】:         CLIENT项目端,如果targetSdkVersion = 30,则在项目的manifest文件,添加queries这个标签: (二) 更详细的说明请跳转: AIDL报错,bindService一直连接不上、不起作用。_马占柱的博客-

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包