Kivy是如何做到跨平台兼容的?

How does Kivy achieve cross-platform compatibility?

是什么让 Kivy 能够跨平台兼容?

换句话说,同一个Kivy源代码如何在桌面、iOS、Android等多种硬件平台上生成应用程序?

我认为实现 cross-platform 兼容性有两个关键的极端:

  1. 通过在每个平台上以不同的方式实现事物,以便 Kivy 在每个平台上使用 运行 不同的代码,但通过使输出看起来相同来向用户隐藏这种差异。
  2. 通过使用所有不同平台都支持的外部 APIs,这样 Kivy 自己的代码基本上是相同的,平台自己负责让它工作。

Kivy 两者都有一点,但特别是所有绘图都使用第二种类型的 OpenGL ES 2:Kivy 的所有绘图逻辑在所有支持的平台上几乎相同。当然还有其他类型,例如在计算像素密度等显示指标时,Kivy 在每个平台上使用不同的方法,但不会向用户公开任何细节。

当然,当从整体上考虑时,事情要微妙得多。例如,Kivy 使用 SDL2 作为库来创建 window,设置它的 size/pos 处理 pause/resume 等,所以 Kivy 的代码在这里是第二种类型,因为它调用了 SDL2在每个平台上的方式。但是,SDL2 本身不是 platform-native,而是第一种类型,在不同平台上以不同方式实现其 API,但在每个平台上向 Kivy 公开相同的 API。