【发布时间】:2015-09-08 04:25:42
【问题描述】:
我一直在阅读我能找到的所有内容,试图找出 Android 的 BINDER IPC 机制背后的软件架构。据我了解,BINDER 位于内核空间中,并临时为用户空间应用程序分配共享内存,通过该内存可以在进程之间中继消息。
我开始失去控制的是实际实施的工作方式 - 特别是与 parcels 相关。
我在网上查找并找到了 Android 提供的任意服务的实现,例如 Network/Wifi/Notificaiton/Battery 等 (Docs)。从我的阅读中,我了解到用户空间程序不应该实例化服务类本身,而是通过Context.getSystemService(Context.X) 获取对服务类的引用。因此,我认为这是一种间接的方式,即 Android已经服务在运行,或者至少有资源在需要时启动它。实现基本上是这样的:
电池类
BatteryManager.setBatteryState(){
Parcel parcelLocal = Parcel.obtain();
parcelLocal.writeInterfaceToken("android.power.BatteryManager");
parcelLocal.writeInt(1/0); //Depending on requested state
BinderObject.transact //Send the data using BINDER
CheckForExceptions(); //Upon return, check for exceptions
ReadResponse(); //If none, read the response from the target
DoAppropriateAction(); //Whatever we need to do after setting the state
parcelLocal.recycle(); //Return the parcel resource
}
起初看起来很简单:当用户执行以下操作时:
BatteryMonitor bMonitor = Context.getSystemService(Context.POWER_SERVICE);
bMonitor.setBatteryStatus(1);
那么user's实例会使用BINDER机制与system's实际的服务控制器进行通信(哪个是同一个类的实例?)。但是,上面显示的代码IS是系统电池监控服务的实现,那么究竟是谁在接收 BINDER 数据呢?
TL;DR:如果这一切都非常混乱,很可能是因为我试图将一千行代码压缩成 10 行,总结是:当用户打算控制硬件状态 - 例如网络/Wifi/位置/通知(触摸屏) - 实际上 在 Android 中发生了什么,谁 真的 > 控制与这些抽象服务相关的硬件?
注意:以上代码完全是虚构的,仅用于显示一般结构。
【问题讨论】:
标签: android kernel android-service hardware android-binder