dbus interface xml 文件的用途是什么?

what is the purpose of dbus interface xml file?

我正在阅读D-Bus API Design Guidelines:

Interface files for public API should be installed to $(datadir)/dbus-1/interfaces so that other services can load them.

OK...为了了解这些接口文件是如何工作的,我打开文件/usr/share/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml(我使用的是Ubuntu 20.04)

<node>
  <interface name="org.gnome.Shell.Screenshot">
  ...
    <method name="PickColor">
      <arg type="a{sv}" direction="out" name="result"/>
    </method>

好吧,我看到了接口名称,我看到了方法名称,但这还不够。如果我想使用 dbus-send

调用此方法
$ dbus-send --print-reply --dest=<service.name> </path/to/object> org.gnome.Shell.Screenshot.PickColor

我需要 <service.name><path/to/object>,此 xml 文件没有提供。

问题是:如果这个文件没有提供有关服务接口的完整信息,它的用途是什么?它被 dbus-daemon 或任何其他程序使用吗?真的需要这样的文件吗?我是否应该得出一个 xml 文件不完整的结论,该文件不提供 object in 的路径?此类文件是否还应提及服务已知名称(在本例中为 org.gnome.Shell.Screenshot)?

org.freedesktop.DBus.Introspectable接口有一个方法:

      org.freedesktop.DBus.Introspectable.Introspect (out STRING xml_data)
    

对象实例可以实现 Introspect 其中 returns 对象的 XML 描述。自省格式记录在: https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format

在命令行上使用 busctl 我可以使用 list 获取所有服务,tree 获取所有对象,然后 intropspect 查找API。使用这三个命令,我可以发现系统

上的 D-Bus 服务
$ busctl list
$ busctl tree <service>
$ busctl introspect <service> <object>

您在问题中提到的服务在 Session/User 公交车上,所以它是:

$ busctl --user list | grep Screenshot
NAME                                          PID PROCESS         USER       CONNECTION    UNIT              SESSION DESCRIPTION
---------------------------------------------------------------------------------------------------------------------------------
org.gnome.Screenshot                            - -               -          (activatable) -                 -       -          
org.gnome.Shell.Screenshot                   1259 gnome-shell     LinuxMachine1 :1.37         user@1000.service -       -          

$ busctl --user tree org.gnome.Shell.Screenshot
├─/StatusNotifierWatcher
└─/org
  ├─/org/freedesktop
  │ ├─/org/freedesktop/Notifications
  │ └─/org/freedesktop/portal
  │   └─/org/freedesktop/portal/desktop
  ├─/org/gnome
  │ ├─/org/gnome/Mutter
  │ │ ├─/org/gnome/Mutter/DisplayConfig
  │ │ └─/org/gnome/Mutter/IdleMonitor
  │ │   └─/org/gnome/Mutter/IdleMonitor/Core
  │ ├─/org/gnome/ScreenSaver
  │ ├─/org/gnome/SessionManager
  │ │ └─/org/gnome/SessionManager/EndSessionDialog
  │ ├─/org/gnome/Shell
  │ │ ├─/org/gnome/Shell/AudioDeviceSelection
  │ │ ├─/org/gnome/Shell/Introspect
  │ │ ├─/org/gnome/Shell/Screencast
  │ │ ├─/org/gnome/Shell/Screenshot
  │ │ └─/org/gnome/Shell/Wacom
  │ └─/org/gnome/keyring
  │   └─/org/gnome/keyring/Prompter
  └─/org/gtk
    ├─/org/gtk/MountOperationHandler
    └─/org/gtk/Notifications

$ busctl --user introspect org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot
NAME                                TYPE      SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface -         -            -
.Introspect                         method    -         s            -
org.freedesktop.DBus.Peer           interface -         -            -
.GetMachineId                       method    -         s            -
.Ping                               method    -         -            -
org.freedesktop.DBus.Properties     interface -         -            -
.Get                                method    ss        v            -
.GetAll                             method    s         a{sv}        -
.Set                                method    ssv       -            -
.PropertiesChanged                  signal    sa{sv}as  -            -
org.gnome.Shell.Screenshot          interface -         -            -
.FlashArea                          method    iiii      -            -
.PickColor                          method    -         a{sv}        -
.Screenshot                         method    bbs       bs           -
.ScreenshotArea                     method    iiiibs    bs           -
.ScreenshotWindow                   method    bbbs      bs           -
.SelectArea                         method    -         iiii         -

为了完整起见,运行 与您执行的命令相同:

$ busctl --user call org.gnome.Shell.Screenshot /org/gnome/Shell/Screenshot org.gnome.Shell.Screenshot PickColor
a{sv} 1 "color" (ddd) 1 1 1

答案就在名字里:它是一个D-Bus接口文件。它定义了一个 接口 ,而不是该接口的实例。 D-Bus 中可能有零个或多个接口实例化,它们可能是动态的。所以它们的路径不能在 XML 文件中指定。

如果 D-Bus 是现在设计的,也许这个 XML 文件的结构或实现会有所不同。但这就是事实。