Android Binder机制深度解析

需积分: 10 3 下载量 28 浏览量 更新于2024-07-15 收藏 1.67MB PDF 举报
"Android Binder机制是Android系统中用于进程间通信的关键组件,它允许不同进程间的对象和数据安全高效地交换。Binder驱动作为内核层面的支持,以字符设备的形式存在于/dev/binder节点下,实现数据在客户端和服务端之间的传递。在Android的实现中,Binder通信涉及两个核心的C++类:ProcessState和IPCThreadState。 1. Android Binder概述 Binder是Android特有的进程间通信(IPC)机制,它允许服务和应用之间跨越进程边界进行通信。由于每个进程都有独立的用户空间,进程间通信必须通过共享的内核空间来完成。Binder驱动扮演了这一角色,它在用户空间的进程和内核之间建立桥梁,使得数据能够在客户端和服务端之间有效传输。 2. Binder通信流程 典型的Binder通信流程包括以下步骤: - 服务端(Server)打开/dev/binder设备节点,并开始监听设备是否有新数据。 - 客户端(Client)同样打开设备节点,并向其中写入数据。 - 当数据写入后,内核驱动唤醒服务端,将数据从用户空间复制到内核空间,然后传递给服务端。 - 服务端接收数据,解析并执行相应操作。 3. ProcessState与IPCThreadState - ProcessState类提供了与Binder驱动交互的接口。`ProcessState::self()`方法用于打开/dev/binder设备,无论是服务器还是客户端都需要调用。`ProcessState::startThreadPool()`则由服务端调用,用于启动一个线程池,这些线程会持续监听设备节点,等待新的通信请求。 - IPCThreadState类则专注于通过ioctl命令与/dev/binder设备进行交互,它实现了具体的通信细节,如发送请求、接收响应等。 4. 类结构与功能 尽管ProcessState和IPCThreadState在功能上有所重叠,但它们分别封装了服务器和客户端所需的不同操作。在编译时,根据进程类型(服务端或客户端),这两个类会被包含在相应的进程中,提供相应的功能。 总结起来,Android Binder机制通过内核驱动和特定的用户空间库实现了高效、安全的进程间通信。ProcessState和IPCThreadState是这一机制的核心组成部分,它们协同工作以确保数据在Android系统的各个进程之间正确流动。了解和掌握Binder的工作原理对于深入理解Android系统及其服务架构至关重要。"

com.miui.frameworks.servicestests (1 Test) [1/1] com.android.server.location.gnss.hal.Gpo4ClientTest#init: FAILED (141ms) STACKTRACE: java.lang.SecurityException: uid 10289 does not have android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION. at android.os.Parcel.createExceptionOrNull(Parcel.java:3011) at android.os.Parcel.createException(Parcel.java:2995) at android.os.Parcel.readException(Parcel.java:2978) at android.os.Parcel.readException(Parcel.java:2920) at android.location.ILocationManager$Stub$Proxy.registerLocationListener(ILocationManager.java:1291) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1551) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1234) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1199) at com.android.server.location.gnss.hal.Gpo4Client.registerPassiveLocationUpdates(Gpo4Client.java:198) at com.android.server.location.gnss.hal.Gpo4Client.init(Gpo4Client.java:78) at com.android.server.location.gnss.hal.Gpo4ClientTest.init(Gpo4ClientTest.java:209) ... 8 trimmed Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.location.LocationPermissions.enforceLocationPermission(LocationPermissions.java:116) at com.android.server.location.LocationManagerService.registerLocationListener(LocationManagerService.java:786) at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:582) at android.os.Binder.execTransactInternal(Binder.java:1285) at android.os.Binder.execTransact(Binder.java:1249)

2023-06-01 上传

[19:49:14][ERROR]<airtest.core.api> Traceback (most recent call last): File "airtest\core\android\adb.py", line 374, in shell File "airtest\core\android\adb.py", line 332, in raw_shell File "airtest\core\android\adb.py", line 197, in cmd airtest.core.error.AdbError: stdout[b''] stderr[b'java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission\r\n\tat android.os.Parcel.createException(Parcel.java:2074)\r\n\tat android.os.Parcel.readException(Parcel.java:2042)\r\n\tat android.os.Parcel.readException(Parcel.java:1990)\r\n\tat android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:991)\r\n\tat android.hardware.input.InputManager.injectInputEvent(InputManager.java:886)\r\n\tat com.android.commands.input.Input.injectMotionEvent(Input.java:428)\r\n\tat com.android.commands.input.Input.access$200(Input.java:41)\r\n\tat com.android.commands.input.Input$InputTap.sendTap(Input.java:224)\r\n\tat com.android.commands.input.Input$InputTap.run(Input.java:218)\r\n\tat com.android.commands.input.Input.onRun(Input.java:108)\r\n\tat com.android.internal.os.BaseCommand.run(BaseCommand.java:56)\r\n\tat com.android.commands.input.Input.main(Input.java:71)\r\n\tat com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)\r\n\tat com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)\r\nCaused by: android.os.RemoteException: Remote stack trace:\r\n\tat com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:754)\r\n\tat com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:728)\r\n\tat android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:451)\r\n\tat android.os.Binder.execTransactInternal(Binder.java:1021)\r\n\tat android.os.Binder.execTransact(Binder.java:994)\r\n\r\n'] During handling of the above exception, another exception occurred:

2023-07-25 上传