android - AIDL生成的Service的句柄是什么?
问题描述
我们知道android系统服务在设备启动时注册到系统管理器。例如:
AlarmManagerService alarm = new AlarmManagerService(context);
ServiceManager.addService(Context.ALARM_SERVICE, alarm);
上面的代码在
/frameworks/base/services/java/com/android/server/SystemServer.java
所以,如果你想使用AlarmManager,你只需要获取AlarmManagerService的代理调用一个函数,然后AlarmManagerProxy调用BinderProxy中对应的方法来执行即可。
重要的是,BinderProxy.java 或 BpBinder.cpp 有正确的 Binder 句柄---AlarmManagerService。
但是当谈到 AIDL 时,例如:
interface IDCSCore {
int add(int i,int j);
void show();
}
当我们在另一个进程中绑定远程服务时,onBind方法会返回一个Binder——IDCSCore.Stub的实现,然后在ServiceConnect的onServiceBinded回调中得到IDCSCore.Stub.Proxy。Android System Service,如AlarmManagerSerice,注册在servicemanger中,可以adb shell service list
在系统管理器中找到所有系统服务,但是找不到IDCSCore相关信息。IDCSCore.Stub 在哪里?没有句柄的代理如何正确执行函数调用?
我烦了!对我来说有点复杂...
解决方案
AOSP 系统服务和Android 服务都有不同的实现和工作方式。您不能绑定到 AOSP 系统服务。为了获取代理存根,AOSP 已经提供了getSystemService()
API。ServiceManager 拥有系统服务的所有代理存根。
要列出所有活动服务,可以使用以下命令。
adb shell dumpsys activity services
什么是 IDCSCore?
要获取有关 AOSP 系统服务和 Android 服务的更多详细信息,请参阅此链接, AOSP 系统服务与服务差异
推荐阅读
- python - 检查一个excel文件中的文本字符串是否包含在另一个excel文件中
- r - 计算所有可能的交叉点
- php - 单击提交按钮后弹出成功消息
- python - 为什么 FirstPersonCameraController {camera: camera } 不能与 QML ApplicationWindow 一起使用?
- dataframe - 将 Pyspark DataFrame 与 sql 类似按条件分区
- python - Python:如何找到两个值之间的相关性并消除噪声?
- javascript - 如何从提交的按钮帖子上的 Javascript 返回和访问对象?
- javascript - 如何修复“no-param-reassign”eslint 错误?
- java - 从JSON字符串android中提取数据
- php - 如何获取 @dns_get_record 函数返回 false 的原因