简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:解决Android14添加binder接口报错问题。
2.报错信息
- error: static assertion failed due to requirement ‘internal::allowedManualInterface(“android.demo.IMyService”)’: b/64223
827: Manually written binder interfaces are considered error prone and frequently have bugs. The preferred way to add interfaces is to define an .aidl file to auto-generate the interface. If an interface must be manually written, add its name to the whitelist.
IMPLEMENT_META_INTERFACE(MyService, “android.demo.IMyService”);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - frameworks/native/libs/binder/include/binder/IInterface.h:116:5: note: expanded from macro ‘IMPLEMENT_META_INTERFACE’
static_assert(internal::allowedManualInterface(NAME),
3.Binder介绍
- Binder,全称为Android Binder IPC(Inter-Process Communication),是Android系统中用于进程间通信的一种机制。它是一种基于C/S(客户端/服务器)模式的通信方式,主要由客户端、服务端和Binder驱动组成。Binder机制在Android系统中具有重要的地位,因为它使得不同的进程之间能够高效、安全地进行数据交换。
- 在Android系统中,进程间通信的需求非常普遍。例如,当一个应用程序需要访问另一个进程中的功能或数据时,它们需要通过某种方式进行通信。Binder机制为这种通信提供了便捷的方式。通过使用Binder,进程间可以像本地代码一样进行通信,而无需关心底层的网络协议或数据序列化等问题。
- Binder通信机制的主要组成部分如下:
- 客户端(Client):发起通信请求的一方。客户端需要知道服务端的接口和方法,以便进行调用。
- 服务端(Server):提供功能或数据的一方。服务端需要实现一个或多个接口,并注册到Binder驱动中,以便客户端能够找到并调用它们。
- Binder驱动:位于内核空间,负责处理进程间通信的请求。Binder驱动负责将客户端的请求传递给服务端,并将服务端的响应返回给客户端。
- 代理(Proxy)和本地方法(Stub):在客户端和服务端之间起到中转作用。代理位于用户空间,负责将客户端的请求发送给Binder驱动;本地方法位于内核空间,负责接收Binder驱动的请求并调用服务端的方法。
Binder机制的工作流程如下: - 服务端实现一个或多个接口,并注册到Binder驱动中。注册过程中,服务端会创建一个Binder对象,该对象包含了服务端接口的方法列表。
- 客户端通过查找Binder对象,找到服务端接口,并调用其中方法。客户端的调用会被代理发送给Binder驱动。
- Binder驱动接收到客户端的请求后,查找对应的服务端Binder对象,并将请求传递给它。
- 服务端的Binder对象接收到请求后,调用相应的方法,并将结果返回给Binder驱动。
- Binder驱动将服务端的响应返回给客户端。
Binder机制具有以下优点: - 高效:Binder机制基于内存映射,避免了数据在进程间的复制,从而提高了通信效率。
- 安全:Binder机制提供了权限控制,只有具有相应权限的进程才能进行通信。
- 灵活:Binder机制支持多种类型的数据传输,包括基本数据类型、对象和文件等。
- 跨平台:Binder机制可以运行在不同的硬件平台上,具有良好的兼容性。
总之,Binder机制在Android系统中起着至关重要的作用,它为进程间通信提供了高效、安全的方式。通过对Binder机制的了解,开发者可以更好地掌握Android系统的底层原理,并在开发过程中更加高效地进行进程间通信。
4.解决方案
- frameworks/native/libs/binder/include/binder/IInterface.h
修改前:
#ifndef DO_NOT_CHECK_MANUAL_BINDER_INTERFACES
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
static_assert(internal::allowedManualInterface(NAME), \
"b/64223827: Manually written binder interfaces are " \
"considered error prone and frequently have bugs. " \
"The preferred way to add interfaces is to define " \
"an .aidl file to auto-generate the interface. If " \
"an interface must be manually written, add its " \
"name to the whitelist."); \
DO_NOT_DIRECTLY_USE_ME_IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
#else
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
DO_NOT_DIRECTLY_USE_ME_IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
#endif
修改后:
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
DO_NOT_DIRECTLY_USE_ME_IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \