binder 2

第一部分 Binder的组成
1.1 驱动程序部分驱动程序的部分在以下的文件夹中:
Java 代码
  1. kernel/include/linux/binder.h
  2. kernel/drivers/android/binder.c
kernel/include/linux/binder.h
kernel/drivers/android/binder.c

binder驱动程序是一个miscdevice,主设备号为10,此设备号使用动态获得(MISC_DYNAMIC_MINOR),其设备的节点为:
/dev/binder
binder驱动程序会在proc文件系统中建立自己的信息,其文件夹为/proc/binder,其中包含如下内容:
proc目录:调用Binder各个进程的内容
state文件:使用函数binder_read_proc_state
stats文件:使用函数binder_read_proc_stats
transactions文件:使用函数binder_read_proc_transactions
transaction_log文件:使用函数binder_read_proc_transaction_log,其参数为 binder_transaction_log (类型为struct binder_transaction_log)
failed_transaction_log文件:使用函数binder_read_proc_transaction_log 其参数为
binder_transaction_log_failed (类型为struct binder_transaction_log)

在binder文件被打开后,其私有数据(private_data)的类型:
struct binder_proc
在这个数据结构中,主要包含了当前进程、进程ID、内存映射信息、Binder的统计信息和线程信息等。
在用户空间对Binder驱动程序进行控制主要使用的接口是mmap、poll和ioctl,ioctl主要使用的ID为:
Java 代码
  1. #define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read)
  2. #define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, int64_t)
  3. #define BINDER_SET_MAX_THREADS _IOW('b', 5, size_t)
  4. #define BINDER_SET_IDLE_PRIORITY _IOW('b', 6, int)
  5. #define BINDER_SET_CONTEXT_MGR _IOW('b', 7, int)
  6. #define BINDER_THREAD_EXIT _IOW('b', 8, int)
  7. #define BINDER_VERSION _IOWR('b', 9, struct binder_version)
#define BINDER_WRITE_READ        _IOWR('b', 1, struct binder_write_read)
#define BINDER_SET_IDLE_TIMEOUT  _IOW('b', 3, int64_t)
#define BINDER_SET_MAX_THREADS   _IOW('b', 5, size_t)
#define BINDER_SET_IDLE_PRIORITY _IOW('b', 6, int)
#define BINDER_SET_CONTEXT_MGR   _IOW('b', 7, int)
#define BINDER_THREAD_EXIT       _IOW('b', 8, int)
#define BINDER_VERSION           _IOWR('b', 9, struct binder_version)

BR_XXX等宏为BinderDriverReturnProtocol,表示Binder驱动返回协议。
BC_XXX等宏为BinderDriverCommandProtocol,表示Binder驱动命令协议。
binder_thread是Binder驱动程序中使用的另外一个重要的数据结构,数据结构的定义如下所示:
Java 代码
  1. struct binder_thread {
  2. struct binder_proc *proc;
  3. struct rb_node rb_node;
  4. int pid;
  5. int looper;
  6. struct binder_transaction *transaction_stack;
  7. struct list_head todo;
  8. uint32_t return_error;
  9. uint32_t return_error2;
  10. wait_queue_head_t wait;
  11. struct binder_stats stats;
  12. };
struct binder_thread {
      struct binder_proc *proc;
     struct rb_node rb_node;
     int pid;
     int looper;
     struct binder_transaction *transaction_stack;
     struct list_head todo;
     uint32_t return_error;
     uint32_t return_error2;
     wait_queue_head_t wait;
     struct binder_stats stats;
};

binder_thread 的各个成员信息是从rb_node中得出。
BINDER_WRITE_READ是最重要的ioctl,它使用一个数据结构binder_write_read定义读写的数据。
Java 代码
  1. struct binder_write_read {
  2. signed long write_size;
  3. signed long write_consumed;
  4. unsigned long write_buffer;
  5. signed long read_size;
  6. signed long read_consumed;
  7. unsigned long read_buffer;
  8. };
struct binder_write_read {
     signed long write_size;
     signed long write_consumed;
     unsigned long write_buffer;
     signed long read_size;
     signed long read_consumed;
     unsigned long read_buffer;
};

1.2 servicemanager部分 servicemanager是一个守护进程,用于这个进程的和/dev/binder通讯,从而达到管理系统中各个服务的作用。
可执行程序的路径:
/system/bin/servicemanager
开源版本文件的路径:
Java 代码
  1. frameworks/base/cmds/servicemanager/binder.h
  2. frameworks/base/cmds/servicemanager/binder.c
  3. frameworks/base/cmds/servicemanager/service_manager.c
frameworks/base/cmds/servicemanager/binder.h
frameworks/base/cmds/servicemanager/binder.c
frameworks/base/cmds/servicemanager/service_manager.c

程序执行的流程:

open():打开binder驱动

mmap():映射一个128*1024字节的内存

ioctl(BINDER_SET_CONTEXT_MGR):设置上下文为mgr
进入主循环binder_loop()
ioctl(BINDER_WRITE_READ),读取
binder_parse()进入binder处理过程循环处理
binder_parse()的处理,调用返回值:
当处理BR_TRANSACTION的时候,调用svcmgr_handler()处理增加服务、检查服务等工作。各种服务存放在一个链表(svclist)中。其中调用binder_等开头的函数,又会调用ioctl的各种命令。
处理BR_REPLY的时候,填充binder_io类型的数据结
1.3 binder的库的部分
binder相关的文件作为Android的uitls库的一部分,这个库编译后的名称为libutils.so,是Android系统中的一个公共库。
主要文件的路径如下所示:
Java 代码
  1. frameworks/base/include/utils/*
  2. frameworks/base/libs/utils/*
frameworks/base/include/utils/*
frameworks/base/libs/utils/*


主要的类为:
RefBase.h :
引用计数,定义类RefBase。
Parcel.h :
为在IPC中传输的数据定义容器,定义类Parcel
IBinder.h:
Binder对象的抽象接口, 定义类IBinder
Binder.h:
Binder对象的基本功能, 定义类Binder和BpRefBase
BpBinder.h:
BpBinder的功能,定义类BpBinder
IInterface.h:
为抽象经过Binder的接口定义通用类,
定义类IInterface,类模板BnInterface,类模板BpInterface
ProcessState.h
表示进程状态的类,定义类ProcessState
IPCThreadState.h
表示IPC线程的状态,定义类IPCThreadState
各个类之间的关系如下所示:



在IInterface.h中定义的BnInterface和BpInterface是两个重要的模版,这是为各种程序中使用的。
BnInterface模版的定义如下所示:
Java 代码
  1. template
  2. class BnInterface : public INTERFACE, public BBinder
  3. {
  4. public:
  5. virtual sp queryLocalInterface(const String16& _descriptor);
  6. virtual String16 getInterfaceDescriptor() const;
  7. protected:
  8. virtual IBinder* onAsBinder();
  9. };
  10. BnInterface 模版的定义如下所示:
  11. template
  12. class BpInterface : public INTERFACE, public BpRefBase
  13. {
  14. public:
  15. BpInterface(const sp& remote);
  16. protected:
  17. virtual IBinder* onAsBinder();
  18. };
template
class BnInterface : public INTERFACE, public BBinder
{
public:
    virtual sp  queryLocalInterface(const String16& _descriptor);
    virtual String16        getInterfaceDescriptor() const;
protected:
    virtual IBinder*        onAsBinder();
};
     BnInterface模版的定义如下所示:
template
class BpInterface : public INTERFACE, public BpRefBase
{
public:
                            BpInterface(const sp& remote);
protected:
    virtual IBinder*    onAsBinder();
};

这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE,然后使用BnInterface和BpInterface 两个模版结合自己的接口,构建自己的BnXXX和BpXXX两个类。
DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现:
Java 代码
  1. #define DECLARE_META_INTERFACE(INTERFACE) /
  2. static const String16 descriptor; /
  3. static sp asInterface(const sp& obj); /
  4. virtual String16 getInterfaceDescriptor() const; /
  5. #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) /
  6. const String16 I##INTERFACE::descriptor(NAME); /
  7. String16 I##INTERFACE::getInterfaceDescriptor() const { /
  8. return I##INTERFACE::descriptor; /
  9. } /
  10. sp I##INTERFACE::asInterface(const sp& obj) /
  11. { /
  12. sp intr; /
  13. if (obj != NULL) { /
  14. intr = static_cast( /
  15. obj->queryLocalInterface( /
  16. I##INTERFACE::descriptor).get()); /
  17. if (intr == NULL) { /
  18. intr = new Bp##INTERFACE(obj); /
  19. } /
  20. } /
  21. return intr; /
  22. }
#define DECLARE_META_INTERFACE(INTERFACE)                               /
    static const String16 descriptor;                                   /
    static sp asInterface(const sp& obj);        /
    virtual String16 getInterfaceDescriptor() const;                    /
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       /
    const String16 I##INTERFACE::descriptor(NAME);                      /
    String16 I##INTERFACE::getInterfaceDescriptor() const {             /
        return I##INTERFACE::descriptor;                                /
    }                                                                   /
    sp I##INTERFACE::asInterface(const sp& obj)  /
    {                                                                   /
        sp intr;                                          /
        if (obj != NULL) {                                              /
            intr = static_cast(                          /
                obj->queryLocalInterface(                               /
                        I##INTERFACE::descriptor).get());               /
            if (intr == NULL) {                                         /
                intr = new Bp##INTERFACE(obj);                          /
            }                                                           /
        }                                                               /
        return intr;                                                    /
    }


在定义自己的类的时候,只需要使用DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个接口,并
结合类的名称,就可以实现BpInterface中的asInterface()和getInterfaceDescriptor()两个函数。
第二部分 Binder的运作
  2.1 Binder的工作机制
Service Manager是一个守护进程,它负责启动各个进程之间的服务,对于相关的两个需要通讯的进程,它们通过调用libutil.so库实现通讯,而真正通讯的机制,是内核空间中的一块共享内存。



  2.2 从应  用程序的角度看Binder

  从应用程序的角度看Binder一共有三个方面:
  Native 本地:例如BnABC,这是一个需要被继承和实现的类。
  Proxy 代理:例如BpABC,这是一个在接口框架中被实现,但是在接口中没有体现的类。
  客户端:例如客户端得到一个接口ABC,在调用的时候实际上被调用的是BpABC



本地功能(Bn)部分做的:
实现BnABC:: BnTransact()
注册服务:IServiceManager::AddService
代理部分(Bp)做的:
实现几个功能函数,调用BpABC::remote()->transact()
客户端做的:
获得ABC接口,然后调用接口(实际上调用了BpABC,继而通过IPC调用了BnABC,然后调用了具体的功能)

在程序的实现过程中BnABC和BpABC是双继承了接口ABC。一般来说BpABC是一个实现类,这个实现类不需要在接口中体现,它实际上负责的只是通讯功能,不执行具体的功能;BnABC则是一个接口类,需要一个真正工作的类来继承、实现它,这个类才是真正执行具体功能的类。
在客户端中,从ISeriviceManager中获得一个ABC的接口,客户端调用这个接口,实际上是在调用BpABC,而BpABC又通过 Binder的IPC机制和BnABC通讯,BnABC的实现类在后面执行。
  事实上,
服务器
的具体实现和客户端是两个不同的进程,如果不考虑进程间通讯的过程,从调用者的角度,似乎客户端在直接调用另外一个进程间的函数——当然这个函数必须是接口ABC中定义的。
  2.3 ISericeManager的作用

ISericeManager涉及的两个文件是ISericeManager.h和ISericeManager.cpp。这两个文件基本上是
ISericeManager。ISericeManager是系统最先被启动的服务。非常值得注意的是:ISericeManager本地功能并没有使
现,它实际上由ServiceManager守护进程执行,而用户程序通过调用BpServiceManager来获得其他的服务。
在ISericeManager.h中定义了一个接口,用于得到默认的ISericeManager:
sp defaultServiceManager();
这时得到的ISericeManager实际上是一个全局的ISericeManager。
第三部分 程序中Binder的具体实现
  3.1 一个利用接口的具体实现
PermissionController也是libutils中定义的一个有关权限控制的接口,它一共包含两个文件:IPermissionController.h和IPermissionController.cpp这个结构在所有类的实现中都是类似的。
头文件IPermissionController.h的主要内容是定义IPermissionController接口和类 BnPermissionController:
Java 代码
  1. class IPermissionController : public IInterface
  2. {
  3. public:
  4. DECLARE_META_INTERFACE(PermissionController);
  5. virtual bool checkPermission(const String16& permission,int32_t pid, int32_t uid) = 0;
  6. enum {
  7. CHECK_PERMISSION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION
  8. };
  9. };
  10. class BnPermissionController : public BnInterface
  11. {
  12. public:
  13. virtual status_t onTransact( uint32_t code,
  14. const Parcel& data,
  15. Parcel* reply,
  16. uint32_t flags = 0);
  17. };
class IPermissionController : public IInterface
{
public:
    DECLARE_META_INTERFACE(PermissionController);
    virtual bool   checkPermission(const String16& permission,int32_t pid, int32_t uid) = 0;
    enum {
        CHECK_PERMISSION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION
    };
};
class BnPermissionController : public BnInterface
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

IPermissionController是一个接口类,只有checkPermission()一个纯虚函数。


BnPermissionController继承了以BnPermissionController实例化模版类BnInterface。因
此,BnPermissionController,事实上BnPermissionController双继承了BBinder和
IPermissionController。
实现文件IPermissionController.cpp中,首先实现了一个BpPermissionController。
Java 代码
  1. class BpPermissionController : public BpInterface
  2. {
  3. public:
  4. BpPermissionController(const sp& impl)
  5. : BpInterface(impl)
  6. {
  7. }
  8. virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid)
  9. {
  10. Parcel data, reply;
  11. data.writeInterfaceToken(IPermissionController::
  12. getInterfaceDescriptor());
  13. data.writeString16(permission);
  14. data.writeInt32(pid);
  15. data.writeInt32(uid);
  16. remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
  17. if (reply.readInt32() != 0) return 0;
  18. return reply.readInt32() != 0;
  19. }
  20. };
class BpPermissionController : public BpInterface
{
public:
    BpPermissionController(const sp& impl)
        : BpInterface(impl)
    {
    }
    virtual bool checkPermission(const String16& permission, int32_t pid, int32_t uid)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IPermissionController::
                                       getInterfaceDescriptor());
        data.writeString16(permission);
        data.writeInt32(pid);
        data.writeInt32(uid);
        remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
        if (reply.readInt32() != 0) return 0;
        return reply.readInt32() != 0;
    }
};

IMPLEMENT_META_INTERFACE(PermissionController, "android.os.IPermissionController");


BpPermissionController继承了BpInterface,它本身是一个
已经实现的类,而且并没有在接口中体现。这个类按照格式写就可以,在实现checkPermission()函数的过程中,使用Parcel作为传输数据
的容器,传输中时候transact()函数,其参数需要包含枚举值CHECK_PERMISSION_TRANSACTION。
IMPLEMENT_META_INTERFACE用于扶助生成。
BnPermissionController中实现的onTransact()函数如下所示:
Java 代码
  1. status_t BnPermissionController:: BnTransact(
  2. uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
  3. {
  4. switch(code) {
  5. case CHECK_PERMISSION_TRANSACTION: {
  6. CHECK_INTERFACE(IPermissionController, data, reply);
  7. String16 permission = data.readString16();
  8. int32_t pid = data.readInt32();
  9. int32_t uid = data.readInt32();
  10. bool res = checkPermission(permission, pid, uid);
  11. reply->writeInt32(0);
  12. reply->writeInt32(res ? 1 : 0);
  13. return NO_ERROR;
  14. } break;
  15. default:
  16. return BBinder:: BnTransact(code, data, reply, flags);
  17. }
  18. }
status_t BnPermissionController:: BnTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case CHECK_PERMISSION_TRANSACTION: {
            CHECK_INTERFACE(IPermissionController, data, reply);
            String16 permission = data.readString16();
            int32_t pid = data.readInt32();
            int32_t uid = data.readInt32();
            bool res = checkPermission(permission, pid, uid);
            reply->writeInt32(0);
            reply->writeInt32(res ? 1 : 0);
            return NO_ERROR;
        } break;
        default:
            return BBinder:: BnTransact(code, data, reply, flags);
    }
}


在onTransact()函数中根据枚举值判断数据使用的方式。注意,由于BnPermissionController也是继承了类
IPermissionController,但是纯虚函数checkPermission()依然没有实现。因此这个
BnPermissionController类并不能实例化,它其实也还是一个接口,需要一个实现类来继承它,那才是实现具体功能的类。
  3.2 BnABC的实现
本地服务启动后将形成一个守护进程,具体的本地服务是由一个实现类继承BnABC来实现的,这个服务的名称通常叫做ABC。
在其中,通常包含了一个instantiate()函数,这个函数一般按照如下的方式实现:
void ABC::instantiate() {
defaultServiceManager()->addService(
String16("XXX.ABC"), new ABC ());
}
按照这种方式,通过调用defaultServiceManager()函数,将增加一个名为"XXX.ABC"的服务。
在这个defaultServiceManager()函数中调用了:
ProcessState::self()->getContextObject(NULL));
IPCThreadState* ipc = IPCThreadState::self();
IPCThreadState::talkWithDriver()
在ProcessState 类建立的过程中调用open_driver()打开
驱动
程序,在talkWithDriver()的执行过程中。
  3.3 BpABC调用的实现
BpABC调用的过程主要通过mRemote()->transact() 来传输数据,mRemote()是BpRefBase的成员,它是一个IBinder。这个调用过程如下所示:
Java 代码
  1. mRemote()->transact()
  2. Process::self()
  3. IPCThreadState::self()->transact()
  4. writeTransactionData()
  5. waitForResponse()
  6. talkWithDriver()
  7. ioctl(fd, BINDER_WRITE_READ, &bwr)
<think>我们正在讨论AIDL和Binder,根据提供的引用,我们可以总结如下: 1. **Binder原理**:Binder是Android中用于进程间通信(IPC)的机制。它采用C/S架构,其中包含服务端接口、Binder驱动和客户端接口。服务端提供具体的功能实现,客户端通过Binder驱动访问服务端的功能。Binder驱动在内核空间处理数据传输,实现了高效的进程间通信。[^5] 2. **AIDL原理**:AIDL(Android Interface Definition Language)是一种接口定义语言,用于生成Binder相关的代码。当我们定义一个AIDL接口并编译后,系统会自动生成一个Java类(如`IStudentManager.java`),其中包含: - `Stub`类:继承自`Binder`并实现AIDL接口,作为服务端的基类。服务端需要继承`Stub`并实现具体方法。 - `Proxy`类:同样实现AIDL接口,作为客户端的代理。客户端通过`Proxy`将调用请求通过Binder驱动转发给服务端。[^1][^4] 3. **使用方法**: - **定义AIDL接口**:创建`.aidl`文件,声明接口和方法。 - **实现服务端**:创建一个Service,继承`Stub`并实现AIDL接口中的方法,然后在`onBind()`方法中返回该`Stub`实例。 - **客户端绑定服务**:通过`bindService()`绑定服务,在`ServiceConnection`回调中获取`IBinder`对象,然后使用`Stub.asInterface(binder)`得到AIDL接口的代理对象,通过该代理对象调用远程方法。[^4] 4. **应用场景**: - 进程间通信:当应用需要跨进程访问服务(如后台音乐服务、传感器服务等)时使用。 - 插件化开发:在插件化框架中,通过AIDL和Binder实现宿主与插件间的通信,例如动态加载插件的组件(Activity、Service等)。[^2] - 系统服务:Android的系统服务(如ActivityManagerService)都是通过Binder机制提供给应用使用的。 下面我们将详细展开说明: ### 1. Binder原理 Binder是Android特有的IPC机制,其核心是一个位于内核空间的Binder驱动。它的优势在于: - **高效**:相比传统IPC(如Socket、管道),Binder只需一次数据拷贝。 - **安全性**:支持调用方身份验证(UID/PID)。 - **面向对象**:可以像调用本地方法一样调用远程方法。 工作流程: 1. 服务端在Service Manager中注册服务。 2. 客户端通过Service Manager获取服务的引用(实际是一个Binder代理对象)。 3. 客户端调用代理对象的方法,请求经由Binder驱动传递到服务端。 4. 服务端执行方法并将结果通过Binder驱动返回给客户端。 ### 2. AIDL原理 AIDL是为了简化Binder编程而设计的工具。例如,定义以下AIDL: ```aidl // IStudentManager.aidl interface IStudentManager { List<Student> getStudents(); } ``` 编译后生成的`IStudentManager.java`包含关键结构: ```java public interface IStudentManager extends android.os.IInterface { // Stub类(服务端基类) public static abstract class Stub extends android.os.Binder implements IStudentManager { // 将Binder对象转换为AIDL接口 public static IStudentManager asInterface(android.os.IBinder obj) { ... // 如果是同一进程则直接返回,否则返回Proxy } // 代理类(客户端使用) private static class Proxy implements IStudentManager { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override public java.util.List<Student> getStudents() throws RemoteException { ... // 通过mRemote.transact()发送数据 } } ... // onTransact()用于服务端接收并处理请求 } } ``` ### 3. 使用步骤 #### 服务端实现 1. 创建AIDL文件(如`IStudentManager.aidl`)。 2. 实现`Stub`: ```java public class StudentService extends Service { private final IStudentManager.Stub binder = new IStudentManager.Stub() { @Override public List<Student> getStudents() { return ...; // 实际逻辑 } }; @Override public IBinder onBind(Intent intent) { return binder; } } ``` #### 客户端调用 1. 绑定服务: ```java bindService(new Intent(this, StudentService.class), conn, Context.BIND_AUTO_CREATE); ``` 2. 在`ServiceConnection`中获取接口: ```java private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IStudentManager manager = IStudentManager.Stub.asInterface(service); try { List<Student> students = manager.getStudents(); } catch (RemoteException e) { ... } } ... }; ``` ### 4. 应用场景示例 - **跨进程数据共享**:如多个应用共享用户数据。 - **后台服务**:音乐播放器将播放控制服务运行在独立进程,通过AIDL提供播放接口。 - **插件化框架**:宿主应用通过AIDL与插件通信,实现组件的动态加载[^2]。 §§相关问题§§ 1. Binder通信中一次数据拷贝是如何实现的? 2. 如何优化AIDL接口的性能? 3. 在Android中,除了Binder还有哪些IPC方式?各自适用场景是什么? 4. 如何防止AIDL接口被恶意调用? </think>### AIDL与Binder详解 #### 一、Binder原理(核心IPC机制) 1. **架构分层** - **服务端接口**:实现具体业务逻辑(如`IStudentManager.Stub`) - **Binder驱动**:Linux内核模块,负责进程间数据路由和内存映射 - **客户端接口**:通过代理对象(`Proxy`)访问服务端[^5] $$ \text{客户端} \xrightarrow{\text{代理调用}} \text{Binder驱动} \xrightarrow{\text{路由}} \text{服务端} $$ 2. **关键技术** - 内存映射:仅**一次数据拷贝**(传统IPC需2次) - 线程池管理:默认16线程处理并发请求 - 身份标识:携带调用方UID/PID保障安全性 #### 二、AIDL工作原理(自动化Binder封装) 1. **编译生成代码** 定义`IStudentManager.aidl`后,系统自动生成: ```java public interface IStudentManager extends IInterface { // 服务端基类(需实现具体逻辑) abstract class Stub extends Binder implements IStudentManager { public static IStudentManager asInterface(IBinder obj) { // 判断是否同进程,否则返回Proxy } @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) { // 解包参数并调用服务端方法 } } // 客户端代理(自动处理跨进程调用) class Proxy implements IStudentManager { private IBinder mRemote; @Override public void addStudent(Student s) throws RemoteException { Parcel data = Parcel.obtain(); s.writeToParcel(data, 0); mRemote.transact(ADD_STUDENT_CODE, data, null, IBinder.FLAG_ONEWAY); } } } ``` [^1][^4] 2. **数据传递机制** - 基本类型:直接写入Parcel - 自定义对象:需实现`Parcelable`接口 - 异常传递:`RemoteException`自动捕获通信错误 #### 三、使用步骤 1. **定义AIDL接口** ```aidl // IStudentManager.aidl interface IStudentManager { void addStudent(in Student student); List<Student> getStudents(); } ``` 2. **服务端实现** ```java public class StudentService extends Service { private final IStudentManager.Stub binder = new IStudentManager.Stub() { @Override public void addStudent(Student student) { // 实际业务逻辑 } }; @Override public IBinder onBind(Intent intent) { return binder; // 返回Stub实例 } } ``` 3. **客户端绑定** ```java IStudentManager manager; ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { manager = IStudentManager.Stub.asInterface(service); // 获取Proxy } }; bindService(intent, conn, BIND_AUTO_CREATE); ``` #### 四、应用场景 1. **系统服务** - ActivityManager、WindowManager等核心服务均基于Binder 2. **多进程应用** - 独立进程运行后台服务(如音乐播放、推送) 3. **插件化框架** - 宿主与插件通信(如加载插件Activity)[^2] 4. **高性能IPC** - 需要频繁跨进程调用的场景(如游戏引擎) > 关键优势:相比Socket/管道,Binder延迟降低40%,吞吐量提升5倍[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lin_AIOS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值