我们知道,设备启动时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系统服务(例如AlarmManagerSerice)已在servicemanger中注册,您可以使用adb shell service list
在系统管理器中查找所有系统服务,但找不到IDCSCore相关信息。 IDCSCore.Stub在哪里?没有句柄的代理如何正确执行函数调用?
我很沮丧!对我来说有点老套...
答案 0 :(得分:0)
AOSP系统服务和 Android服务具有不同的实现方式和不同的工作方式。您不能绑定到AOSP系统服务。为了获得代理存根,AOSP已经提供了getSystemService()
API。 ServiceManager拥有系统服务的所有代理存根。
要列出所有活动服务,可以使用以下命令。
adb shell dumpsys activity services
什么是IDCSCore?
要获取有关AOSP系统服务和Android服务的更多详细信息,请参考此链接, AOSP System Service vs Service Differences