首页 > 解决方案 > 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 在哪里?没有句柄的代理如何正确执行函数调用?

我烦了!对我来说有点复杂...

标签: androidandroid-sourceaidlandroid-binder

解决方案


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

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

adb shell dumpsys activity services

什么是 IDCSCore?

要获取有关 AOSP 系统服务和 Android 服务的更多详细信息,请参阅此链接, AOSP 系统服务与服务差异


推荐阅读