AIDL生成的服务的处理方式是什么?

时间:2018-12-11 16:33:59

标签: android android-source aidl android-binder

我们知道,设备启动时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在哪里?没有句柄的代理如何正确执行函数调用?

我很沮丧!对我来说有点老套...

1 个答案:

答案 0 :(得分:0)

AOSP系统服务 Android服务具有不同的实现方式和不同的工作方式。您不能绑定到AOSP系统服务。为了获得代理存根,AOSP已经提供了getSystemService() API。 ServiceManager拥有系统服务的所有代理存根。

要列出所有活动服务,可以使用以下命令。

adb shell dumpsys activity services

什么是IDCSCore?

要获取有关AOSP系统服务和Android服务的更多详细信息,请参考此链接, AOSP System Service vs Service Differences