本篇主要是一些疑问归纳,不做具体的函数分析,但是会给出关键点,查看源码就会很清楚了
apt source PackageKit
1. org.freedesktop.PackageKit D-Bus 接口介绍
D-Bus API Reference: PackageKit Reference Manual c++库的接口可以看源码。
2. packageKit-qt 是什么?
packageKit-qt 是封装好的packagekit的c代码,可以理解为封装好的api接口,在 PackageKit-Qt 的代码中,可能会一些实现细节,并且直接提供了高级接口来与 PackageKit 交互,而不需要直接操作插件加载过程。通常,你会看到一些高级的 API 或类来处理 PackageKit 操作,而不会直接涉及插件加载的细节。
3. packageKit-qt是怎么调用的packageKit c的接口呢?
PackageKit-Qt 是 PackageKit 的 Qt 接口库,允许 Qt 应用程序通过 PackageKit 与软件包管理系统进行交互。PackageKit-Qt 提供了一组 Qt 类和函数,用于执行软件包管理操作,如安装、更新和删除软件包。
PackageKit-Qt 与 PackageKit 之间的交互通常是通过 D-Bus(Desktop Bus)实现的。D-Bus 是 Linux 系统上常用的进程间通信机制,它允许不同的进程之间进行通信和交互。
以下是 PackageKit-Qt 与 PackageKit 之间交互的一般步骤:
- PackageKit-Qt API 调用:
应用程序使用 PackageKit-Qt 提供的 API 调用执行软件包管理操作,比如安装、更新或删除软件包。
- D-Bus 通信:
PackageKit-Qt 将这些操作转换为 D-Bus 消息,并通过 D-Bus 与 PackageKit 进行通信。D-Bus 消息包括操作的类型、要执行的软件包名称、以及其他必要的参数。
- PackageKit 处理请求:
PackageKit 接收到来自 PackageKit-Qt 的 D-Bus 消息后,根据消息中的内容执行相应的软件包管理操作。这可能涉及调用底层的软件包管理工具,比如 apt、dnf 或 zypper。
- 操作结果返回:
PackageKit 执行完软件包管理操作后,将结果返回给 PackageKit-Qt,通常通过 D-Bus 消息的方式。结果包括操作是否成功、错误信息等。
- 应用程序处理结果:
PackageKit-Qt 接收到来自 PackageKit 的操作结果后,将结果传递给应用程序。应用程序可以根据结果来更新界面、向用户显示消息或者执行其他逻辑。
通过这种方式,PackageKit-Qt 充当了应用程序与 PackageKit 之间的桥梁,使得应用程序可以方便地利用 PackageKit 来执行软件包管理操作,并获取操作的结果。
4. PackageKit 如何区分的不同平台,和不同平台的包管理器进行交互?
pk-backend.c 读取配置文件DefaultBackend字段(配置文件内容的写入在pk-direct.c文件的 main中), 进行后台的加载。
etc/PackageKit/PackageKit.conf
gboolean pk_backend_load (PkBackend *backend, GError **error)
关键文件和函数
5. PackageKit怎么获取apt的包信息?
从 AptCacheFile中 获取包的信息
6. PackageKit怎么设置的不同包的分类?
从 apt-cache (AptCacheFile)中 获取包的信息和文件来源,之后过滤,根据源的关键字段,判断是哪种源,从而确定是哪种包。
for (const PkgInfo &pkgInfo : output) {
if (m_cancel)
break;
// the default update info
state = PK_INFO_ENUM_NORMAL;
// let find what kind of upgrade this is
pkgCache::VerFileIterator vf = pkgInfo.ver.FileList();
std::string origin = vf.File().Origin() == NULL ? "" : vf.File().Origin();
std::string archive = vf.File().Archive() == NULL ? "" : vf.File().Archive();
std::string label = vf.File().Label() == NULL ? "" : vf.File().Label();
if (origin.compare("Debian") == 0 ||
origin.compare("Ubuntu") == 0) {
if (ends_with(archive, "-security") ||
label.compare("Debian-Security") == 0) {
state = PK_INFO_ENUM_SECURITY;
} else if (ends_with(archive, "-backports")) {
state = PK_INFO_ENUM_ENHANCEMENT;
} else if (ends_with(archive, "-updates")) {
state = PK_INFO_ENUM_BUGFIX;
}
} else if (origin.compare("Backports.org archive") == 0 ||
ends_with(origin, "-backports")) {
state = PK_INFO_ENUM_ENHANCEMENT;
}
stagePackageForEmit(pkgArray, pkgInfo.ver, PK_INFO_ENUM_UNKNOWN, state);
}